如何以编程方式在Android中途移动水平滚动视图?

时间:2014-07-02 20:42:32

标签: java android horizontal-scrolling horizontalscrollview

在我的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);

2 个答案:

答案 0 :(得分:3)

正如DeeV已经指出的那样:

  1. 必须首先绘制布局。只有这样的意见'宽度将大于0.
  2. 您无法使用Horizo​​ntalScrollViews宽度滚动到中心。使用内部视图的宽度(在您的情况下:轮播)。
  3. 如果您的Horizo​​ntalScrollView位于Activity内,请使用此方法确保视图已准备好滚动:

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

    如果您的Horizo​​ntalScrollView位于片段内,请实现回调以将" 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坐标(即Horizo​​ntalScrollView x-scroll的范围从0到它的内部视图的宽度减去Horizo​​ntalScrollView的宽度)。这意味着使用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());

发布到视图将等待视图可见,然后再执行。如果视图已经可见,那么它将立即执行几乎