Android开发08_OnTouchevent触摸事件(手势监听)
2016-12-24 18:02
507 查看
一、前言
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; }
相关文章推荐
- android开发步步为营之65:解决ScrollView和ListView触摸事件onInterceptTouchEvent相互冲突问题
- Android开发-自定义View-AndroidStudio(二十三)onTouchEvent触摸事件
- android开发步步为营之65:解决ScrollView和ListView触摸事件onInterceptTouchEvent相互冲突问题
- Android开发-自定义View-AndroidStudio(二十三)onTouchEvent触摸事件
- Android 触摸事件的分发与处理流程:onInterceptTouchEvent和onTouchEvent
- 【Android View】Android中View对触摸事件的处理和传递dispatchTouchEvent、onInterceptTouchEvent
- android触摸事件传递机制以及onInterceptTouchEvent()和onTouchEvent()总结
- Android_onDraw画圆与onTouchEvent方法处理触摸事件
- Android触摸事件onTouchEvent和onInterceptTouchEvent该返回什么?
- Android 屏幕触摸事件之诡----dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent,onTouch
- Android--用手指移动画面里的照片/onTouchEvent事件判断
- android的Touch事件onInterceptTouchEvent和onTouchEvent
- android事件传递机制以及onInterceptTouchEvent()和onTouchEven
- Android学习记录:MotionEvent,onTouch,OnTouchListener 事件机制等学习
- android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()总结
- android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()详解
- android触屏事件处理onInterceptTouchEvent的问题
- android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()详解二之小秘与领导的故事
- android事件传递机制以及onInterceptTouchEvent()和onTouchEvent()总结
- android事件传递机制以及onInterceptTouchEvent()和OnTouchEvent()详解三之ACTION_CANCEL事件和事件回传