Android平台的事件处理机制有两种

基于回调机制的事件处理:Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通过重写View中的这些回调方法来实现需要的响应事件。

基于监听接口的事件处理:面向对象设计中的主流处理方式,采用委托事件处理的方式,将发生的事件委托给注册过的事件监听器来处理.

1.基于回调机制的事件处理:重写android组件特定的一些回调方法

onKeyDown()/ onKeyUp(),该方法是接口KeyEvent.Callback中的抽象方法,所有的View全部实现了该接口并重写了该方法,该方法用来捕捉手机键盘被按下的事件。public boolean onKeyDown (int keyCode, KeyEvent event)

onTouchEvent(),该方法在View类中的定义,并且所有的View子类全部重写了该方法,应用程序可以通过该方法处理手机屏幕的触摸事件。

public booleanonTouchEvent (MotionEvent event)

onFocusChanged(),只能在View中重写。该方法是焦点改变的回调方法,当某个控件重写了该方法后,当焦点发生变化时,会自动调用该方法来处理焦点改变的事件。protected void onFocusChanged (boolean  gainFocus, int direction, Rect previouslyFocusedRect)

2.基于监听接口的事件处理:为android组件绑定特定的事件监听器.事件监听器是视图View类的接口,包含一个单独的回调方               法。这些方法将在视图中注册的监听器被用户界面操作触发时由Android框架调用。下面这些回调方法被包含在事件监听器接口中:

onClick():包含于View.OnClickListener。当用户触摸这个item(在触摸模式下),或者通过浏览键或跟踪球聚焦在这个item上,然后按下“确认”键或者按下跟踪球时被调用。

onLongClick():包含于View.OnLongClickListener。当用户触摸并控制住这个item(在触摸模式下),或者通过浏览键或跟踪球聚焦在这个item上,然后保持按下“确认”键或者按下跟踪球(一秒钟)时被调用。

onFocusChange():包含于View.OnFocusChangeListener。当用户使用浏览键或跟踪球浏览进入或离开这个item时被调用。

onKey() :包含于View.OnKeyListener。当用户聚焦在这个item上并按下或释放设备上的一个按键时被调用。

onTouch() :包含于View.OnTouchListener。当用户执行的动作被当做一个触摸事件时被调用,包括按下,释放,或者屏幕上任何的移动手势(在这个item的边界内)。

onCreateContextMenu() :包含于View.OnCreateContextMenuListener。当正在创建一个上下文菜单的时候被调用(作为持续的“长点击”动作的结果)。

Android系统界面事件的传递和处理规则

如果界面控件设置了事件监听器,则事件将先传递给事件监听器

如果界面控件没有设置事件监听器,界面事件则会直接传递给界面控件的其他事件处理函数

即使界面控件设置了事件监听器,界面事件也可以再次传递给其他事件处理函数

是否继续传递事件给其他处理函数是由事件监听器处理函数的返回值决定的

如果监听器处理函数的返回值为true,表示该事件已经完成处理过程,不需要其他处理函数参与处理过程,这样事件就不会再继续进行传递

如果监听器处理函数的返回值为false,则表示该事件没有完成处理过程,或需要其他处理函数捕获到该事件,事件会被传递给其他的事件处理函数

基于监听接口的事件处理例子

在智能手机上,很多应用软件需要得到用户手指操作的时候的坐标和一些用户的操作,鉴于开发Android经常会用到滑动的地方,所以下面叙述一下滑动的例子:

效果图:





 activity类代码:

package com.TouchView;

 

import android.app.Activity;

import android.os.Bundle;

import android.view.MotionEvent;

import android.view.View;

import android.widget.TextView;

 

public class TouchViewActivity extends Activity {

 

    private TextView eventlable;

    private TextView histroy;

    private TextView TouchView;

 

