Android 事件传递学习记录(一)


public class TestActivity1 extends Activity {
    private String TAG = TestActivity1.class.getSimpleName();

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Button button = new Button(this);
        button.setText("activity 1");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(TestActivity1.this, TestActivity2.class));
            }
        });
        button.setLayoutParams(new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
        MyLinearlayout linearlayout = new MyLinearlayout(this);
        linearlayout.setClickable(true);
        linearlayout.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        Log.i(TAG, "onTouch: ACTION_DOWN");
                        break;
                    case MotionEvent.ACTION_MOVE:
                        Log.i(TAG, "onTouch: ACTION_MOVE");
                        break;
                    case MotionEvent.ACTION_UP:
                        Log.i(TAG, "onTouch: ACTION_UP");
                        break;
                }
                return false;
            }
        });
        button.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()) {
                    case MotionEvent.ACTION_DOWN:
                        Log.i(TAG, "button onTouch: ======================================");
                        Log.i(TAG, "button onTouch: ACTION_DOWN");
                        Log.i(TAG, "button onTouch: ======================================");
                        break;
                    case MotionEvent.ACTION_MOVE:
                        Log.i(TAG, "button onTouch: ======================================");
                        Log.i(TAG, "button onTouch: ACTION_MOVE");
                        Log.i(TAG, "button onTouch: ======================================");
                        break;
                    case MotionEvent.ACTION_UP:
                        Log.i(TAG, "button onTouch: ======================================");
                        Log.i(TAG, "button onTouch: ACTION_UP");
                        Log.i(TAG, "button onTouch: ======================================");
                        break;
                }
                return false;
            }
        });
        linearlayout.addView(button);
        setContentView(linearlayout);
    }

    class MyLinearlayout extends LinearLayout {

        public MyLinearlayout(Context context) {
            this(context, null);
        }

        public MyLinearlayout(Context context, @Nullable AttributeSet attrs) {
            this(context, attrs, 0);
        }

        public MyLinearlayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }

        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            Log.i(TAG, "onInterceptTouchEvent: ");
            switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    Log.i(TAG, "onInterceptTouchEvent: ACTION_DOWN");
                    return false;
                case MotionEvent.ACTION_MOVE:
                    Log.i(TAG, "onInterceptTouchEvent: ACTION_MOVE");
                    return true;
                case MotionEvent.ACTION_UP:
                    Log.i(TAG, "onInterceptTouchEvent: ACTION_UP");
                    return false;
            }
            return false;
        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {
            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    Log.i(TAG, "onTouchEvent: ACTION_DOWN");
                    break;
                case MotionEvent.ACTION_MOVE:
                    Log.i(TAG, "onTouchEvent: ACTION_MOVE");
                    break;
                case MotionEvent.ACTION_UP:
                    Log.i(TAG, "onTouchEvent: ACTION_UP");
                    break;
            }
            Log.i(TAG, "onTouchEvent: ");
            return super.onTouchEvent(event);
        }

        @Override
        public boolean dispatchTouchEvent(MotionEvent ev) {
            Log.i(TAG, "dispatchTouchEvent: ");
            return super.dispatchTouchEvent(ev);
        }
    }
}

 

测试代码

@Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            Log.i(TAG, "onInterceptTouchEvent: ");
            switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    Log.i(TAG, "onInterceptTouchEvent: ACTION_DOWN");
                    return false;
                case MotionEvent.ACTION_MOVE:
                    Log.i(TAG, "onInterceptTouchEvent: ACTION_MOVE");
                    return true;
                case MotionEvent.ACTION_UP:
                    Log.i(TAG, "onInterceptTouchEvent: ACTION_UP");
                    return false;
            }
            return false;
        }

dispatchTouchEvent: 
onInterceptTouchEvent: 
onInterceptTouchEvent: ACTION_DOWN

 button onTouch: ======================================
 button onTouch: ACTION_DOWN
 button onTouch: ======================================

dispatchTouchEvent: 
    onInterceptTouchEvent: 
    onInterceptTouchEvent: ACTION_MOVE

dispatchTouchEvent: 
    onTouch: ACTION_MOVE
    onTouchEvent: ACTION_MOVE
    onTouchEvent: 

dispatchTouchEvent: 

onTouch: ACTION_MOVE
    onTouchEvent: ACTION_MOVE
    onTouchEvent: 

dispatchTouchEvent: 
    onTouch: ACTION_MOVE
    onTouchEvent: ACTION_MOVE

 onTouchEvent: 

dispatchTouchEvent: 
    onTouch: ACTION_MOVE
    onTouchEvent: ACTION_MOVE
    onTouchEvent: 

dispatchTouchEvent: 
    onTouch: ACTION_MOVE
    onTouchEvent: ACTION_MOVE
    onTouchEvent: 

dispatchTouchEvent: 
    onTouch: ACTION_MOVE
    onTouchEvent: ACTION_MOVE
    onTouchEvent: 


dispatchTouchEvent: 
    onTouch: ACTION_UP
    onTouchEvent: ACTION_UP
    onTouchEvent: 

方法执行顺序

dispatchTouchEvent -> onInterceptTouchEvent -> onTouch -> onTouchEvent

dispatchTouchEvent : false 所有动作都不执行。(重写该方法)该方法只执行一次。

dispatchTouchEvent : ture 所有动作都不执行。(重写该方法)该方法会重复执行。

onInterceptTouchEvent:false 所有的动作都不拦截。并且该方法会重复执行。

onInterceptTouchEvent:true 该动作之后的动作都会被拦截,并且只执行一次。如 在action_move 时拦截,则之后的actiion_up,也会被拦截,但是如果action_down 返回false,action_down 动作不会被拦截,且向下传递。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值