天天看點

Android實戰之手勢與多點觸控探究

一、提要

         最近在iPhone有一款應用非常火,較做Clear,這個是示範視訊:http://v.youku.com/v_show/id_XMzUyNjQ2NDk2.html

 實施上它的功能非常的簡單,類似一個ToDoList,但它将使用者體驗做到了極緻,其中一個最大的特點就是将手勢和多點觸控成功得融入到了應用之中。

         這篇文章要探究的就是在Android中的手勢和多點觸控的原理及實作。

二、最原始的單點拖拽和兩點縮放

原理:對于正常的控件觸控操作,在setOnTouchListener()接口中,實作 onTouchEvent()方法來處理。

效果:

代碼清單:

代碼解釋:MainActivity實作OnTouchLietener的接口,将ImageView的觸控 監聽器設定為this,在重載函數OnTouch中實作對觸控事件的處理。

這裡的圖像的位置和大小的變化都用到了矩陣運算,不太清楚的話可以先補充一下線性代數的知識。

拖拽的實作就是用矩陣記錄手指移動的距離;縮放的時候,首先要記錄兩隻手指最開始的距離,然後當手指移動的時候,實時計算出手指的距離,與之前的距離相除得到縮放的比例,然後用矩陣的scale方法存儲。

函數的最後調用 setImageMatrix()來實作對TextView的縮放或移動。

二、手勢識别

        上面的例子雖然實作了基本的觸控功能,而且低版本的系統也能很好的支援,但如果遇到了進階的觸控事件,比如輕按兩下,長按之類,實作起來就非常麻煩了!

         好在後續版本的api提供了更加棒的接口,我們可以很簡單地來實作想要的效果。

         這裡要用到的是Android給我們提供的手勢識别工具GestureDetector,需要2.2及以上的系統版本。

         下面的例子實作的效果是:單點拖拽,滑動切換imageView的内容,兩點縮放,輕按兩下圖像改變圖像顯示狀态。

代碼解釋:

這裡我定義了兩個GestrueListener,一個專門用于處理縮放的ScaleOnGestrueListener一個SimpleOnGestrueListener,當觸控的點數為2的時候調用前者來處理,一般常用的手勢用後者來處理。

原理和前面的差不多,隻是調用不同的接口和不同的方法來實作,但是更加友善也更加清晰.

三、一點後記

學習Andorid中的某個類的時候,其實最好的方法是去看官方的API,有時候網上雖然有現成的代碼給你,但實際運用的時候還是會有各種各樣的問題,很多文章大都有雷同,甚至代碼本身就有bug還往上粘,唉.....是以,最好還是自己踏踏實實研究。