这是个人原创文章,原文地址:zhengxiaopeng.com/2015/04/26/Android-View-OnTouchListener-的子类html
以下是几个实现了 OnTouchListener 接口的子类,OnTouchListener 咱们是再熟悉不过了,在 Hello World 开始就接触了,但在 Support V4 中还有它的 3 个子类咱们平时可能使用的较少但就其功能而言仍是对咱们颇有帮助的。android
三者的功能体如今 AutoScrollHelper 和 ZoomButtonsController,前者用于实现控件的自动滚动然后者用于对缩放控件(缩小放大按钮)的处理。git
为了更好阐述它的功能,咱们先来看以下的 Gif 图:

因此,他能完成的功能就是在 View 的边缘长按时能自动地滚动视图。下面是它的主要方法说明:github
Java// 构造方法,不用说了 AutoScrollHelper(View target) /* 3个子类必须实现的抽象方法 */ // 判断 View 可否在水平方向上滚动 public abstract boolean canTargetScrollHorizontally (int direction) // 判断 View 可否在垂直方向上滚动 public abstract boolean canTargetScrollVertically (int direction) // 最重要的方法,控制 View 的滚动实现,参数分别表示在水平和垂直方向上滚动的像素值 public abstract void scrollTargetBy (int deltaX, int deltaY) /* 以下是一些基本的属性配置方法 */ // 长按边缘后开始滚动的的延迟时间 public AutoScrollHelper setActivationDelay (int delayMillis) // 边缘触发类型,有3种:EDGE_TYPE_INSIDE: 在自身 View 内边缘区域才会触发滚动,(手指)移动到 View 外的区域时即中止滚动; // EDGE_TYPE_INSIDE_EXTEND:在自身 View 内边缘区域才会触发滚动,但手指移动到 View 外时仍会滚动; // EDGE_TYPE_OUTSIDE:在自身 View 外边缘处才有触发滚动,手指向内移动到 View 内则会中止。 public AutoScrollHelper setEdgeType (int type) // 是否消耗掉触摸事件 public AutoScrollHelper setExclusive (boolean exclusive) // 开始滚动后到达预约速度的时间 public AutoScrollHelper setRampUpDuration (int durationMillis) // 开始中止滚动时,速度减为 0 的时间 public AutoScrollHelper setRampDownDuration (int durationMillis) // 还有诸如:触摸边缘的距离范围、滚动速度等方法,比较好理解,不一一列举了。
使用:ide
JavaAutoScrollHelper 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 的实现简单许多。this
Javapublic 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); // 1 行 } @Override public boolean canTargetScrollHorizontally(int direction) { return mTarget.getLayoutManager().canScrollHorizontally(); // 2 行 } @Override public boolean canTargetScrollVertically(int direction) { return mTarget.getLayoutManager().canScrollVertically(); // 3 行 } }
效果以下:
code
ScrollView 的也很简单,以下:htm
Javapublic 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
的实现也是相似就不贴了。blog
使用方式也很简单,其相关 API 能够 戳这里。在构造方法中传进一个 View,而后缩放控件就依附绑定在此 View 当中,而后在 OnZoomListener 回调函数中处理放大和缩小事件。须要注意的是在生命周期结束时须要把它注销掉 zoomButtonsController.setVisible(false)
,不然会发生 ANR、内存泄露。效果以下:

源码传送门:touchlistener-subclasses