兩指縮放
要實現觸碰事件,需要在 元件 加上 setOnTouchListener( lisntener ) 方法。
首先要實現 OnTouchListener 方法,然後重寫方法。
public boolean onTouch(View v, MotionEvent event)
在這個方法中我們就可以獲得兩指縮放功能的全部份訊息。
View v 是觸發事件的來源。
MotionEvent event 是一個觸碰事件
我們對螢幕的所有操作都會觸發事,如 點擊、放開、滑動 等。
不同的事件在 MotionEvent 中有不同的 id,我們可以根據 event.getAction() & MotionEvent.ACTION_MASK 的結果來判斷是何種事件
MotionEvent.ACTION_DOWN:第一個點被按下時觸發。
MotionEvent.ACTION_UP:當螢幕上唯一個點被放開時觸發。
MotionEvent.ACTION_POINTER_DOWN:當螢幕上已經有一個點被按住時,再按下其他的點時觸發。
MotionEvent.ACTION_POINTER_UP:當螢幕上有多個點被按住時,其中一個點被放開時觸發 (非最後一個點,最後一個點觸發 ACTION_UP)。
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 + 特定值)