Android中多點觸控以及手勢的基礎知識

現在一般的android手機都會使用電容觸摸屏,所以基本上都會支持多點觸控,同樣在android系統中應用程序可以使用多點觸控的事件來完成各種手勢和場景需求,下面簡單講一下如何使用多點觸控:

1、相關接口和事件介紹

MotionEvent.getAction() 

對於單點觸控,我們由MotionEvent.getAction()就可以得到以下幾種事件:ACTION_DOWN、ACTION_UP等

MotionEvent.ACTION_MASK

而對於多點觸控,我們需要由MotionEvent.getAction() &MotionEvent.ACTION_MASK一起得到:ACTION_POINTER_DOWN、ACTION_POINTER_UP等

單點和多點兩者共用的:ACTION_MOVE等,所以需要區分當前是單點還是多點才能正確的處理。

這些得到的值都是MotionEvent中的常量,可以直接調用。

另外還有很多輔助接口:

event.getPointerCount() 獲取當前觸控點的數量

event.getPointerId(i) 獲取指定觸控點的Id,用於區分不同的觸控點

event.getX(i) 獲取指定觸控點的X坐標

event.getY(i) 獲取指定觸控點的Y坐標

event.getPressure(i) 獲取指定觸控點的壓力值,此值的獲取需要LCD硬件和驅動的支持

2、常用手勢的處理——雙指伸縮

雙指伸縮手勢常用於圖片、文本、網頁等的放大和縮小,在實際中的使用非常頻繁,下面就簡單講一下具體的原理:

如果當前沒有別的手勢幹擾,我們隻需檢測兩指按下時各自的位置、兩點的距離以及兩指移動之後的各自位置、亮點的距離關系即可,如果移動後距離變大,則是放大動作;反之則是縮小動作。

首先要計算兩指按下時的距離:

得到移動之前兩指按下的點之間的距離,具體原理相信學過勾股定理的同學同應該知道,由點1的x減去點2的x可以得到一條直角邊的長度,正負不重要,因為在下面的計算時會計算平方而得到正值長度,然後由點1的y減去點2的y可以得到另外一條直角邊的長度,這樣由兩條直角邊可以用勾股定理得出斜邊的長度,即兩點之間的直線距離。

   private float spacing(MotionEvent event)
   { 
       float x = event.getX(0)-event.getY(1); 
       float y = event.getY(0)-event.getY(1); 
       return (float)Math.sqrt(x*x+y*y); 
   }

在此同時還需要計算出兩指的中點位置,以作為縮放的中心基準點,這個計算方法就更簡單瞭,由點1的x加上點2的x然後除以2,得到中點的x坐標,由點1的y加上點2的y然後除以2,得到中點的y坐標,最後得到中點的坐標位置:

    private void midPoint(PointF point, MotionEvent event)
    { 
         float x = event.getX(0) + event.getX(1); 
         float y = event.getY(0) + event.getY(1); 
         point.set(x / 2, y / 2); 
    }

然後在ACTION_MOVE的事件處理中得到移動後的亮點之間的直線距離,計算方法同上,如果移動後的距離大於按下時的距離則是放大動作,否則是縮小動作,具體放大和縮小的比例由:新距離/移動前的距離,得到比例系數,然後就可以使用相關接口和操作進行具體的放大或縮小處理,常用的縮放方式:

使用Martix的postscale(橫向縮放比例,縱向縮放比例,中點的x,中點的y),一般需要先獲取圖片或者控件等的martix,然後調用postscale將參數傳遞進去,得到新的縮放後的martix,最後再設置回去,刷新之後即可生效,看到縮放後的效果。

發佈留言