? ? ? ?public void setOnTouchListener(View.OnTouchListener l)
? ? ? ?該方法的工作方式與setOnClickListener(View.OnClickListener)相同。我們實(shí)現(xiàn)View.OnTouchListener接口,供觸摸事件發(fā)生時(shí)調(diào)用。
? ? ? ?不過(guò),我們的定制視圖是View的子類,因此可走捷徑直接覆蓋以下View方法:
? ? ? ?public boolean onTouchEvent(MotionEvent event)
? ? ? ?該方法接收一個(gè)MotionEvent類實(shí)例,MotionEvent類可用來(lái)描述包括位置和動(dòng)作的觸摸事件。動(dòng)作用于描述事件所處的階段。
? ? ? ?在onTouchEvent(...)實(shí)現(xiàn)方法中,可使用以下MotionEvent方法查看動(dòng)作值:
? ? ? ?public final int getAction()
? ? ? ?在BoxDrawingView.java中,添加一個(gè)日志tag,然后實(shí)現(xiàn)onTouchEvent(...)方法記錄可能發(fā)生的四個(gè)不同動(dòng)作,如下代碼所示。
? ? ? ?實(shí)現(xiàn)BoxDrawingView視圖類(BoxDrawingView.java)
? ? ? ?public class BoxDrawingView extends View {
? ? ? ?private static final String TAG = "BoxDrawingView";
? ? ? ?...
? ? ? ?@Override
? ? ? ?public boolean onTouchEvent(MotionEvent event) {
? ? ? ?PointF current = new PointF(event.getX(), event.getY());
? ? ? ?String action = "";
? ? ? ?switch (event.getAction()) {
? ? ? ?case MotionEvent.ACTION_DOWN:
? ? ? ?action = "ACTION_DOWN";
? ? ? ?break;
? ? ? ?case MotionEvent.ACTION_MOVE:
? ? ? ?action = "ACTION_MOVE";
? ? ? ?break;
? ? ? ?case MotionEvent.ACTION_UP:
? ? ? ?action = "ACTION_UP";
? ? ? ?break;
? ? ? ?case MotionEvent.ACTION_CANCEL:
? ? ? ?action = "ACTION_CANCEL";
? ? ? ?break;
? ? ? ?}
? ? ? ?Log.i(TAG, action + " at x=" + current.x +
? ? ? ?", y=" + current.y);
? ? ? ?return true;
? ? ? ?}
? ? ? ?}?
? ? ? ?注意,X和Y坐標(biāo)已經(jīng)封裝到PointF對(duì)象中。稍后,我們需要同時(shí)傳遞這兩個(gè)坐標(biāo)值。而Android提供的PointF容器類剛好滿足了這一需求。
? ? ? ?運(yùn)行DragAndDraw應(yīng)用并打開(kāi)LogCat視圖窗口。觸摸屏幕并移動(dòng)手指,查看BoxDrawingView接收的觸摸動(dòng)作的X和Y坐標(biāo)記錄。
? ? ? ?以上就是百恒網(wǎng)絡(luò)為大家介紹的關(guān)于觸摸事件的處理方法,希望能夠幫到大家!