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