Android 手势监听器运用

Android对于用户手势的监听大部分上是通过onTouchEvent方法来实现的,可以说ontouchEvent能处理所有安卓能处理的手势问题,但相对而言较为复杂。Android为广大的开发者提供了一个更为简单的类GestureDetector 在此类中封装了单击、双击、长按、手指滑动和Fling等(不知道该怎么翻译)。至于用法也非常简单如以下代码所示:

private GestureDetector detector=new GestureDetector(context, new MyOnGestureListener());

class MyOnGestureListener extends SimpleOnGestureListener {
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            Log.i(getClass().getName(),
                    "onSingleTapUp-----" + getActionName(e.getAction()));
            return false;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            Log.i(getClass().getName(),
                    "onLongPress-----" + getActionName(e.getAction()));
        }

        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2,
                float distanceX, float distanceY) {
            Log.i(getClass().getName(),
                    "onScroll-----" + getActionName(e2.getAction()) + ",("
                            + e1.getX() + "," + e1.getY() + ") ,(" + e2.getX()
                            + "," + e2.getY() + ")");
            return false;
        }

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                float velocityY) {
            Log.i(getClass().getName(),
                    "onFling-----" + getActionName(e2.getAction()) + ",("
                            + e1.getX() + "," + e1.getY() + ") ,(" + e2.getX()
                            + "," + e2.getY() + ")");
            return false;
        }

        @Override
        public void onShowPress(MotionEvent e) {
            Log.i(getClass().getName(),
                    "onShowPress-----" + getActionName(e.getAction()));
        }

        @Override
        public boolean onDown(MotionEvent e) {
            Log.i(getClass().getName(),
                    "onDown-----" + getActionName(e.getAction()));
            return false;
        }

        @Override
        public boolean onDoubleTap(MotionEvent e) {
            Log.i(getClass().getName(),
                    "onDoubleTap-----" + getActionName(e.getAction()));
            return false;
        }

        @Override
        public boolean onDoubleTapEvent(MotionEvent e) {
            Log.i(getClass().getName(), "onDoubleTapEvent-----"
                    + getActionName(e.getAction()));
            return false;
        }

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {
            Log.i(getClass().getName(), "onSingleTapConfirmed-----"
                    + getActionName(e.getAction()));
            return false;
        }
}
   //如果要为一个控件添加监听时,只需重写onTouch方法即可
   @Override
    public boolean onTouchEvent(MotionEvent event) {
        detector.onTouchEvent(event);
        return true;
    }

注:
在onTouchEvent (MotionEvent event)方法中不能写成return detector.onTouchEvent();

onSingleTapUp 在第一次点击事件up时(长按不会触发)触发,但在双击时也会触发
onSingleTapConfirmed 在第一次点击事件的down时(长按不会)触发,但在双击时不会触发。所以用这个方法设置单击监听比较靠谱

onDoubleTap 双击时触发比onDoubleTapEvent先触发,触发时接收到的事件是down第二次点击的时候触发。
onDoubleTapEvent 双击触发,会触发多次能接收到down、move和up,第二次点击时触发

down 用户只要有触摸动作就会触发

onShowPress 需要用户点击后手指在屏幕上停留一段事件(很短),正常的用户点击、滑动等有可能触发也有可能不触发,在触发onLongPress之前一定会触发此事件,再触发此事件之后还能在触发其他事件,接收事件为down

onLongPress 长按事件,接收到的也是down,如果触发了此事件,那在此之前一定会触发onShowPress 
onScroll 用户手指在屏幕上滑动时会触发此事件。(但如果用户手指先停留过长触发了onLongPress将不会再接收此事件)此事件能被多次触发,接收事件为move

onFling 用户快速滑动并抬起时会触发此事件,onFling一般伴随着onScroll,并且发生在onScroll结束之后,但并不是所有的         onScroll事件之后都会触发此事件,只会触发一次

构造GestureDetector 传入的第二个参数也可以传入 OnGestureListener的实现类(在不需要处理双击事件的情况下)那么将会少
onSingleTapConfirmed, onDoubleTap, onDoubleTapEvent三个方法。此三个方法来自于GestureDetector中的内部接口 OnDoubleTapListener但不能单独通过此接口来构造GestureDetector 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值