一、前言
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中参数含义一致,用来区分:按下、移动、松开等动作。
四、举例:实现拖动按钮效果
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; }