如何设置ScrollView的起始位置?

时间:2014-03-10 17:34:16

标签: android android-scrollview

我一直在尝试设置滚动视图的初始位置,但还没找到方法。有没有人有任何想法?此外,我还有一个GoogleMaps片段作为滚动视图的子项。

谢谢,

瑞安

6 个答案:

答案 0 :(得分:18)

是的,这是可能的:

ScrollView.scrollTo(int x, int y);
ScrollView.smoothScrollTo(int x, int y);
ScrollView.smoothScrollBy(int x, int y);

可用于此。 x和y参数是在水平和垂直轴上滚动的坐标。

代码示例:

    @Override   
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.your_layout);

        ScrollView sv = (ScrollView) findViewById(R.id.scrollView);
        sv.scrollTo(0, 100);
     }

在该示例中,启动Activity后,您的ScrollView将向下滚动100个像素。

您还可以尝试延迟滚动过程:

final ScrollView sv = (ScrollView) findViewById(R.id.scrollView);

Handler h = new Handler();

h.postDelayed(new Runnable() {

    @Override
    public void run() {
        sv.scrollTo(0, 100);            
    }
}, 250); // 250 ms delay

答案 1 :(得分:4)

接受的答案对我不起作用。没有直接的方法来设置滚动视图的初始位置。

但是,您可以在绘制滚动视图之前设置初始位置,如下所示:

rootView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
    @Override
    public boolean onPreDraw() {
        scrollView.getViewTreeObserver().removeOnPreDrawListener(this);
        scrollView.setScrollY(100);
        return false;
    }
});

您也可以在scrollView.setScrollY(100)内使用Handler,但在滚动时会出现抖动。

答案 2 :(得分:1)

经过几个小时的互联网搜索

这项工作对我来说:

ScrollView.post(new Runnable() {
@Override
public void run() {
//setting position here :
        ScrollView.scrollTo(X, Y);
    } 
});

答案 3 :(得分:0)

Scrollview sw = (ScrollView) findViewById(R.id.scrollView);
sw.post(new Runnable() {
     public void run() {
           sw.smoothScrollTo(0, 5000);
     }
});

答案 4 :(得分:0)

这些答案都不适合我。我的ScrollView是周围LinearLayout的一部分。我将ScrollView的调整放入此onDraw()的{​​{1}}方法中,如下所示:

LinearLayout

非常难看,但正在工作。

答案 5 :(得分:0)

问题在于ScrollView在布局之前不知道其大小。一种解决方案是保存滚动位置,直到调用 onLayout 为止,然后设置滚动位置。

这是一个例子(kotlin):

class MyScrollView constructor(context: Context, attrs: AttributeSet) : ScrollView(context, attrs) {

    private var hasStartPositionBeenSet = false
    var startPosition = 0

    override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
        super.onLayout(changed, l, t, r, b)

        if(!hasStartPositionBeenSet) {
             scrollTo(0, startPosition)
             hasStartPositionBeenSet = true
        }
    }
}

class MyActivity: Activity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        /* ... */
        findViewById<MyScrollView>(R.id.scrollView).startPosition = scrollPosition
    }
}