zoukankan      html  css  js  c++  java
  • Android触碰事件

    OnTouchListener使用

    public class ViewActivity extends Activity implements View.OnTouchListener {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            super.onCreate(savedInstanceState);
            setContentView(R.layout.view_gestrue);
    
            LinearLayout ll_context = (LinearLayout) findViewById(R.id.ll_context);
            ll_context.setOnTouchListener(this);
    
        }
    
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            switch (event.getActionMasked()) {
                case MotionEvent.ACTION_DOWN:
                    Log.v("-->", "手指碰到屏幕");
                    break;
                case MotionEvent.ACTION_MOVE:
                    Log.v("-->", "手指在移动");
                    break;
                case MotionEvent.ACTION_OUTSIDE:
                    Log.v("-->", "手指离开view的边界");
                    break;
                case MotionEvent.ACTION_UP:
                    Log.v("-->", "手指离开屏幕");
                    break;
                case MotionEvent.ACTION_SCROLL:
                    Log.v("-->", "手指在滑动");
                    break;
                case MotionEvent.ACTION_POINTER_DOWN:
                    Log.v("-->", "非主手指碰到屏幕");
                    break;
                case MotionEvent.ACTION_POINTER_UP:
                    Log.v("-->", "非主手指离开屏幕");
                    break;
            }
            return true;//拦截事件
        }
    }

    Tip:MotionEvent经常用法

    event.getY();//触碰点获取距离v顶部的距离
    event.getRawY();//触碰点获取距离屏幕顶部的距离
    event.getPointerCount();//获取触碰手指的个数

    GestureDetector使用:

    //GestureDetector这个类对外提供了两个接口:OnGestureListener,OnDoubleTapListener,另一个内部类SimpleOnGestureListener。

    GestureDetector.OnGestureListener接口:用来通知普通的手势事件,该接口有例如以下六个回调函数:

    1.onDown(MotionEvent e):down事件;

    2.onSingleTapUp(MotionEvent e):一次点击up事件;在touch down后又没有滑动
    (onScroll),又没有长按(onLongPress),然后Touchup时触发。
    点击一下很快的(不滑动)Touchup:
    onDown->onSingleTapUp->onSingleTapConfirmed
    点击一下略微慢点的(不滑动)Touchup:
    onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed

    3.onShowPress(MotionEvent e):down事件发生而move或则up还没发生前触发该事件。Touch了还没有滑动时触发(与onDown。onLongPress)比較onDown仅仅要Touch down一定立马触发。

    而Touchdown后过一会没有滑动先触发onShowPress再是onLongPress。

    所以Touchdown后一直不滑动
    依照onDown->onShowPress->onLongPress这个顺序触发。

    4.onLongPress(MotionEvent e):长按事件。Touch了不移动一直Touch down时触发

    5.onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY):滑动手势事件。Touch了滑动一点距离后,在ACTION_UP时才会触发參数:e1 第1个ACTION_DOWN MotionEvent 而且仅仅有一个;e2 最后一个ACTION_MOVE MotionEvent ;velocityX X轴上的移动速度,像素/秒 。velocityY Y轴上的移动速度,像素/秒.触发条件:X轴的坐标位移大于FLING_MIN_DISTANCE,且移动速度大于FLING_MIN_VELOCITY个像素/秒

    6.onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY):在屏幕上拖动事件。

    不管是用手拖动view,或者是以抛的动作滚动,都会多次触发,这种方法在ACTION_MOVE动作发生时就会触发
    抛:手指触动屏幕后,略微滑动后马上松开

    GestureDetector.OnDoubleTapListener接口:用来通知DoubleTap事件,相似于鼠标的双击事件。

    1.onDoubleTap(MotionEvent e):在双击的第二下。Touch down时触发 。


    2.onDoubleTapEvent(MotionEvent e):通知DoubleTap手势中的事件。包括down、up和move事件(这里指的是在双击之间发生的事件,比如在同一个地方双击会产生DoubleTap手势,而在DoubleTap手势里面还会发生down和up事件,这两个事件由该函数通知)。双击的第二下Touch down和up都会触发,可用e.getAction()区分。
    3.onSingleTapConfirmed(MotionEvent e):用来判定该次点击是SingleTap而不是DoubleTap,假设连续点击两次就是DoubleTap手势。假设仅仅点击一次。系统等待一段时间后没有收到第二次点击则判定该次点击为SingleTap而不是DoubleTap,然后触发SingleTapConfirmed事件。

    这种方法不同于onSingleTapUp,他是在GestureDetector确信用户在第一次触摸屏幕后,没有紧跟着第二次触摸屏幕。也就是不是“双击”的时候触发

    tip:

    //distanceX。是前后两次call的X距离,不是e2与e1的水平距离; 是前后两次call的Y距离,不是e2与e1的垂直距离

    用法:

    1:继承GestureDetector.OnGestureListener
    2:实例化检測器GestureDetector mDetector = new GestureDetector(ViewActivity.this, this);
    3:在ontouch里面回调方法

    @Override
    public boolean onTouch(View v, MotionEvent event) {
      mDetector.onTouchEvent(event);
      return true;
    }

    參考链接:
    用户手势检測-GestureDetector使用具体解释
    android触控,先了解MotionEvent

  • 相关阅读:
    vue 仿IOS 滚轮选择器
    一道题目学ES6 API,合并对象id相同的两个数组对象
    Express中间件原理详解
    webpack原理与实战
    LS522 体积小低电压低成本的13.56MHz非接触式读写卡芯片,集成了在13.56MHz下所有类型的被动非接触式通信方式和协议,支持ISO14443A/B的多层应用( PIN对PIN MFRC522 )
    SP213EEA-L/TR +5V高性能RS232收发器
    多速率SDI集成接收器 SDI解码芯片 GS2971A-IBE3
    低电容3.3V TVS管 R CLAMP3304N.TCT
    高ESD耐压/TVS二极管 UCLAMP2804L.TCT
    高性能正电压稳压管SC4215HSETRT
  • 原文地址:https://www.cnblogs.com/claireyuancy/p/7016941.html
Copyright © 2011-2022 走看看