Android - 使Horizo​​ntalScrollView中的滚动条可单击

时间:2012-02-13 12:30:42

标签: android android-layout

我在我的一个布局中使用了HorizontalScrollView,并通过覆盖相应的xml属性来替换滚动条轨道和滑块,以便轨道代表HorizontalScrollView中视图的缩略图拇指指示当前位置。

到目前为止这个工作正常,我可以在视图中滚动。但是,我不能使用滚动条,即轨道和拇指滚动,我只能通过整个视图顶部的flings滚动。滚动条顶部的每次点击/拖动都可以简单地解释为HorizontalScrollView中其他位置的点击/拖动。换句话说,我不能拖动拇指从而改变位置,也不能通过单击滚动条轨道上的某个位置跳到某个位置。

这是我的布局:

<HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:scrollbarFadeDuration="0"
android:scrollbarThumbHorizontal="@drawable/highlight_box"
android:scrollbarTrackHorizontal="@drawable/tumbnail_chain" >

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="horizontal" >

       ...couple of FrameLayouts

    </LinearLayout>

</HorizontalScrollView>

不幸的是我找不到任何解决这个问题的方法

编辑:
我刚刚发现滚动条不应该在Android中以这种方式工作,请参阅 here

有没有人有想法,我如何实现上述所需的行为?无需代码,只需提出建议!

编辑2(解决方法):
对那些对我的解决方案感兴趣的人:我在相同大小的滚动条顶部放置一个透明的虚拟视图,并为此视图设置OnTouchListener。在侦听器的onTouch方法中,我然后计算触摸事件相对于轨迹栏的相对位置,然后通过{{1}跳转到HorizontalScrollView内的相同相对位置方法:

scrollTo

其中mScrollBarWidth是滚动条的宽度(主要是屏幕宽度),mScrollViewWidth是public boolean onTouch (View v, MotionEvent event) { int x = Math.round((event.getX() / mScrollbarWidth) * mScrollViewWidth); mScrollView.scrollTo(x, 0); return true; } 的宽度。由于在触摸虚拟视图期间连续调用此方法,您不仅可以跳到触摸的位置,还可以在滚动条上拖动拇指。

2 个答案:

答案 0 :(得分:1)

我认为Horizo​​ntalScrollView上的触摸事件正被任何父视图或布局拦截。在java文件中创建Horizo​​ntalScrollView的对象并在其上调用以下代码 -

 view.getParent().requestDisallowInterceptTouchEvent(true); //view being the object of scrollview

这可能有用。

答案 1 :(得分:1)

我有一个类似的情况,一个大文件要显示(我的情况下的音乐符号),并希望使用拖动滚动条(除了正常拖动和投掷),以便用户可以随机访问文档的任何部分很容易没有滚动时间。

我认为另一个简单的解决方案是查看onScroll和onFling中的触摸位置,如果检测到你在滚动条上,请执行手动滚动。我的滚动条设置为永不褪色对我来说很容易。