22

我有一个HorizontalScrollView包含一个RelativeLayout. 此布局在 XML 中是空的,并且从 onCreate 中的 java 填充。

我希望这个滚动视图最初位于 中间的某个位置RelativeLayout,它比屏幕大得多。

我试过mHorizScrollView.scrollTo(offsetX, 0);哪个不起作用。我不知道这有什么问题。

我可以发布代码,但它并不真正相关。重要的是一切都以编程方式完成(必须:s),并且HorizontalScrollView必须以编程方式设置的初始位置。

谢谢阅读。请告诉我您是否需要更多详细信息,或者这是否不够清楚。

4

9 回答 9

28

我发现如果你extendHorizontalScrollView覆盖onLayout,你可以干净地滚动,在超级调用之后onLayout

MyScrollView extends HorizontalScrollView {
    protected void onLayout (boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        this.scrollTo(wherever, 0);
    }
}

编辑: 要滚动开始结束,您可以使用:

this.fullScroll(HorizontalScrollView.FOCUS_RIGHT/FOCUS_LEFT);

代替

this.scrollTo(wherever, 0);
于 2012-02-29T22:55:14.217 回答
27
public void autoSmoothScroll() {

        final HorizontalScrollView hsv = (HorizontalScrollView) view.findViewById(R.id.horiscroll);
        hsv.postDelayed(new Runnable() {
            @Override
            public void run() {
                //hsv.fullScroll(HorizontalScrollView.FOCUS_RIGHT);
                hsv.smoothScrollBy(500, 0);
            }
        },100);
    }
于 2013-06-20T21:13:20.020 回答
16

为了测试它是否是一个时间问题(我认为是),而不是在onStart中调用scrollTo(),而是使用调用scrollTo的Runnable调用postDelayed(),延迟为30左右。

于 2011-01-26T01:33:34.600 回答
9

更好的方法是使用ViewTreeObserver来观察布局。

View interestedInView;
onCreate(){
  //Code

  //Observe for a layout change
  ViewTreeObserver viewTreeObserver = interestedInView.getViewTreeObserver();
  if (viewTreeObserver.isAlive()) {
    viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
      @Override
      public void onGlobalLayout() {
        //REMOVE THE VIEWTREE OBSERVER
        //interestedInView is ready for size and position queries because it has been laid out
      }
    });
  }
}
于 2011-08-15T03:48:38.733 回答
1

问题是视图还没有大小。执行此操作的干净方法是实现 ScrollView 的 onSizeChanged 以向活动中的处理程序发送消息,以通知活动视图具有大小并且可以滚动。

于 2011-05-10T20:37:44.220 回答
1

使用 view.post 并在 run 方法中编写 scrollTo(x,y) 。这是根据 android API 文档在 post 方法中使视图无效的方法。

于 2011-05-25T04:31:32.587 回答
0

scrollTo 功能应该可以工作。HSV 的 layout_width 是多少,里面的视图是多少?

于 2011-01-25T23:28:17.860 回答
0

onSizeChanged 函数应该可以工作。您无法理解的是 onSizeChanged 应该向您的活动的处理程序发送消息,而不是任何回调函数,因为处理程序将在 UI 线程中执行代码。您不能在它之外进行 UI 操作。看看处理程序。

于 2011-05-13T06:06:03.177 回答
0

使用 Kotlin 扩展功能。

inline fun <T : View> T.afterMeasured(crossinline f: T.() -> Unit) {
viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
    override fun onGlobalLayout() {
        if (measuredWidth > 0 && measuredHeight > 0) {
            viewTreeObserver.removeOnGlobalLayoutListener(this)
            f()
        }
    }
})

}

用法:

mHorizontalScrollView.afterMeasured {
        var scrollTo = 0
        val count = (layout.svList.getChildAt(0) as LinearLayout)
            .childCount

        if(index < count){
            val child = (layout.svList.getChildAt(0) as LinearLayout)
                .getChildAt(index)

            scrollTo = child.width

        }

        Log.d(TAG, "scrollToComment: $scrollTo")

        mHorizontalScrollView.scrollTo(scrollTo, 0)
    }
于 2021-06-10T07:27:04.443 回答