Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在android中通过编程将水平滚动视图移动一半?_Java_Android_Horizontal Scrolling_Horizontalscrollview - Fatal编程技术网

Java 如何在android中通过编程将水平滚动视图移动一半?

Java 如何在android中通过编程将水平滚动视图移动一半?,java,android,horizontal-scrolling,horizontalscrollview,Java,Android,Horizontal Scrolling,Horizontalscrollview,在我的android应用程序中,我构建了一个水平滚动视图,添加内容并将其添加到DOM中。如何使用java将滚动条移动到它的中间点 谢谢 这个代码不起作用 Context context = carousel_container.getContext(); HorizontalScrollView hsv = new HorizontalScrollView(context); LinearLayout carousel = new LinearL

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

我认为你面临的主要问题是你的视图没有膨胀,也没有任何大小,所以你的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());

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

我认为您面临的主要问题是您的视图没有膨胀,并且没有任何大小,因此您的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());

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

正如DeeV所指出的:

必须先绘制布局图。只有这样,视图的宽度才会大于0。 不能使用水平滚动视图宽度滚动到中心。在您的案例中使用内部视图的宽度:旋转木马。 如果您的HorizontalScrollView位于活动中,请使用此选项确保该视图已准备好进行滚动:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    // do scrolling here
}
如果您的HorizontalScrollView位于片段内,请实现回调以将views are ready事件传递给片段,或者使用以下代码,循环直到发生此情况:

@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.scrollTocarousel.getWidth/2,0是其他人建议的,但这不会满足您的要求。scrollTo的第一个参数。。。是内部视图当前可见左边缘的x坐标,即水平滚动视图x滚动范围从0到其内部视图的宽度减去水平滚动视图的宽度。这意味着使用carousel.getWidth/2会将屏幕的左边缘滚动到视图的中心。因此,如果要滚动到视图的中心,则应使用以下选项:

hsv.scrollTo((carousel.getWidth() - hsv.getWidth()) / 2, 0);

正如DeeV已经指出的那样:

必须先绘制布局图。只有这样,视图的宽度才会大于0。 不能使用水平滚动视图宽度滚动到中心。在您的案例中使用内部视图的宽度:旋转木马。 如果您的HorizontalScrollView位于活动中,请使用此选项确保该视图已准备好进行滚动:

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    // do scrolling here
}
如果您的HorizontalScrollView位于片段内,请实现回调以将views are ready事件传递给片段,或者使用以下代码,循环直到发生此情况:

@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.scrollTocarousel.getWidth/2,0是其他人建议的,但这不会满足您的要求。scrollTo的第一个参数。。。是内部视图当前可见左边缘的x坐标,即水平滚动视图x滚动范围从0到其内部视图的宽度减去水平滚动视图的宽度。这意味着使用carousel.getWidth/2会将屏幕的左边缘滚动到视图的中心。因此,如果要滚动到视图的中心,则应使用以下选项:

hsv.scrollTo((carousel.getWidth() - hsv.getWidth()) / 2, 0);

滚动视图是什么类型的布局?我将水平滚动视图添加到垂直线性布局中。您是否尝试过hsv.scrollTohsv.getMaxScrollAmount/2,0?当水平滚动视图布局时,您可能应该添加一个OnGlobalYoutListener来侦听。之后,您可以调用getWidth并执行hsv.scrollTohsv.getWidth/2;,但不是在此之前,因为在布局视图之前getWidth将返回0。我正在动态添加许多水平布局,不是同时添加,而是基于用户单击按钮的时间。ongloballayoutlistener是否每次我添加水平视图时都会运行?滚动视图是什么类型的布局?我将水平滚动视图添加到垂直线性布局中。是否尝试hsv.scrollTohsv.getMaxScrollAmount/2,0?当水平滚动视图布局时,您可能应该添加一个OnGlobalYoutListener来侦听。之后,您可以调用getWidth并执行hsv.scrollTohsv.getWidth/2;,但不是在此之前,因为在布局视图之前getWidth将返回0。我正在动态添加许多水平布局,不是同时添加,而是基于用户单击按钮的时间。每次我添加水平视图时是否都运行OnGlobalYoutListener?我可以通过吗
要为hsv和旋转木马视图运行的参数?您需要使用ScrollToCenter的构造函数来传递参数或使用getter/setter。我用您的代码更新了上面的帖子,但仍然不起作用。我甚至尝试了hsv.scrollTohsv.getChildAt0.getWidth/2,0;但它没有起作用。我刚刚为我的一个项目实施了解决方案,它确实起了作用,但你必须等到旋转木马填满。您的旋转木马可能未完全完成,因此其大小始终为0。您可以通过用postDelayed替换post并将延迟设置为5000毫秒来测试这一理论。另外,我使用了getMaxScrollAmount,它只滚动了ScrollView的宽度;不是它的内容。我可以传递参数来运行hsv和旋转木马视图吗?您需要使用ScrollToCenter的构造函数来传递参数或使用getter/setter。我用您的代码更新了上面的帖子,但仍然不起作用。我甚至尝试了hsv.scrollTohsv.getChildAt0.getWidth/2,0;但它没有起作用。我刚刚为我的一个项目实施了解决方案,它确实起了作用,但你必须等到旋转木马填满。您的旋转木马可能未完全完成,因此其大小始终为0。您可以通过用postDelayed替换post并将延迟设置为5000毫秒来测试这一理论。另外,我使用了getMaxScrollAmount,它只滚动了ScrollView的宽度;不是它的内容。