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






  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值