第五章 必须深刻理解的Android事件处理【Android基础学习】
前言
2024-6-10 15:08:32
以下内容源自《【Android】》
仅供学习交流使用
版权
禁止其他平台发布时删除以下此话
本文首次发布于CSDN平台
作者是CSDN@日星月云
博客主页是https://jsss-1.blog.csdn.net
禁止其他平台发布时删除以上此话
推荐
【天哥】Android开发视频教程最新版 Android Studio开发
图片资源来自:
https://github.com/jinjungle/skypan-yes-code
开源
日星月云 / 安卓基础学习:https://gitee.com/jsss-1/android-basic-learning
jsss-1 / android-basic-learning:https://github.com/jsss-1/android-basic-learning
第五章 必须深刻理解的Android事件处理
2024-6-10 15:08:32
这章的界面在main界面中
当用户在应用界面上执行各种操作时,应用程序需要为用户的动作提供响应,这种响应的过程就是事件处理。
5-1 基于监听的事件处理机制
监听三要素
Event Source(事件源)
Event(事件)
Event Listener(事件监听器)
示例1:
事件源:btnTestEvent
事件监听器:new View.0nclickListener()
示例2:
事件源:btnTestEvent
事件:MotionEvent event
事件监听器:new View.onTouchListener()
实现监听事件的方法:
- 通过内部类实现
- 通过匿名内部类实现
- 通过事件源所在类实现
- 通过外部类实现
- 布局文件中onClick属性(针对点击事件)
给同一事件源添加多个同种类型监听器会怎样?
最后一个生效,后面会覆盖前面,但是布局实现认为是最先设置的
EventActivity
MyClickListener
activity_event.xml
5-2 基于回调的事件处理机制
- 回调机制与监听机制的区别
- 基于回调的事件传播
回调机制:先从控件本身开始回调,然后到Activity的回调
2024-06-10 16:03:27.380 8774-8774 MyButton com.example.helloworld D ---onTouchEvent---
2024-06-10 16:03:27.380 8774-8774 Activity com.example.helloworld D ---onTouchEvent---
因为是return false,继续传播,没有消费停止
如果是return true,就是消费完成,不需要传播了
2024-06-10 16:06:43.507 9064-9064 MyButton com.example.helloworld D ---onTouchEvent---
如果设置监听器
他会优先执行监听器中的方法,然后再是回调
2024-06-10 16:08:58.987 9279-9279 Listener com.example.helloworld D ---onTouch---
2024-06-10 16:08:58.990 9279-9279 MyButton com.example.helloworld D ---onTouchEvent---
都是return false的结果
2024-06-10 16:10:12.621 9444-9444 Listener com.example.helloworld D ---onTouch---
2024-06-10 16:10:12.622 9444-9444 MyButton com.example.helloworld D ---onTouchEvent---
2024-06-10 16:10:12.623 9444-9444 Activity com.example.helloworld D ---onTouchEvent---
总结:
优先监听,然后回调
监听是最后一个设置生效
回调是从控件内部开始的
MyButton
EventActivity
activity_event.xml
5-3 源码剖析,了解View的事件分发
- dispatchTouchEvent->setOnTouchListenert->onTouchEvent
- onClick/onLongClick来自onTouchEvent的处理
dispatchTouchEvent->setOnTouchListenert->onTouchEvent
dispatchTouchEvent:入口方法
setOnTouchListener:监听器onTouch
onTouchEvent:回调
setOnClickListener:监听器onClick
2024-06-10 16:26:00.924 3314-3314 MyButton com.example.helloworld D ---dispatchTouchEvent---
2024-06-10 16:26:00.924 3314-3314 Listener com.example.helloworld D ---onTouch---
2024-06-10 16:26:00.924 3314-3314 MyButton com.example.helloworld D ---onTouchEvent---
// 这行是ACTION_UP
2024-06-10 16:26:00.995 3314-3314 MyButton com.example.helloworld D --- dispatchTouchEvent---
2024-06-10 16:26:00.997 3314-3314 Listener com.example.helloworld D ---onClick---
源码dispatchTouchEvent:这个是父类View中的方法(需要下载源文件)
ListenerInfo li = mListenerInfo;
if (li != null && li.mOnTouchListener != null
&& (mViewFlags & ENABLED_MASK) == ENABLED
//onTouch如果return false,result就是false
//onTouch如果return true,result就是true
&& li.mOnTouchListener.onTouch(this, event)) {
result = true;
}
//result就是false就会执行onTouchEvent方法
//result就是true就不会执行onTouchEvent方法
if (!result && onTouchEvent(event)) {
result = true;
}
onClick/onLongClick来自onTouchEvent的处理
onTouchEvent:ACTION_DOWN
源码总结:
如果手指按下,100ms内有ACTION_UP,就是点击事件Click
如果再过400ms,手指没有离开,就是长按事件LongClick
要在ACTION_MOVED,没有划出界面
setOnLongClickListener:
如果return false;还会执行setOnClickListener
如果return true;就不会执行setOnClickListener
btnMy.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
return false;
}
});
5-5 Handler消息处理
这个界面在Event中
主要用途
-
未来某时做某事
to schedule messages and runnables to be excuted as some
point in the future -
线程间通信
to enqueue an action to be performed on a different thread
than you own
HandlerActivity
activity_handler.xml
package com.example.helloworld;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import com.example.helloworld.util.ToastUtil;
public class HandlerActivity extends AppCompatActivity {
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);
mHandler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
ToastUtil.showMsg(HandlerActivity.this, "线程通信成功");
break;
}
}
};
new Thread() {
@Override
public void run() {
super.run();
Message message = new Message();
message.what = 1;
mHandler.sendMessage(message);
}
}.start();
}
}
2024-6-10 17:19:02
最后
2024-6-10 17:19:02
迎着日光月光星光,直面风霜雨霜雪霜。