第五章 必须深刻理解的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-learninghttps://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

迎着日光月光星光,直面风霜雨霜雪霜。

猜你喜欢

转载自blog.csdn.net/qq_51625007/article/details/140442503