美文网首页
Android View体系

Android View体系

作者: 张旭的博客 | 来源:发表于2020-06-14 00:50 被阅读0次

    View的上下左右

    image

    1、getX\getY\getTop\getBottom\x\y\translationX\translationY

    image

    2、手指触摸时,相对屏幕的x,y坐标

    image

    View的宽高

    单位px

    image

    MotionEvent (手指触摸产生的事件)

    MotionEvent是手触摸屏幕后产生的一系列的事件,主要包括:点击、移动、离开等动作

    image

    VelocityTracker(手指在屏幕上的滑动速度)

    VelocityTraker用来获取手指滑动时的水平速度和垂直速度。

    计算水平和垂直滑动速度

    
    VelocityTracker velocityTracker;
    
    private void init(){
    
        velocityTracker = VelocityTracker.obtain();
    
    }
    
    @Override
    
    public boolean onTouchEvent(MotionEvent e) {
    
      velocityTracker.addMovement(e);
    
      switch (e.getAction()){
    
            cker.computeCurrentVelocity(1000);
    
              float xVelocity = velocityTracker.getXVelocity();
    
              float yVelocity = velocityTracker.getYVelocity();
    
              velocityTracker.clear();
    
              velocityTracker.recycle();
    
              break;
    
          default:break;
    
      }
    
      return true;
    
    

    通过VelocityTracker.clear重制回收内存

    GeastureDetecor手势检测

    手势检测用户检测用户的单击、长按、双击、滑动等行为。她通过GeatureDetector的onGestureListener和OnDoubleTapListener接口实现监听。

    :onGestureListener 描述
    onDown(MotionEvent e) 用户按下屏幕,由ACTION_DOWN触发
    nFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) e1:第1个ACTION_DOWN MotionEvent
    e2:最后一个ACTION_MOVE MotionEvent
    velocityX:X轴上的移动速度,像素/秒
    velocityY:Y轴上的移动速度,像素/秒
    onLongPress(MotionEvent e) 长按触摸屏,超过一定时长,就会触发这个事件
    触发顺序:
    onDown->onShowPress->onLongPress
    onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) 在屏幕上拖动事件。无论是用手拖动view,或者是以抛的动作滚动,都会多次触发,这个方法在ACTION_MOVE动作发生时就会触发
    滑屏:手指触动屏幕后,稍微滑动后立即松开
    onDown-----》onScroll----》onScroll----》onScroll----》………----->onFling
    拖动
    onDown------》onScroll----》onScroll------》onFiling
    nShowPress(MotionEvent e) 如果是按下的时间超过瞬间,而且在按下的时候没有松开或者是拖动的,那么onShowPress就会执行
    onSingleTapUp(MotionEvent e) 一次单独的轻击抬起操作,也就是轻击一下屏幕,立刻抬起来,才会有这个触发,当然,如果除了Down以外还有其它操作,那就不再算是Single操作了,所以也就不会触发这个事件
    触发顺序:
    点击一下非常快的(不滑动)Touchup:
    onDown->onSingleTapUp->onSingleTapConfirmed
    点击一下稍微慢点的(不滑动)Touchup:
    onDown->onShowPress->onSingleTapUp->onSingleTapConfirmed

    可见,无论是滑屏,还是拖动,影响的只是中间OnScroll触发的数量多少而已,最终都会触发onFling事件!

    onDoubleTapListener
    onDoubleTap(MotionEvent e) 双击,不与onSingleTapConfirmed共存
    onDoubleTapEvent(MotionEvent e) 双击行为。双击期间 ACTION_DOWN, AVTION_MOVE,ACTION_UP都会触发此回调。
    onSingleTapConfirmed(MotionEvent e) 严格的单击行为

    通过GestureDetecor监听手势:

    1、首先要实现一个GeastureDetetoc对象。
    2、实现GestureDetector.OnGestureListener的接口
    3、在View的onTouchEvent方法中实现:

    public boolean onTouch(View v, MotionEvent event) {
      return mGestureDetector.onTouchEvent(event)
    

    Demo

    public class MainActivity extends Activity implements OnTouchListener{
        private GestureDetector mGestureDetector;   
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
    
    
          mGestureDetector = new GestureDetector(new gestureListener()); //使用派生自OnGestureListener
    
    
          TextView tv = (TextView)findViewById(R.id.tv);
          tv.setOnTouchListener(this);
          tv.setFocusable(true);   
          tv.setClickable(true);   
          tv.setLongClickable(true); 
        }
    
        /* 
         * 在onTouch()方法中,我们调用GestureDetector的onTouchEvent()方法,将捕捉到的MotionEvent交给GestureDetector 
         * 来分析是否有合适的callback函数来处理用户的手势 
         */  
        public boolean onTouch(View v, MotionEvent event) {
      return mGestureDetector.onTouchEvent(event);   
        }
    
        private class gestureListener implements GestureDetector.OnGestureListener{
      // 用户轻触触摸屏,由1个MotionEvent ACTION_DOWN触发   
      public boolean onDown(MotionEvent e) {
       Log.i("MyGesture", "onDown");   
             Toast.makeText(MainActivity.this, "onDown", Toast.LENGTH_SHORT).show();   
       return false;
      }
    
      /*  
          * 用户轻触触摸屏,尚未松开或拖动,由一个1个MotionEvent ACTION_DOWN触发  
          * 注意和onDown()的区别,强调的是没有松开或者拖动的状态  
          * 
          * 而onDown也是由一个MotionEventACTION_DOWN触发的,但是他没有任何限制,
          * 也就是说当用户点击的时候,首先MotionEventACTION_DOWN,onDown就会执行,
          * 如果在按下的瞬间没有松开或者是拖动的时候onShowPress就会执行,如果是按下的时间超过瞬间
          * 拖动了,就不执行onShowPress。
          */
      public void onShowPress(MotionEvent e) {
       Log.i("MyGesture", "onShowPress");   
             Toast.makeText(MainActivity.this, "onShowPress", Toast.LENGTH_SHORT).show();   
      }
    
      // 用户(轻触触摸屏后)松开,由一个1个MotionEvent ACTION_UP触发   
      ///轻击一下屏幕,立刻抬起来,才会有这个触发
      //从名子也可以看出,一次单独的轻击抬起操作,当然,如果除了Down以外还有其它操作,那就不再算是Single操作了,所以这个事件 就不再响应
      public boolean onSingleTapUp(MotionEvent e) {
       Log.i("MyGesture", "onSingleTapUp");   
             Toast.makeText(MainActivity.this, "onSingleTapUp", Toast.LENGTH_SHORT).show();   
             return true;   
      }
    
      // 用户按下触摸屏,并拖动,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE触发   
      public boolean onScroll(MotionEvent e1, MotionEvent e2,
        float distanceX, float distanceY) {
       Log.i("MyGesture22", "onScroll:"+(e2.getX()-e1.getX()) +"   "+distanceX);   
             Toast.makeText(MainActivity.this, "onScroll", Toast.LENGTH_LONG).show();   
             return true;   
      }
    
      // 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发   
      public void onLongPress(MotionEvent e) {
        Log.i("MyGesture", "onLongPress");   
           Toast.makeText(MainActivity.this, "onLongPress", Toast.LENGTH_LONG).show();   
      }
    
      // 用户按下触摸屏、快速移动后松开,由1个MotionEvent ACTION_DOWN, 多个ACTION_MOVE, 1个ACTION_UP触发   
      public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
        float velocityY) {
       Log.i("MyGesture", "onFling");   
             Toast.makeText(MainActivity.this, "onFling", Toast.LENGTH_LONG).show();   
       return tr
    

    参考:
    https://developer.android.com/reference/android/view/GestureDetector.OnDoubleTapListener

    https://blog.csdn.net/itachi85/article/details/50708391

    https://blog.csdn.net/harvic880925/article/details/39520901

    相关文章

      网友评论

          本文标题:Android View体系

          本文链接:https://www.haomeiwen.com/subject/dxvtxktx.html