美文网首页
View事件体系(一)

View事件体系(一)

作者: 你是荣华 | 来源:发表于2019-03-16 13:58 被阅读0次
    1. MotionEvent
    • ACTION_DOW——手指刚接触屏幕
    • ACTION_MOVE——手指移动
    • ACTON_UP——手指松开屏幕
    1. TouchSlop
      系统能识别出是滑动的最小滑动距离,在不同设备上该值可能不同
      通过以下代码可以获取该常量
      ViewConfiguration.get(this).getScaledTouchSlop()

    2. VelocityTracker
      速度追踪,用于追踪手指的滑动速度
      使用方法

    VelocityTracker velocityTracker = VelocityTracker.obtain();
    velocityTracker.addMovement(event);
    
    // 设置时间间隔为1000ms,必须设置
    velocityTracker.computeCurentVelocity(1000); 
    
    // 可能为负数,从右往左滑动
    float xVelocity = velocityTracker.getXVelocity(); 
    float yVelocity = velocityTracker.getYVelocity();
    
    // 不使用的是否应重置并回收内存
    velocityTracker.clear();
    velocityTracker.recycle();
    
    1. GestureDetector
      手势检测,用于检测用户单击、滑动、长按、双击等行为
    @Override
    public boolean onTouchEvent(MotionEvent event) {
     
        GestureDetector detector=new GestureDetector(this);
        detector.setOnDoubleTapListener(this);
        // 解决长按后无法拖动现象
        detector.setIsLongpressEnabled(false);
        // 接管事件
        boolean b = detector.onTouchEvent(event);
        return b;
    }
    

    实现OnGestureListener接口

        public interface OnGestureListener {
            boolean onDown(MotionEvent e);
            void onShowPress(MotionEvent e);
            boolean onSingleTapUp(MotionEvent e);
            boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY);
            void onLongPress(MotionEvent e);
            boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY);
        }
        public interface OnDoubleTapListener {
            boolean onSingleTapConfirmed(MotionEvent e);
            boolean onDoubleTap(MotionEvent e);
            boolean onDoubleTapEvent(MotionEvent e);
        }
    
    
    1. Scroller
      弹性滑动对象,我们如果使用View中的scrollTo/scrollBy方法进行滑动时是瞬间完成的,没有过渡用户体验非常不好。使用Scroller和View的computerScroll方法可以实现弹性滑动
    Scroller scroller = new Scroller(getContext());
    public void scrollerTo(int destX, int destY) {
        int scrollX = getScrollX();
        int scrollY = getScrollY();
        int deltaX = destX - scrollX;
        int deltaY = destY - scrollY;
        // 缓慢滑动,耗时1000ms
        scroller.startScroll(scrollX, scrollY, deltaX, deltaY, 1000);
        invalidate();
    }
    @Override
    public void computeScroll() {
        super.computeScroll();
        if (scroller.computeScrollOffset()) {
            scrollerTo(scroller.getCurrX(), scroller.getCurrY());
        }
    }
    

    相关文章

      网友评论

          本文标题:View事件体系(一)

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