android View事件体系

参考

huachao1001:彻底理解View事件体系!

坐标

MotionEvent事件对象

KeyEvent

Android按键事件处理流程 -- KeyEvent

VelocityTracker 速度追踪

//获取实例 享元模式
VelocityTracker vt=VelocityTracker.obtain();
vt.addMovement(event);
//设定计算速度的时间间隔
vt.computeCurrentVelocity(1000);
int xv=(int) vt.getXVelocity();
int yv=(int) vt.getYVelocity();
//回收
vt.clear();//一般在MotionEvent.ACTION_UP的时候调用
vt.recycle();//一般在onDetachedFromWindow中调用

GestureDetector手势检测

//监听器
GestureDetector.OnGestureListener listener=new GestureDetector.OnGestureListener() {
    @Override
    public boolean onDown(MotionEvent e) {
        //手指按下的瞬间
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
        //手指触摸屏幕,并且尚未松开或拖动。与onDown的区别是,onShowPress强调没用松开和没有拖动
    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        //手指离开屏幕(单击)
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        //手指按下并拖动,当前正在拖动
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {
        //手指长按事件
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        //手指快速滑动
        return false;
    }
};

//设置监听器
GestureDetector mGestureDetector = new GestureDetector(this,listener);
//双击 OnDoubleTapListener
//mGestureDetector.setOnDoubleTapListener(onDoubleTapListener);

//防止长按后无法拖动的问题
mGestureDetector.setIsLongpressEnabled(false);

//事件托管
View.OnTouchEvent(){return mGestureDetector.onTouchEvent(event);}

事件分发机制

事件对象产生

系列事件对象下发

事件对象处理

  1. OnTouch() View.setOnTouchListener(new View.OnTouchListener() {});
    return false; 转发View.OnTouchEvent()
    return true; 消耗
  2. View.onTouchEvent()
    判断单击/双击...事件,显式调用OnClick(),OnLongClick()
    retrun super.onTouchEvent(event);

系列事件对象回传

细节