    @Override

    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.main);

        TouchView = (TextView) findViewById(R.id.touch_area);

        histroy = (TextView) findViewById(R.id.history_label);

        eventlable = (TextView) findViewById(R.id.event_label);

 

        TouchView.setOnTouchListener(new View.OnTouchListener() {

 

            @Override

            public boolean onTouch(View v, MotionEvent event) {

                int action = event.getAction();

                switch (action) {

                // 当按下的时候

                case (MotionEvent.ACTION_DOWN):

                    Display("ACTION_DOWN", event);

                    break;

                // 当按上的时候

                case (MotionEvent.ACTION_UP):

                    int historysize = ProcessHistory(event);

                    histroy.setText("历史数据" + historysize);

                    Display("ACTION_UP", event);

                    break;

                // 当触摸的时候

                case (MotionEvent.ACTION_MOVE):

                    Display("ACTION_MOVE", event);

                }

                return true;

            }

        });

    }

 

    public void Display(String eventType, MotionEvent event) {

        // 触点相对坐标的信息

        int x = (int) event.getX();

        int y = (int) event.getY();

        // 表示触屏压力大小

        float pressure = event.getPressure();

        // 表示触点尺寸

        float size = event.getSize();

        // 获取绝对坐标信息

        int RawX = (int) event.getRawX();

        int RawY = (int) event.getRawY();

 

        String msg = "";

 

        msg += "事件类型" + eventType + "\n";

        msg += "相对坐标" + String.valueOf(x) + "," + String.valueOf(y) + "\n";

        msg += "绝对坐标" + String.valueOf(RawX) + "," + String.valueOf(RawY)

                + "\n";

        msg += "触点压力" + String.valueOf(pressure) + ",";

        msg += "触点尺寸" + String.valueOf(size) + "\n";

        eventlable.setText(msg);

    }

 

    public int ProcessHistory(MotionEvent event) {

        int history = event.getHistorySize();

        for (int i = 0; i < history; i++) {

            long time = event.getHistoricalEventTime(i);

            float pressure = event.getHistoricalPressure(i);

            float x = event.getHistoricalX(i);

            float y = event.getHistoricalY(i);

            float size = event.getHistoricalSize(i);

        }

        return history;

    }

}

</span>

main.xml代码部分:

[html]
<span style="font-size:16px;"><?xml version="1.0" encoding="utf-8"?>  

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    android:orientation="vertical"  

    android:layout_width="fill_parent" 

    android:layout_height="fill_parent">  

    <TextView  

        android:id="@+id/touch_area"  

        android:layout_width="fill_parent" 

        android:layout_height="300dip"  

        android:background="#0FF" 

        android:textColor="#FFFFFF"  

        android:text="触摸事件测试区"  

        />  

    <TextView  

        android:id="@+id/history_label" 

        android:layout_width="fill_parent"  

        android:layout_height="wrap_content" 

        android:text="历史数据"  

        />  

    <TextView  

        android:id="@+id/event_label"  

        android:layout_width="fill_parent" 

        android:layout_height="wrap_content"  

        android:text="触摸事件:"  

        />  

</LinearLayout> 

</span>

摘自  北京大学-Google Android实验室

