簡體   English   中英

如何在Android中以編程方式將水平滾動視圖移動一半?

[英]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所指出的:

  1. 必須首先繪制布局。 只有這樣,視圖的寬度才會大於0。
  2. 您不能使用Horizo​​ntalScrollViews寬度滾動到中心。 使用內部視圖的寬度(在您的情況下:輪播)。

如果您的Horizo​​ntalScrollView在一個Activity內,請使用它來確保視圖已准備好進行滾動:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    // do scrolling here
}

如果您的Horizo​​ntalScrollView在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坐標(即,Horizo​​ntalScrollView的x滾動范圍是從0到其內部視圖的寬度減去Horizo​​ntalScrollView的寬度)。 這意味着使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM