兩指縮放

要實現觸碰事件,需要在 元件 加上 setOnTouchListener( lisntener ) 方法。

首先要實現 OnTouchListener 方法,然後重寫方法。

public boolean onTouch(View v, MotionEvent event)

在這個方法中我們就可以獲得兩指縮放功能的全部份訊息。

View v 是觸發事件的來源。

MotionEvent event 是一個觸碰事件

我們對螢幕的所有操作都會觸發事,如 點擊、放開、滑動 等。

不同的事件在 MotionEvent 中有不同的 id,我們可以根據 event.getAction() & MotionEvent.ACTION_MASK 的結果來判斷是何種事件

  1. MotionEvent.ACTION_DOWN:第一個點被按下時觸發。

  2. MotionEvent.ACTION_UP:當螢幕上唯一個點被放開時觸發。

  3. MotionEvent.ACTION_POINTER_DOWN:當螢幕上已經有一個點被按住時,再按下其他的點時觸發。

  4. MotionEvent.ACTION_POINTER_UP:當螢幕上有多個點被按住時,其中一個點被放開時觸發 (非最後一個點,最後一個點觸發 ACTION_UP)。

  5. MotionEvent.ACTION_MOVE:當有觸碰點在螢幕上移動時觸發。( 基本上,由於它的靈敏度很高,而我們的手指又不可能完全靜止,因此只要手指停留在螢幕上,此事件就會一直不斷的被觸發)

當螢幕有兩個點的時候,可以使用以下的方法來獲得兩點之間的距離:

private float spacing(MotionEvent event){

float x = event.getX(0) - event.getX(1);

float y = event.getY(0) - event.getY(1);

return FloatMath.sqrt(x * y + x * y);

}

event.getX(index) 和 event.getY(index) 可以獲得指定的 index 點的坐標

由以上的觸發事件,就可以根據被觸發的不同事件來判斷當前螢幕上的點的個數

switch(event.getAction() & MotionEvent.ACTION_MASK){

case MotionEvent.ACTION_DOWN:

mode = 1;

break;

case MotionEvent.ACTION_UP:

mode = 0;

break;

case MotionEvent.ACTION_POINTER_UP:

mode -= 1;

break;

case MotionEvent.ACTION_POINTER_DOWN:

mode += 1;

break;

}

然後在 MotionEvnet.ACTION_MOVE 事件中,判斷點的個數,如果大於 2 ,就計算兩點間的距離,如果距離加大的話就縮大,如果距離減少的話就縮小。

case MotionEvent.ACTION_MOVE:

if(mode >= 2){

float newDist = spacing(event);

if(newDist > oldDist){

放大();

}

if(newDist < oldDist){

縮小

}

oldDist = new Dist;

}

break;

由於 ACTION_MOVE 會因顫抖一直被觸發,而每次觸發時兩點之間的距離也會有微小的變化,為了防止因顫阧所觸發的放大縮小,可以在 ACTION_MOVE 判斷當距離變化大於一定程度時,在觸發事件

if(newDist > oldDist + 特定值)