我一直在尝试设置滚动视图的初始位置,但还没找到方法。有没有人有任何想法?此外,我还有一个GoogleMaps片段作为滚动视图的子项。
谢谢,
瑞安答案 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
}
}