Android開發08_OnTouchevent觸控事件(手勢監聽)
阿新 • • 發佈:2019-02-09
一、前言
Android開發中會遇到很多事件監聽事件,例如我們常見的普通控制元件的OnClickListener監聽事件、高階控制元件(ListView、GridView)的OnItemClickListener監聽事件、CheckBox的OnCheckedChangeListener、還有SeekBar的OnSeekBarChangeListener等等。
除此之外我們常常看到一些觸控事件,例如側滑選單或者ViewPager的實現,那麼這些監聽是如何實現的呢?
實際上以上所說的觸控事件就是我們常常聽到的手勢監聽,程式碼中實現手勢監聽分兩種,一種是重寫onTouchEvent方法來實現全域性的手勢監聽,另一種是通過實現OnTOuchListener介面重寫onTouch方法實現某一控制元件的手勢監聽。
二、重寫onTouchEvent方法來實現全域性的手勢監聽
onTouchEvent方法中有一個形參為MotionEvent物件,此物件中的action屬性可監聽到使用者觸控手機螢幕的整個過程:按下、移動、鬆開,通過對action屬性的區分可實現我們各種監聽需求。
/** * # 1 OnTouch:針對整個佈局 */ @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //按下 break; case MotionEvent.ACTION_MOVE: //移動 break; case MotionEvent.ACTION_UP: //鬆開 break; } return super.onTouchEvent(event); }
三、實現OnTouchListener介面重寫onTouch方法實現某一控制元件的手勢監聽
相比直接重寫方法,通過實現OnTOuchListener介面重寫onTouch方法來實現某一控制元件的手勢監聽更加容易理解,其用法類似於我們的OnClickListener事件,重寫的onTouch方法有兩個形參,一個是View,一個是MotionEvent。
btn01.setOnTouchListener(this);
View所代表的就是新增監聽的物件,當多個View設定監聽時,可通過此view.getId區分開來。
MotionEvent代表含義和方式一重寫onTouchEvent中引數含義一致,用來區分:按下、移動、鬆開等動作。
四、舉例:實現拖動按鈕效果
1、給需要拖動的按鈕設定OnTouchLinstener監聽 2、在按下的時候記錄按下的X、Y位置 3、在移動過程中,將X、Y被移動的位移新增在之前記錄的位置,得到最新X、Y應該到達的位置 4、將移動過程中按鈕的位置賦值為最新得到的X、Y,就可實現按鈕的拖動了int lastX = 0, lastY = 0; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: Log.e("TAL", "觸控到我了!ACTION_DOWN"); lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; case MotionEvent.ACTION_MOVE: Log.e("TAL", "觸控到我了ACTION_MOVE"); Log.e("TAL", "ACTION_MOVE_X:" + event.getRawX()); Log.e("TAL", "ACTION_MOVE_Y:" + event.getRawY()); int moveX = (int) (event.getRawX() - lastX); int moveY = (int) (event.getRawY() - lastY); int l, t, r, b; int kuan = btn01.getRight() - btn01.getLeft(); int gao = btn01.getBottom() - btn01.getTop(); l = btn01.getLeft() + moveX; t = btn01.getTop() + moveY; r = btn01.getRight() + moveX; b = btn01.getBottom() + moveY; if (l < 0) { l = 0; r = kuan; } if (t < 0) { t = 0; b = gao; } if (r > wAll) { r = wAll; l = wAll - kuan; } if (b > hAll) { b = hAll; t = hAll - gao; } btn01.layout(l, t, r, b); lastX = (int) event.getRawX(); lastY = (int) event.getRawY(); break; case MotionEvent.ACTION_UP: Log.e("TAL", "觸控到我了!ACTION_UP"); break; } return false; }