您的位置:首页 > 移动开发 > Android开发

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