1. 程式人生 > >Android開發08_OnTouchevent觸控事件(手勢監聽)

Android開發08_OnTouchevent觸控事件(手勢監聽)

一、前言

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;
}