如何以编程方式滚动Horizo​​ntalScrollView

时间:2011-01-25 23:23:43

标签: android horizontal-scrolling horizontalscrollview

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

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

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

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

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

9 个答案:

答案 0 :(得分:26)

我发现,如果您extend HorizontalScrollView并覆盖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);

答案 1 :(得分:24)

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);
    }

答案 2 :(得分:16)

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

答案 3 :(得分: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
      }
    });
  }
}

答案 4 :(得分:1)

问题是视图还没有大小。 Clean的方法是实现ScrollView的onSizeChanged,以便向活动中的Handler发送消息,以便通知活动视图具有大小并且可以滚动。

答案 5 :(得分:1)

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

答案 6 :(得分:0)

scrollTo函数应该可以工作。什么是HSV的layout_width,以及它内部的视图?

答案 7 :(得分:0)

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

答案 8 :(得分: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)
    }