總網頁瀏覽量

2013年4月15日 星期一

android自訂View觸控事件筆記

一、原始狀況:

自訂繼承View的類別。
override onTouchEvent與onDraw

執行程式會先跑onDraw
碰觸螢幕會觸發onTouchEvent事件
(onTouchEvent 回傳super.onTouchEvent(event)



二、
將onTouchEvent的retrun super.onTouchEvent(event);
改為return true

執行程式碰觸View會一直觸發onTouchEvent事件
onTouchEvent事件分成三種動作(action)
可以藉由event.getAction();
得知目前使用者的onTouchEvent事件的action
分別為Action_Down、Action_Move、Action_Up
第一個例子onTouchEvent只會偵測到Action_Down
如果onTouchEvent改為return true
則可以偵測到Action_Down、Action_Move、Action_UP


三、加上GuestureDetector手勢偵查物件

宣告GuestureDetector物件並宣告SimpleOnGestureListener子類別,
override onDown 與Scroll 與Fling


private GestureDetector gd;
gd = new GestureDetector(context,MyListener());
//context是指activity要看view放在哪個activity,MyListener是傾聽者



private class MyListener extends SimpleOnGestureListener{
//宣告傾聽者 繼承自SimpleOnGestureListener

@Override
public boolean onDown(MotionEvent e) {
Log.i("Sing","onDown");

return super.onDown(e);
}

@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY) {
Log.i("Sing","onScroll");
return super.onScroll(e1, e2, distanceX, distanceY);
}
}

1.
將onTouchEvent傳回值
改成gd.onTouchEvent(event)
//GestureDetector偵測有沒有發生onTouchEvent事件

執行程式會執行onDraw
按下螢幕會執行onTouchEvent
緊接著執行onDown。
因為GestureDetector偵測到onTouchEvent觸發onDown

2.承上
將onDown的return super.onDown(e);改為return true;
再執行程式
按下螢幕(不滑動)會發現
程式會先onTouchEvent之後onDwon接著就是連續執行onToucheEvent
而沒有執行onDown

由此可知道
當onTouchEvent 的 action 為down時候
會觸發Listener 的ondown


如果手指在螢幕上滑動一段距離
會交錯著先觸發onTouchEvent之後觸發onScroll

onDraw → onTouchEvent→ onDown → onTouchEvent→ onScroll →onTouchEvent→ onScroll


3.若沒加上postInvalidate()是不會再呼叫onDraw的

沒有留言:

張貼留言