Android学习路线(第二部分)
基于监听的事件处理机制
基于回调事件的处理机制
view的事件触发
Android 存储概念
File 内部存储
一、基于监听的事件处理机制
监听三要素:事件源、事件、事件监听器
实现监听事件的方法:
-
通过内部类实现
class OnClick implements View.OnlickListener{ }
-
通过匿名内部类实现
@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(); } });
-
通过事件源所在类实现
// 3.通过事件源所在的内部类实现 当前Activity实现implements View.OnClickListener mBtnEvent.setOnClickListener(EventActivity.this); @Override public void onClick(View v) { Log.d("事件源所在的内部类", "click"); ToastUtil.showMessage(EventActivity.this, "事件源所在的内部类实现");; }
-
通过外部类实现
-
布局文件中onClick属性(针对点击事件)(这种方法设置的监听器比较优先,如果同一个按钮有好几个监听事件,那么只会执行后设置的监听器)
二、基于回调事件的处理机制
回调事件的实现:我们在自己的控件中继承button类,然后重写了一个ontouchevent方法,当我们点下去按钮的时候,执行回调这个方法。
回调事件处理的传播,系统执行回调操作时先从监听事件检查是否
到控件本身(比如一个自己的button)
再到Activity逐层向外传播。假如在某一层的return true了,那么回调事件停止传播。
mBtnMy = findViewById(R.id.btn_my);
// 先执行监听器里的方法 在执行回调
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;
}
});
// 后执行Activity里的方法 在执行回调
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
Log.d("EventActivity", "onTouchEvent");
break;
}
return false;
}
三、View 事件分发流程
1. dispatchTouchEvent方法(入口方法)
1.1、事件分发的核心方法,事件分发的逻辑都是在这个方法中实现;
1.2、View、以及 ViewGroup、其他的实现类都重写了该方法;
1.3、如果成功处理则返回true,处理失败则返回false,表示事件没有被处理。
1.4、在view的相关类中,该方法的主要作用是消费触摸事件。
1.5、在viewGroup相关类中,该方法的主要作用是把事件分发到该viewGroup所拥有的子view,如果子view没有处理则自己处理;
1.6、点击事件时,触发了两次 dispatchTouchEvent方法,一次action_down和一次action_up
2. onTouchEvent
- 方法返回true表示消费事件,返回false表示不消费事件;
- viewGroup分发事件时,如果没有一个子view消费事件,那么会调用viewGroup自身的onTouchEvent方法来处理事件。
- View的dispatchTouchEvent方法(入口方法)中,先调用onTouchListener判断是否消费;如果onTouchListener没有消费事件,才会调用onTouchEvent来处理事件;
3. onTouch 和onTouchEvent 的区别
- onTouchListener的onTouch方法优先级比onTouchEvent高,会先触发。
- 假如onTouch方法返回false,会接着触发onTouchEvent,反之onTouchEvent方法不会被调用。
- 内置诸如click事件的实现等等都基于onTouchEvent,假如onTouch返回true,这些事件将不会被触发。
四、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,发送消息
new Thread() {
@Override
public void run() {
super.run();
Message message = new Message();
message.what = 1;
mHandler.sendMessage(message);
}
}.start();
}