這是個人原創文章,原文地址:zhengxiaopeng.com/2015/04/26/Android-View-OnTouchListener-的子類html
以下是幾個實現了 OnTouchListener 接口的子類,OnTouchListener 咱們是再熟悉不過了,在 Hello World 開始就接觸了,但在 Support V4 中還有它的 3 個子類咱們平時可能使用的較少但就其功能而言仍是對咱們頗有幫助的。android
三者的功能體如今 AutoScrollHelper 和 ZoomButtonsController,前者用於實現控件的自動滾動然後者用於對縮放控件(縮小放大按鈕)的處理。git
爲了更好闡述它的功能,咱們先來看以下的 Gif 圖:
![ListViewAutoScrollHelper](http://rocko-blog.qiniudn.com/Android View.OnTouchListener 的子類_1.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 行 } }
效果以下:
![RecyclerViewAutoScrollHelper](http://rocko-blog.qiniudn.com/Android View.OnTouchListener 的子類_2.gif)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、內存泄露。效果以下:
![ZoomButtonsController](http://rocko-blog.qiniudn.com/Android View.OnTouchListener 的子類_3.gif)
源碼傳送門:touchlistener-subclasses