View 的事件处理

如果View处理事件流程

1. 如果设置了onTouchListener 首先执行onTouchListener 中的onTouch 方法,根据onTouch 的返回值进行其他操作.


(1) 如果onTouch返回了true 则View的onTouchEvent 不会被调用.

// onTouch 返回 true
// 按下按钮时
D/MainActivity: onTouch: ACTION_DOWN
// 松开按钮时
D/MainActivity: onTouch: ACTION_UP

(2) 如果onTouch 返回了false. 则View的onTouchEvent()将会被执行 .测试如果设置了OnClickListener 则 OnClickListener中的onClick() 方法将会被执行 .也就是说onClickListener的优先级最低.

// onTouch 返回false
// 按下按钮时
D/MainActivity: onTouch: ACTION_DOWN
D/WSJButton_01: onTouchEvent: ACTION_DOWN
D/WSJButton_01: onTouchEvent 被调用
// 松开按钮时
D/MainActivity: onTouch: ACTION_UP
D/WSJButton_01: onTouchEvent: ACTION_UP
D/WSJButton_01: onTouchEvent 被调用
D/MainActivity: onClick: 执行

2. 如果没有设置onTouchListener则默认和onTouch返回false的情况一样.

// 没有设置OnTouchListener
// 按钮被按下
D/WSJButton_01: onTouchEvent: ACTION_DOWN
D/WSJButton_01: onTouchEvent 被调用
// 松开按钮时
D/WSJButton_01: onTouchEvent: ACTION_UP
D/WSJButton_01: onTouchEvent 被调用
D/MainActivity: onClick: 执行

测试代码

自定义Button

import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.widget.Button;
/**
 * 测试View事件的自定义Button
 * Created by WSJ on 2016/12/14.
 */
public class WSJButton_01 extends Button {
    private static final String TAG = "WSJButton_01";
    public WSJButton_01(Context context) {
        this(context,null);
    }
    public WSJButton_01(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }
    public WSJButton_01(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        Log.d(TAG,"构造方法被调用");
    }                                                                                              
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()){
            case MotionEvent.ACTION_DOWN:
                Log.d(TAG, "onTouchEvent: ACTION_DOWN");
                break;
            case MotionEvent.ACTION_UP:
                Log.d(TAG, "onTouchEvent: ACTION_UP");
                break;
        }
        return super.onTouchEvent(event);
    }
}

Button设置Listener

        mButtonTest = (Button) findViewById(R.id.btn_test_event);

        mButtonTest.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch (event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        Log.d(TAG, "onTouch: ACTION_DOWN");
                        break;
                    case MotionEvent.ACTION_UP:
                        Log.d(TAG, "onTouch: ACTION_UP");
                        break;
                }
                // 返回 false onTouchEvent 将会执行.----> onClick 也会执行
                return false;
                // 返回 true onTouchEvent将不会被调用.
//                return true;
            }
        });
        mButtonTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: 执行");
            }
        });

你可能感兴趣的:(View 的事件处理)