Android 事件分发

旧巷老猫 提交于 2020-12-18 00:54:48

1. 

规律:

(1)activity的dispatchTouchEvent返回super传给下层,其他表示消费

(2)dispatchTouchEvent

           返回true表示消费

           返回super(ViewGroup和View的)传给自己:ViewGroup的的onInterceptTouchEventView的onTouchEvent

           返回false(ViewGroup和View的)表示传给上层的onTouchEvent

(3)onTouchEvent返回true表示消费

           返回super和false(ViewGroup和View的)传给上级的onTouchEvent

(4)onInterceptTouchEvent返回true传给自己的onTouchEvent,返回false或super传给下级View的dispatchTouchEvent。

(5)消费:ACTION_DOWN(ACTION_MOVE、ACTION_UP)传递在其中一环节消费,表示不会进行接下来的传递。未消费的话当前ACTION_DOWN(ACTION_MOVE、ACTION_UP)执行后传递给下一个ACTION_DOWN(ACTION_MOVE、ACTION_UP)。

参考https://blog.csdn.net/qq_36523667/article/details/78825810

上述例子中的消息下发顺序是 这样的:①-②-⑤-⑥-⑦-③-④。
 

2.手势识别

//1.创建一个手势识别器 new 对象,并给这个手势识别器设置监听器
mGestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener(){
    //当手指在屏幕上滑动的时候 调用的方法.
    @Override
    //e1代表的是手指刚开始滑动的事件,e2代表手指滑动完了的事件
    public boolean onFling(MotionEvent e1, MotionEvent e2,float velocityX, float velocityY) {
        if(e1.getRawX() - e2.getRawX() > 200){
            showNext();//向右滑动,显示下一个界面
            return true;
        }

        if(e2.getRawX() - e1.getRawX() > 200){
            showPre();//向左滑动,显示上一个界面
            return true;
        }
        return super.onFling(e1, e2, velocityX, velocityY);
    }
});
//2.让手势识别器生效,重写Activity的触摸事件,并且将Activity的触摸事件传入到手势识别器中
@Override
public boolean onTouchEvent(MotionEvent event) {
    mGestureDetector.onTouchEvent(event);
    return super.onTouchEvent(event);
}
//Activity在创建和销毁时使用上面自定义的动画 
public void showNext() {      
 	Intent intent = new Intent(this, Setup3Activity.class);
 	startActivity(intent);
 	finish();
 	//调用此方法让动画效果生效
 	overridePendingTransition(R.anim.tran_next_in, R.anim.tran_next_out);
 }

在res目录下面新建一个anim文件夹在这个文件夹中新建动画效果 tran_next_in.xml//下一个界面进入的样式
tran_next_out.xml//下一个界面进入时当前页面出去的样式
tran_pre_in.xml//上一个界面进入的样式
tran_pre_out.xml//上一个界面进入时当前页面出去的样式

  • tran_next_in.xml里面的内容

    <?xml version="1.0" encoding="utf-8"?>
     <translate xmlns:android="http://schemas.android.com/apk/res/android"    //translate是指定整个图片是位移动
     	android:fromXDelta="100%p" //开始时的X轴位置,100%p当表是当前窗体的宽度
     	android:toXDelta="0"//结束时候的X轴位置
     	android:fromYDelta="0"//开始时Y轴的位置
     	android:toYDelta="0"//结束时Y轴的位置
     	android:duration="300"//整个动画持续的时间
     	>
     </translate>
  • tran_next_out.xml里面的内容

    <?xml version="1.0" encoding="utf-8"?>
     <translate xmlns:android="http://schemas.android.com/apk/res/android"
     	android:fromXDelta="0"
     	android:toXDelta="-100%p"
     	android:fromYDelta="0"
     	android:toYDelta="0"
     	android:duration="300"
     	>
     </translate>
  • tran_pre_in.xml里面的内容

    <?xml version="1.0" encoding="utf-8"?>
     <translate xmlns:android="http://schemas.android.com/apk/res/android"
     	android:fromXDelta="-100%p"
     	android:toXDelta="0"
     	android:fromYDelta="0"
     	android:toYDelta="0"
     	android:duration="300"
     	>
     </translate>
  • tran_pre_out.xml里面的内容

    <?xml version="1.0" encoding="utf-8"?>
     <translate xmlns:android="http://schemas.android.com/apk/res/android"
     	android:fromXDelta="0"
     	android:toXDelta="100%p"
     	android:fromYDelta="0"
     	android:toYDelta="0"
     	android:duration="300"
     	>
     </translate>

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!