View 的事件處理

如果View處理事件流程

1. 如果設(shè)置了onTouchListener 首先執(zhí)行onTouchListener 中的onTouch 方法,根據(jù)onTouch 的返回值進行其他操作.


(1) 如果onTouch返回了true 則View的onTouchEvent 不會被調(diào)用.

// onTouch 返回 true
// 按下按鈕時
D/MainActivity: onTouch: ACTION_DOWN
// 松開按鈕時
D/MainActivity: onTouch: ACTION_UP

(2) 如果onTouch 返回了false. 則View的onTouchEvent()將會被執(zhí)行 .測試如果設(shè)置了OnClickListener 則 OnClickListener中的onClick() 方法將會被執(zhí)行 .也就是說onClickListener的優(yōu)先級最低.

// onTouch 返回false
// 按下按鈕時
D/MainActivity: onTouch: ACTION_DOWN
D/WSJButton_01: onTouchEvent: ACTION_DOWN
D/WSJButton_01: onTouchEvent 被調(diào)用
// 松開按鈕時
D/MainActivity: onTouch: ACTION_UP
D/WSJButton_01: onTouchEvent: ACTION_UP
D/WSJButton_01: onTouchEvent 被調(diào)用
D/MainActivity: onClick: 執(zhí)行

2. 如果沒有設(shè)置onTouchListener則默認(rèn)和onTouch返回false的情況一樣.

// 沒有設(shè)置OnTouchListener
// 按鈕被按下
D/WSJButton_01: onTouchEvent: ACTION_DOWN
D/WSJButton_01: onTouchEvent 被調(diào)用
// 松開按鈕時
D/WSJButton_01: onTouchEvent: ACTION_UP
D/WSJButton_01: onTouchEvent 被調(diào)用
D/MainActivity: onClick: 執(zhí)行

測試代碼

自定義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,"構(gòu)造方法被調(diào)用");
    }                                                                                              
    @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設(shè)置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 將會執(zhí)行.----> onClick 也會執(zhí)行
                return false;
                // 返回 true onTouchEvent將不會被調(diào)用.
//                return true;
            }
        });
        mButtonTest.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "onClick: 執(zhí)行");
            }
        });
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容