zoukankan      html  css  js  c++  java
  • Android 手势识别

    public class MyGesture extends SimpleOnGestureListener {
        private GestureDetector gd;
    
        // onGestureListener需要F和onTouchListener配合使用,实际上是onTouchListenerF监听到用户的
        // 触摸,他把他所有监听到的用户触摸通知"手势识别"类对象,手势识别类对象处理后触发对应的函数,例如onFling, onLongPress等等。
        public void test(MotionEvent ev) {
            gd.onTouchEvent(ev);
        }
    
        // GestureDetector默认是打开LongPress通知的,但是有个问题,长按后,手不离开屏幕且滑动,这个时候发现没有滑动事件。
        // 这个问题的解决办法是设置手势识别对象,禁止产生长按事件
        // gd.setIsLongpressEnabled(false);
        // 当然,没有禁用长按事件,滑动事件还是有效的,只是要确保触屏后马上滑动,不要等系统产生了长按。
    
        public final class GestureListener implements OnGestureListener {
    
            @Override
            public boolean onDown(MotionEvent e) {
                // 触摸屏按下时立刻触发
                return false;
            }
    
            @Override
            public void onShowPress(MotionEvent e) {
                // 短按,触摸屏按下后片刻后抬起,会触发这个手势,如果迅速抬起则不会;强调的是没有松开或者拖动的状态,由一个ACTION_DOWN触发
            }
    
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                // 抬起,手指离开触摸屏时触发(长按、滚动、滑动时,不会触发这个手势)
                return false;
            }
    
            @Override
            public boolean onScroll(MotionEvent e1, MotionEvent e2,
                    float distanceX, float distanceY) {
                // 用户按下触摸屏,并拖动,由1个 ACTION_DOWN, 多个ACTION_MOVE触发
                return false;
            }
    
            @Override
            public void onLongPress(MotionEvent e) {
                // 长按,触摸屏按下后既不抬起也不移动,由多个 ACTION_DOWN触发
            }
    
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                    float velocityY) {
                // 滑动,触摸屏按下后快速移动并抬起,会先触发滚动手势,跟着触发一个滑动手势
                // 参数解释:
                // e1:第1个ACTION_DOWN MotionEvent
                // e2:最后一个ACTION_MOVE MotionEvent
                // velocityX:X轴上的移动速度,像素/秒
                // velocityY:Y轴上的移动速度,像素/秒
                return false;
            }
        }
    
        public final class DoubleTapListener implements OnDoubleTapListener {
    
            @Override
            public boolean onSingleTapConfirmed(MotionEvent e) {
                // 单击确认,即很快的按下并抬起,但并不连续点击第二下
                return false;
            }
    
            @Override
            public boolean onDoubleTap(MotionEvent e) {
                // 双击,手指在触摸屏上迅速点击第二下时触发
                return false;
            }
    
            @Override
            public boolean onDoubleTapEvent(MotionEvent e) {
                // 双击事件发生的时候,按下和抬起各触发一次
                return false;
            }
    
            // 对于自定义View,使用手势识别有两处陷阱可能会浪费你的不少时间。
            // 1:View必须设置longClickable为true,否则手势识别无法正确工作,只会返回Down, Show, Long三种手势
            // 2:必须在View的onTouchListener中调用手势识别,而不能像Activity一样重载onTouchEvent,否则同样手势识别无法正确工作
            public class MyView extends View {
                private GestureDetector mGestureDetector;
    
                public MyView(Context context, AttributeSet attrs) {
                    super(context, attrs);
                    mGestureDetector = new GestureDetector(context, null);
                    setLongClickable(true);
                    this.setOnTouchListener(new OnTouchListener() {
                        public boolean onTouch(View v, MotionEvent event) {
                            return mGestureDetector.onTouchEvent(event);
                        }
                    });
                }
            }
        }
    }



  • 相关阅读:
    Android简介(8H)思维导图
    Android章节练习题及答案
    付费方式选择——选项菜单的创建和使用
    Android——选项菜单的实现
    思维导图——四级词汇2
    jquery:为动态加载的元素绑定事件
    tcp/ip协议详解
    Atom实用插件
    如何让textarea不可拖拽
    移动端网站中手机号唤起拨号界面
  • 原文地址:https://www.cnblogs.com/a284628487/p/3299773.html
Copyright © 2011-2022 走看看