Android平台的事件处理机制和手指滑动例子的更多相关文章

  1. Android的Touch事件处理机制

    Android的Touch事件处理机制比较复杂,特别是在考虑了多点触摸以及事件拦截之后. Android的Touch事件处理分3个层面:Activity层,ViewGroup层,View层. 首先说一 ...

  2. Android的事件处理机制(一)------基于回调机制的事件处理

    Android平台的事件处理机制有两种,一种是基于回调机制的,一种是基于监听接口的,现介绍第一种:基于回调机制的事件处理.Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通 ...

  3. Android基础新手教程——3.1 基于监听的事件处理机制

    Android基础新手教程--3.1.1 基于监听的事件处理机制 标签(空格分隔): Android基础新手教程 本节引言: 第二章我们学习的是Android的UI控件,我们能够利用这些控件构成一个精 ...

  4. Android菜鸟的成长笔记(11)——Android中的事件处理

    原文:[置顶] Android菜鸟的成长笔记(11)——Android中的事件处理 Android提供了两种方式来处理事件,一个是基于回调的事件处理,另一个是基于监听的事件处理,举个例子: 基于回调的 ...

  5. 《React Native 精解与实战》书籍连载「Android 平台与 React Native 混合开发」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  6. Android的事件处理机制详解(二)-----基于监听的事件处理机制

    基于监听的事件处理机制 前言: 我们开发的app更多的时候是需要与用户的交互----即对用户的操作进行响应 这就涉及到了android的事件处理机制; android给我们提供了两套功能强大的处理机制 ...

  7. Android事件处理机制

    包括监听和回调两种机制. 1. 基于监听的事件处理: 事件监听包含三类对象,事件源,事件,事件监听器.Android的事件处理机制是一种委派式(Delegation)事件处理方式:普通组件(事件源)将 ...

  8. Android的两种事件处理机制

    UI编程通常都会伴随事件处理,Android也不例外,它提供了两种方式的事件处理:基于回调的事件处理和基于监听器的事件处理. 对于基于监听器的事件处理而言,主要就是为Android界面组件绑定特定的事 ...

  9. Android 平台 Native 代码的崩溃捕获机制及实现

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/g-WzYF3wWAljok1XjPoo7w 一.背景 ...

随机推荐

  1. (转)iOS7界面设计规范(11) - UI基础 - 图标与图形

    不知别人如何,我自己来讲,平时很习惯很有动力去做的一些事,譬如博客吧,一旦生活中出现一些让自己很难受的状况,就很容易受到影响:像是,你平时所习惯的生活状态都是基于某种东西的,一旦这种东西崩塌,会影响到 ...

  2. AngularJs学习笔记1——入门知识

    1.什么是AngularJs          AngularJs 诞生于2009年,由Misko Hevery 等人创建,后被Google收购,是一个优秀的Js框架,用于SPA(single pag ...

  3. 通向码农的道路(enet开源翻译计划 一)

    QQ 324186207群 enet交流技术.主要是为了研究tcp内部执行机制,欢迎大家增加探讨.小弟水平有限.翻译难免有误. . Features: ENet evolved specificall ...

  4. Python源码学习之初始化(三)-PyDictObject的初始化

    先来看它的定义 typedef struct _dictobject PyDictObject; struct _dictobject { PyObject_HEAD Py_ssize_t ma_fi ...

  5. JMeter数据库性能测试

    要测试一个服务器的性能,客户要求向数据库内 1000/s(每插入一千条数据)的处理能力 前提条件:一个数据库:test   数据库下面有一张表:user   表中有两个字段:username.pass ...

  6. 使用Qt Style Sheets制作UI特效

    引言 作为一套GUI框架,Qt是非常强大的.(注:Qt 不仅是一套优秀的GUI框架,同时也是一套出色的应用程序框架).在UI的制作方面Qt为广大开发者提供了一套强大而易用的工具,她就是——Qt Sty ...

  7. [MVC4-基礎] 連動DropDownList - 使用jQuery、JSON

    剛開始學MVC4,以下是一些基礎的學習筆記! 先展示一下結果: 1.選擇申請部門 2.選好後申請部門鎖住防止USER修改並載入該部門所擁有的設備類型 一.資料庫 dept mf_fx 二.View ( ...

  8. 将16进制(HTML)颜色值转换成 Color类型

    private void btnChangeColor_Click(object sender, EventArgs e) { txtColor.BackColor = ColorTranslator ...

  9. StartService与BindService

    效果图 MainActivity.java package com.wangzhen.servicedemo; import com.lidroid.xutils.ViewUtils; import ...

  10. IOS中对于一些控件的抖动效果

    这两天在网上看到一个帖子讨论关于有些app 输入账密时候 错误的话会有抖动效果出现,然后自己琢磨了下如何实现,下面上代码!!! 首先 写一个UIView的分类 #import <UIKit/UI ...