`

Android事件处理机制

阅读更多

  一、概述  

  不管是桌面应用还是手机应用,面对的都是用户,经常需要处理用户的操作,为用户的动作提供响应,这种机制就是事件处理

   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,挺不错啊,加油

分享到:
评论

相关推荐

    Android 事件处理机制

    Android事件处理机制

    Android事件处理机制详解及源码

    Android事件处理机制是Android应用程序开发中的关键组成部分,它使得用户与应用之间能够进行有效的交互。在Android系统中,事件处理主要包括触摸事件、键盘事件、广播事件等,这些事件的处理方式直接影响到应用的...

    Android 事件处理机制 demo

    在Android应用开发中,事件处理机制是至关重要的组成部分,它涉及到用户与应用程序的交互,包括点击、滑动等各类操作。本示例"Android 事件处理机制 demo"将深入探讨这一主题,通过实际代码演示如何有效地管理和响应...

    Android事件处理机制ViewGroup的事件传递

    Android事件处理机制主要涉及三类对象:事件(Event)、事件源(Event Source)和事件监听器(EventListener)。在本主题中,我们将深入探讨`ViewGroup`的事件传递,即事件分发过程。 1. **事件模型** Android事件...

    Android应用程序输入事件处理机制

    在Android应用程序中,有一类...这个PPT讲Android应用程序输入事件的分发和处理过程,主要涉及到输入管理InputManager、输入事件监控线程InputReader、输入事件分发线程InputDispatcher,以及应用程序主线程消息循环。

    android事件处理

    本篇将详细解析Android事件处理机制,特别是基于给定的"android 事件处理demo",我们将深入探讨如何在实际应用中处理触摸事件。 首先,Android事件处理主要分为两个阶段:事件分发(Dispatching)和事件处理...

    android事件派发验证demo

    通过这个demo,开发者可以直观地了解Android事件处理机制,并进行实际操作以验证其工作原理。这对于优化用户界面交互和调试事件处理问题具有重要的实践意义。在实际开发中,灵活运用事件派发机制可以创建更高效、...

    Android、教程<经典> 6 Android事件处理

    本教程将深入探讨Android事件处理机制,包括点击事件、触摸事件以及各种监听器的使用。以下是关于这个主题的详细内容: 1. **事件源**:在Android中,事件通常由UI组件(如按钮、文本框等)触发。这些组件被称为...

    Android事件分发机制

    在Android系统中,事件分发机制是用户与应用程序交互的核心环节。它决定了用户在屏幕上点击、滑动等操作如何被正确地处理和响应。本文将深入探讨Android事件分发机制,帮助开发者理解这一关键概念。 首先,我们从...

    老生常谈android中的事件传递和处理机制

    在Android开发中,事件传递和处理机制是相当关键的一个部分,尤其对于用户界面的交互有着决定性的影响。本文主要探讨了Android系统如何处理触摸事件,通过拟人化的比喻来解释事件传递的流程,并通过实际代码示例进行...

    android事件分发机制Demo

    在Android开发中,事件分发机制是理解和优化用户交互界面不可或缺的部分。事件主要指的是用户的触摸操作,例如点击、滑动等。当用户在屏幕上进行操作时,这些事件会经过一系列的处理和分发,最终到达相应的View进行...

    Android事件分发机制总结Demo

    在Android开发中,事件分发机制是理解和优化用户交互界面不可或缺的部分。本文将深入探讨“Android事件分发机制总结Demo”,结合代码实例MyTouchEventDemo,帮助开发者清晰理解这一核心概念。 事件分发机制主要涉及...

    android事件分发机制

    ### Android事件分发机制详解 #### 一、触摸事件涉及的核心类 在Android系统中,触摸事件主要由两类核心对象负责处理:`ViewGroup` 和 `View`。 1. **ViewGroup**:作为容器,继承自 `View`,用于容纳多个 `View`...

    Android事件分发机制全解析Demo

    在Android开发中,事件分发机制是至关重要的一个部分,它决定了用户与界面交互时,事件如何在不同的组件之间传递和处理。本文将基于“Android事件分发机制全解析Demo”进行深入探讨,并通过实际的代码示例来帮助你更...

    android事件分析

    在Android系统中,事件处理是应用交互的核心部分,它涵盖了用户与设备间的各种交互,如..."TL24_KeyEvent_test"可能就是一个实际案例,用于测试和学习如何处理键盘事件,这有助于开发者更好地掌握Android事件处理机制。

    android之Touch事件处理机制测试

    本文将深入探讨“android之Touch事件处理机制测试”,包括滑动事件冲突的解决、ViewGroup中的事件触发和传递机制。 一、Android Touch事件处理机制 1. 触摸事件流程:在Android中,触摸事件分为三个阶段,即ACTION...

    Android事件分发机制小Demo

    通过对这些日志截图的分析,我们可以更直观地了解Android事件分发机制的工作原理,这对于优化用户体验和处理复杂的交互场景至关重要。在实际开发中,理解和掌握这一机制能帮助我们更好地控制UI的响应行为,提升应用...

Global site tag (gtag.js) - Google Analytics