柚子快報(bào)激活碼778899分享:【Android的事件觸發(fā)】
柚子快報(bào)激活碼778899分享:【Android的事件觸發(fā)】
Android學(xué)習(xí)路線(第二部分)
基于監(jiān)聽的事件處理機(jī)制
基于回調(diào)事件的處理機(jī)制
view的事件觸發(fā)
Android 存儲(chǔ)概念
File 內(nèi)部存儲(chǔ)
一、基于監(jiān)聽的事件處理機(jī)制
監(jiān)聽三要素:事件源、事件、事件監(jiān)聽器
實(shí)現(xiàn)監(jiān)聽事件的方法:
通過內(nèi)部類實(shí)現(xiàn) class OnClick implements View.OnlickListener{
}
通過匿名內(nèi)部類實(shí)現(xiàn) @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_button);
mBtn3 = (Button) findViewById(R.id.btn_3);
mBtn3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(ButtonActivity.this,"btn3被點(diǎn)擊了",Toast.LENGTH_SHORT).show();
}
});
通過事件源所在類實(shí)現(xiàn) // 3.通過事件源所在的內(nèi)部類實(shí)現(xiàn) 當(dāng)前Activity實(shí)現(xiàn)implements View.OnClickListener
mBtnEvent.setOnClickListener(EventActivity.this);
@Override
public void onClick(View v) {
Log.d("事件源所在的內(nèi)部類", "click");
ToastUtil.showMessage(EventActivity.this, "事件源所在的內(nèi)部類實(shí)現(xiàn)");;
}
通過外部類實(shí)現(xiàn) 布局文件中onClick屬性(針對(duì)點(diǎn)擊事件)(這種方法設(shè)置的監(jiān)聽器比較優(yōu)先,如果同一個(gè)按鈕有好幾個(gè)監(jiān)聽事件,那么只會(huì)執(zhí)行后設(shè)置的監(jiān)聽器)
二、基于回調(diào)事件的處理機(jī)制
回調(diào)事件的實(shí)現(xiàn):我們?cè)谧约旱目丶欣^承button類,然后重寫了一個(gè)ontouchevent方法,當(dāng)我們點(diǎn)下去按鈕的時(shí)候,執(zhí)行回調(diào)這個(gè)方法。
回調(diào)事件處理的傳播,系統(tǒng)執(zhí)行回調(diào)操作時(shí)先從監(jiān)聽事件檢查是否
到控件本身(比如一個(gè)自己的button)
再到Activity逐層向外傳播。假如在某一層的return true了,那么回調(diào)事件停止傳播。
mBtnMy = findViewById(R.id.btn_my);
// 先執(zhí)行監(jiān)聽器里的方法 在執(zhí)行回調(diào)
mBtnMy.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
//getAction值的是“按下”這個(gè)事件
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d("Listener", "OnTouchListener");
break;
}
return false;
}
});
// 后執(zhí)行Activity里的方法 在執(zhí)行回調(diào)
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d("EventActivity", "onTouchEvent");
break;
}
return false;
}
三、View 事件分發(fā)流程
1. dispatchTouchEvent方法(入口方法)
1.1、事件分發(fā)的核心方法,事件分發(fā)的邏輯都是在這個(gè)方法中實(shí)現(xiàn); 1.2、View、以及 ViewGroup、其他的實(shí)現(xiàn)類都重寫了該方法; 1.3、如果成功處理則返回true,處理失敗則返回false,表示事件沒有被處理。 1.4、在view的相關(guān)類中,該方法的主要作用是消費(fèi)觸摸事件。 1.5、在viewGroup相關(guān)類中,該方法的主要作用是把事件分發(fā)到該viewGroup所擁有的子view,如果子view沒有處理則自己處理;
1.6、點(diǎn)擊事件時(shí),觸發(fā)了兩次 dispatchTouchEvent方法,一次action_down和一次action_up
2. onTouchEvent
方法返回true表示消費(fèi)事件,返回false表示不消費(fèi)事件;viewGroup分發(fā)事件時(shí),如果沒有一個(gè)子view消費(fèi)事件,那么會(huì)調(diào)用viewGroup自身的onTouchEvent方法來處理事件。View的dispatchTouchEvent方法(入口方法)中,先調(diào)用onTouchListener判斷是否消費(fèi);如果onTouchListener沒有消費(fèi)事件,才會(huì)調(diào)用onTouchEvent來處理事件;
3. onTouch 和onTouchEvent 的區(qū)別
onTouchListener的onTouch方法優(yōu)先級(jí)比onTouchEvent高,會(huì)先觸發(fā)。假如onTouch方法返回false,會(huì)接著觸發(fā)onTouchEvent,反之onTouchEvent方法不會(huì)被調(diào)用。內(nèi)置諸如click事件的實(shí)現(xiàn)等等都基于onTouchEvent,假如onTouch返回true,這些事件將不會(huì)被觸發(fā)。
四、Handler消息處理
功能一:延時(shí)處理,postDelayed
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler);
mHandler = new Handler();
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
Intent intent = new Intent(HandlerActivity.this, ButtonActivity.class);
startActivity(intent);
}
}, 3000);
功能二:線程間通信,handleMessage,Thread
private Handler mHandler;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handler);
//重寫handleMessage方法接收線程的消息并做一些處理
mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
ToastUtil.showMessage(HandlerActivity.this, "線程通信成功");;
break;
}
}
};
//新建一個(gè)新的線程thread,發(fā)送消息
new Thread() {
@Override
public void run() {
super.run();
Message message = new Message();
message.what = 1;
mHandler.sendMessage(message);
}
}.start();
}
柚子快報(bào)激活碼778899分享:【Android的事件觸發(fā)】
精彩文章
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。