在我的Android应用程序中,我构建了一个水平滚动视图并添加内容并将其添加到DOM。我怎么能(使用java)将滚动条移动到它的中间点?
感谢。
此代码不起作用
Context context = carousel_container.getContext();
HorizontalScrollView hsv = new HorizontalScrollView(context);
LinearLayout carousel = new LinearLayout(context);
setGallery(carousel);
addFishes();
hsv.addView(carousel, new HorizontalScrollView.LayoutParams(HorizontalScrollView.LayoutParams.WRAP_CONTENT, HorizontalScrollView.LayoutParams.WRAP_CONTENT));
carousel_container.addView(hsv, new HorizontalScrollView.LayoutParams(HorizontalScrollView.LayoutParams.MATCH_PARENT, HorizontalScrollView.LayoutParams.WRAP_CONTENT));
hsv.postDelayed(new Runnable(){
@Override
public void run() {
int offsetX = hsv.getWidth()/2;
//int offsetX = hsv.getMaxScrollAmount()/2;
hsv.scrollTo(offsetX, 0);
}
}, 10000);
答案 0 :(得分:3)
正如DeeV已经指出的那样:
如果您的HorizontalScrollView位于Activity内,请使用此方法确保视图已准备好滚动:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
// do scrolling here
}
如果您的HorizontalScrollView位于片段内,请实现回调以将" views-are-ready" -event传递给片段,或使用此代码循环直到发生:
@Override
public void onResume() {
super.onResume();
final Handler mainThreadHandler = new Handler(Looper.getMainLooper());
mainThreadHandler.post(new Runnable() {
@Override
public void run() {
if (hsv.getWidth() > 0) {
// do scrolling here
} else {
mainThreadHandler.post(this);
}
}
});
}
现在滚动本身。其他人建议使用hsv.scrollTo(carousel.getWidth()/ 2,0),但这不会做你想要的。 scrollTo(...)的第一个参数是内部视图当前可见左边缘的x坐标(即HorizontalScrollView x-scroll的范围从0到它的内部视图的宽度减去HorizontalScrollView的宽度)。这意味着使用carousel.getWidth()/ 2会将屏幕的左边缘滚动到视图的中心。因此,如果要滚动到视图的中心,则应使用此选项:
hsv.scrollTo((carousel.getWidth() - hsv.getWidth()) / 2, 0);
答案 1 :(得分:2)
我认为您遇到的主要问题是您的观看次数没有膨胀,而且没有任何尺寸,所以您的" scrollTo"始终是0.首先,您需要等到ScrollView及其内容被夸大。接下来就是你不能使用ScrollView的宽度,因为它是屏幕的大小。你需要使用未绑定的(carousel)孩子(或者你可以使用getMaxScrollAmount()
)。
最简单的方法是将Runnable发布到它:
private class ScrollToCenter implements Runnable {
@Override
public void run() {
hsv.scrollTo(carousel.getWidth()/2, 0);
}
}
hsv.post(new ScrollToCenter());
发布到视图将等待视图可见,然后再执行。如果视图已经可见,那么它将立即执行几乎。