一、概述
不管是桌面应用还是手机应用,面对的都是用户,经常需要处理用户的操作,为用户的动作提供响应,这种机制就是事件处理
Androd系统提供了两种事件处理机制
a、基于监听的事件处理
b、基于回调的事件处理
二、基于监听的事件处理
a、涉及三个模型
Event Source(事件源,事件发生的场所,通俗地讲就是各个组件,如按钮,菜单)(比如企业发生了火灾)
Event(事件),封装了界面上特定的事情(报警,企业处理不了,要消防局来处理)
EventListener(事件监听器)对事件做出的响应(消防机关的警察来灭火)
例子:模拟飞机的移动
public class PlaneView extends View{ public float cx; public float cy; Bitmap palne; public PlaneView(Context context){ super(context); plane=BitmapFactory.decodeResource(context.getResources(),R.drawable.iclon); setFocusable(true); } //还有两个参数,三个参数的构造方法,在使用xml自定义的控件时,会默认调用第二个构造函数 //在这里省略掉了 public void onDraw(Canvas canvas){ super.onDraw(canvas); Paint p=new Paint(); canvas.drawBitmap(plane,cx,cy,p); }
主Activity
public class PlaneGame extends Activity{ private int speed=10;//飞机的移动速度 public void onCreate(Bundle savedInstanceState){ super.onCreate(); //去标题 //全屏显示 final PlaneView planeView=new PlaneView(this); //根据屏幕的宽高设定飞机的初始位置 planeView.cx=....; planeView.cy=....; planeView.setOnKeyListener( new onKeyListener(){ public boolean onKey(View source,int keyCode,KeyEvent event){ // //根据event.getKeyCode()来分别控制上下左右 (调整成员变量cx,cy达到改变飞机的位置) return true;//planeView已经把把键盘触摸的事件消费了,下面的Activity一边待着去吧 } } } ); } }
三、基于回调的事件处理
定义:相比于监听,回调的事件源和事件监听器统一了,也就是所组件自己就具备处理事件的能力
public class PlaneView extends View{ public float cx; public float cy; Bitmap palne; public PlaneView(Context context){ super(context); plane=BitmapFactory.decodeResource(context.getResources(),R.drawable.iclon); setFocusable(true); } //还有两个参数,三个参数的构造方法,在使用xml自定义的控件时,会默认调用第二个构造函数 //在这里省略掉了 public void onDraw(Canvas canvas){ super.onDraw(canvas); Paint p=new Paint(); canvas.drawBitmap(plane,cx,cy,p); } //增加的代码,重写按键点击的响应 public boolean onKeyDown(int keyCode,KeyEvent event){ super.onKeyDown()keyCode,event; syso("the onkeydown on planeView"); reutrn false;// } }
上面在planeview本身就完成了onkeydown的响应
事件响应顺序:当组件上的事件被触发后,Android系统最先触发的是按键上绑定的事件监听器,接着才触发该组件提供事件的回调方法,然后传播给该组件的Activity,如果任何一个组件处理返回了true,事件就不会继续向外传播了。
比较者:基于回调的事件处理具备有更加好的内聚性,模块化更加强一点,把属于一个组件的事务封装到一起
在handler里也有回调,因此我们把handler补充进来,形成知识连
四、handler消息传递机制
背景:由于手机的性能是有限的,为了Android性能的优化,(效率高一点),Android的UI操作不是线程安全的(线程安全就是同一个时刻只有一个线程操作数据),这就意味着当多个线程共同操作ui控件的时候可能会线程不安全,于是Android规定:只有UI主线程有权利操作UI组件。
为了实现这样的效果:由于新开辟的线程希望修改属性的值,却没有资格,这个尴尬的局面。Android提供了handler来完成对把控件的值修改的任务(回调的方式处理这个事件)
具体的过程就是:开发者只需要重写handler类的消息处理方法,当新启动线程的消息通过handler会加入的消息队列里,handler源源不断地获取这个消息队列里的消息并且一一处理,于是handler就回调了
介绍了handler 和消息队列,还差一个Looper,它就是消息队列的管理者
handler想源源不断地获取队列的message,就需要当前线程(一般是UI线程)有一个Looper对象
奇怪啊,我们主线程编写是好像没看到过Looper,为什么handler还能正常地运行呢?(因为UI线程已经初始化了Looper对象)。
如果当前线程不是UI线程,而是自己搞的一个子线程,开发者需要创建Looper对象,并且调用prepare()方法,这样handler就能正常地工作了(因为Looper已经管理了消息队列)
对Looper源代码的研究
private Looper(){ mQueue=new MessageQueue(); mRun=tru; mThread=Thread,.currentThread(); } //说明Looper不能通过构造函数实例化,Looper在初始化时会指明哪个消息队列,哪个线程
public static final void prepare(){ if(sThreadlocal.get()!=null){ throw new Exception(一个线程里只能创建一个Looper); } sThreadlocal.set(new looper()); }
threadlocal线程范围内数据共享,类似map集合,键值对,
例子:明天补充
今天复习了两种事件,自定义控件,多线程,handler,挺不错啊,加油
相关推荐
COMSOL激光增材制造技术:热流力三场耦合模型的构建与模拟研究,COMSOL激光增材制造中热-流-力三场耦合模型的研究与应用:基于固体传热、固体力学、层流和动网格技术的多物理场分析,comsol激光增材制造热-流-力三场偶合模型 选用固体传热,固体力学,层流和动网格,考虑热物性以及马兰戈尼效应、表面张力,相变潜热,热对流和热辐射等 【软件工具】COMSOL5.6 【备注】,comsol三维模型 ,核心关键词:comsol; 激光增材制造; 热-流-力三场偶合模型; 固体传热; 固体力学; 层流; 动网格; 热物性; 马兰戈尼效应; 表面张力; 相变潜热; 热对流; 热辐射; COMSOL5.6; 三维模型。,COMSOL 5.6激光增材制造三场耦合模型
基于PLL的SMO滑模观测器算法在永磁同步电机无传感器矢量控制中的应用及其与反正切SMO的对比:有效消除转速抖动,基于PLL的SMO滑模观测器算法在永磁同步电机无传感器矢量控制中的应用及其与反正切SMO的对比:有效消除转速抖动,基于PLL的SMO滑模观测器算法,永磁同步电机无传感器矢量控制,跟基于反正切的SMO做对比,可以有效消除转速的抖动。 ,基于PLL的SMO滑模观测器算法; 永磁同步电机无传感器矢量控制; 反正切SMO; 转速抖动消除。,基于PLL SMO滑模观测器:永磁同步电机无传感器矢量控制新算法,优化抖动消除效能
【毕业设计】java-springboot+vue个人云盘管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
【毕业设计】java-springboot-vue电影推荐系统实现源码(完整前后端-mysql-说明文档-LunW).zip
基于OpenCV和Python的实时口罩识别系统:支持摄像头与图片检测,界面简洁操作便捷,基于OpenCV的口罩识别系统 相关技术:python,opencv,pyqt (请自行安装向日葵远程软件,以便提供远程帮助) 软件说明:读取用户设备的摄像头,可实时检测画面中的人的口罩佩戴情况,并给予提示。 有基础的同学,可稍作修改,检测图片。 第一张为运行主界面。 第二张为部分代码截图。 第三和第四张为运行界面。 ,基于OpenCV的口罩识别系统; Python; OpenCV; PyQt; 远程协助; 摄像头读取; 实时检测; 口罩佩戴情况提示; 代码截图; 运行界面。,"基于OpenCV与Python的口罩识别系统:实时检测与提醒"
内容概要:本文是一份关于 Git 和 GitHub 的入门指南,详细介绍了一整套从安装到进阶使用的完整流程。文章首先阐述了版本控制的重要性,并解释了 Git 的特点和优势。接着逐步介绍了 Git 和 GitHub 的使用方法,包括安装设置 Git、创建和管理 GitHub 账户、创建和克隆仓库,以及日常操作如提交、推送、拉取、分支管理和处理冲突的具体指令和操作步骤。还涉及到高级主题如合并请求、持续集成等功能的介绍,帮助读者深入了解 Git 和 GitHub 的应用范围和最佳实践。 适用人群:适用于刚开始接触版本控制系统的初学者,特别是那些正在寻找 Git 和 GitHub 实际操作指导的学生和技术爱好者。 使用场景及目标:①为刚踏入软件开发领域的新人提供详尽的基础教学,使其能够快速理解和掌握必要的技能;②指导已有一定经验但仍想进一步深化理解的开发人员如何优化日常工作流程;③促进团队合作效率提升,通过具体的实例演示如何利用版本控制系统协调多人协作。 其他说明:随着 Git 和 GitHub 成为现代软件开发的标准工具之一,这份资料不仅涵盖了关键知识点,而且配有多图例解析和实操练习,确保每个阶段的学习都能得到良好反馈和支持。读者可以通过动手实践来巩固所学知识,在实践中遇到困难也能及时参考本文获得解决方案。
python安装-16. 使用指定序列和数值创建一个字典——分配伴侣.py
本研究的目的是基于Python和OpenCV开发一个魔方识别系统,并提供相应的源码和部署教程。通过该系统,用户可以将魔方的图像输入,系统可以自动识别魔方的状态,并给出相应的还原方案。具体来说,本研究的主要内容包括以下几个方面: 图像预处理:通过使用OpenCV提供的图像处理算法,对输入的魔方图像进行预处理,包括图像去噪、边缘检测、图像分割等操作,以提高后续的识别准确率。 特征提取与模式识别:通过使用OpenCV提供的特征提取算法,对预处理后的图像进行特征提取,以获取魔方的状态信息。然后,通过机器学习算法,对提取到的特征进行模式识别,以确定魔方的状态。 还原方案生成:根据识别到的魔方状态,使用经典的还原算法,生成相应的还原方案。通过该方案,用户可以轻松地还原魔方,提高解决效率。
基于Springboot与Vue.js的WMS仓库管理系统源码详解:前后端分离架构下的Java实践与功能详述,基于Springboot和Vue的前后端分离WMS仓库管理系统源码,详细功能参考详情。,Springboot vue仓库管理系统源码Java 前后端分离 WMS仓库管理 BS 功能见详情 ,Springboot; Vue; 仓库管理系统; 源码; Java; 前后端分离; WMS仓库管理; BS; 功能详情,Springboot+Vue仓库管理系统源码:前后端分离的WMS管理BS应用
用AI学安卓游戏开发1——控制小球上下左右移动2代码, 初始化小球随机自有移动,遇到屏幕边缘反弹,摇杆介入后小球停止自有移动,按照摇杆控制方向移动。
海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
CSDN Matlab武动乾坤上传的资料均是完整代码运行出的仿真结果图,可见完整代码亲测可用,适合小白; 1、完整的代码内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描博客文章底部QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
基于ATP-EMTP的110kV海底电缆与架空线雷击过电压仿真分析与研究,基于ATP-EMTP的110kV海底电缆与架空线雷击过电压仿真分析与研究,110kV海底电缆-架空线雷击过电压ATP-EMTP仿真分析 ,核心关键词: 110kV海底电缆; 架空线; 雷击过电压; ATP-EMTP仿真分析; 分析。 关键词用分号分隔,如上所示。,雷击过电压仿真分析:110kV海底电缆及架空线ATP-EMTP研究
基于800kV高压直流输电的VSC-HVDC仿真模型研究:控制策略与性能分析,基于800kV-VSC-HVDC的直流输电仿真模型研究:深入探讨控制结构与电压稳定性,800kV-VSC-HVDC直流输电仿真模型(Matlab) 流器拓扑:VSC两电平流器 电压等级:直流800kV,交流500kV 控制结构:逆变侧定有功控制与电流内环PI+前馈解耦,整流侧定直流电压与电流内环+PI前馈解耦; 输电距离:100km; 双端电压电流均为对称的三相电压电流; 直流电压稳定在800kV; 双端网侧THD<2% 电子资料, ,800kV; VSC HVDC; 直流输电仿真模型; Matlab; VSC两电平换流器; 直流电压稳定; 逆变侧定有功控制; 电流内环PI+前馈解耦; 整流侧定直流电压与电流内环; 输电距离; 双端电压电流对称; 双端网侧THD<2%。,Matlab仿真模型:800kV VSC两电平换流器HVDC输电系统
海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
【毕业设计】java-springboot-vue电商应用系统实现源码(完整前后端-mysql-说明文档-LunW).zip
海神之光上传的视频是由对应的完整代码运行得来的,完整代码皆可运行,亲测可用,适合小白; 1、从视频里可见完整代码的内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
uniapp使用蓝牙通信示例