如下是几个实现了 OnTouchListener 接口的子类,OnTouchListener 我们是再熟悉不过了,在 Hello World 开始就接触了,但在 Support V4 中还有它的 3 个子类我们平时可能使用的较少但就其功能而言还是对我们很有帮助的。
三者的功能体现在 AutoScrollHelper 和 ZoomButtonsController,前者用于实现控件的自动滚动而后者用于对缩放控件(缩小放大按钮)的处理。
为了更好阐述它的功能,我们先来看如下的 Gif 图:
所以,他能完成的功能就是在 View 的边缘长按时能自动地滚动视图。下面是它的主要方法说明:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
| AutoScrollHelper(View target) public abstract boolean canTargetScrollHorizontally (int direction) public abstract boolean canTargetScrollVertically (int direction) public abstract void scrollTargetBy (int deltaX, int deltaY) public AutoScrollHelper setActivationDelay (int delayMillis) public AutoScrollHelper setEdgeType (int type) public AutoScrollHelper setExclusive (boolean exclusive) public AutoScrollHelper setRampUpDuration (int durationMillis) public AutoScrollHelper setRampDownDuration (int durationMillis)
|
使用:
1 2 3
| AutoScrollHelper autoScrollHelper = new ListViewAutoScrollHelper(listView); listView.setOnTouchListener(autoScrollHelper); autoScrollHelper.setEnabled(true);
|
ListViewAutoScrollHelper 的效果图如上,Google 帮我们实现了在 ListView 上的实现,ListViewAutoScrollHelper 也只能用于 ListView,在其它可滚动视图上又怎么办呢?很明显,继承实现 AutoScrollHelper,下面就来在 RecyclerView 和 ScrollView 上实现 RecyclerViewAutoScrollHelper 和 ScrollViewAutoScrollHelper,得益于 RecyclerView 能干很多事,这也就基本涵盖了滚动视图了。
RecyclerView 要实现 AutoScrollHelper,只需要写 3 行代码就够了,支持水平和垂直的方向上的操作,相比 ListViewAutoScrollHelper 的实现简单许多。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class RecyclerViewAutoScrollHelper extends AutoScrollHelper { protected RecyclerView mTarget; public RecyclerViewAutoScrollHelper(RecyclerView target) { super(target); this.mTarget = target; } @Override public void scrollTargetBy(int deltaX, int deltaY) { mTarget.scrollBy(deltaX, deltaY); } @Override public boolean canTargetScrollHorizontally(int direction) { return mTarget.getLayoutManager().canScrollHorizontally(); } @Override public boolean canTargetScrollVertically(int direction) { return mTarget.getLayoutManager().canScrollVertically(); } }
|
效果如下:
ScrollView 的也很简单,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public class ScrollViewAutoScrollHelper extends AutoScrollHelper { protected ScrollView mTarger; public ScrollViewAutoScrollHelper(ScrollView target) { super(target); this.mTarger = target; } @Override public void scrollTargetBy(int deltaX, int deltaY) { mTarger.smoothScrollBy(deltaX, deltaY); } @Override public boolean canTargetScrollHorizontally(int direction) { return mTarger.canScrollHorizontally(direction); } @Override public boolean canTargetScrollVertically(int direction) { return mTarger.canScrollVertically(direction); } }
|
此外,HorizontalScrollView
的实现也是类似就不贴了。
使用方式也很简单,其相关 API 可以 戳这里。在构造方法中传进一个 View,然后缩放控件就依附绑定在此 View 当中,然后在 OnZoomListener 回调函数中处理放大和缩小事件。需要注意的是在生命周期结束时需要把它注销掉 zoomButtonsController.setVisible(false)
,否则会发生 ANR、内存泄露。效果如下:
End
源码传送门:touchlistener-subclasses