[英]How to programatically move a horizontal scroll view half way in android?
在我的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);
正如DeeV所指出的:
如果您的HorizontalScrollView在一個Activity內,請使用它來確保視圖已准備好進行滾動:
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
// do scrolling here
}
如果您的HorizontalScrollView在Fragment內,請實現一個回調以將“視圖就緒”事件傳遞給Fragment,或者使用此代碼進行循環直到發生這種情況:
@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滾動范圍是從0到其內部視圖的寬度減去HorizontalScrollView的寬度)。 這意味着使用carousel.getWidth()/ 2會將屏幕的左邊緣滾動到視圖的中心。 因此,如果要滾動到視圖的中心,則應改用以下方法:
hsv.scrollTo((carousel.getWidth() - hsv.getWidth()) / 2, 0);
我認為您遇到的主要問題是視圖尚未膨脹並且還沒有任何大小,因此您的“ scrollTo”始終為0。首先,您需要等待ScrollView及其內容膨脹。 接下來的事情是您不能使用ScrollView的寬度,因為它是屏幕的大小。 您需要使用未綁定子項的(旋轉木馬)(或者,您可以使用getMaxScrollAmount()
)。
最簡單的方法是向其發布Runnable,如下所示:
private class ScrollToCenter implements Runnable {
@Override
public void run() {
hsv.scrollTo(carousel.getWidth()/2, 0);
}
}
hsv.post(new ScrollToCenter());
在執行之前,發布到視圖將等到該視圖可見。 如果該視圖已經可見,那么它將幾乎立即執行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.