Android平台的事件处理机制和手指滑动例子

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经常会用到滑动的地方,所以下面叙述一下滑动的例子:

效果图:

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;
   
    }
   
}

main.xml代码部分:

<?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>
时间: 2024-10-29 19:20:20

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

Android的Touch事件处理机制

Android的Touch事件处理机制比较复杂,特别是在考虑了多点触摸以及事件拦截之后. Android的Touch事件处理分3个层面:Activity层,ViewGroup层,View层. 首先说一下Touch事件处理的几条基本规则. 1.如果在某个层级没有处理ACTION_DOWN事件,那么该层就再也收不到后续的Touch事件了直到下一次ACTION_DOWN事件. 说明:a.某个层级没有处理某个事件指的是它以及它的子View都没有处理该事件. b.这条规则不适用于Activity层(它是顶

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

Android平台的事件处理机制有两种,一种是基于回调机制的,一种是基于监听接口的,现介绍第一种:基于回调机制的事件处理.Android平台中,每个View都有自己的处理事件的回调方法,开发人员可以通过重写View中的这些回调方法来实现需要的响应事件.当某个事件没有被任何一个View处理时,便会调用Activity中相应的回调方法.Android提供了以下回调方法供用户使用:1. onKeyDown:   功能:该方法是接口KeyEvent.Callback中的抽象方法,所有的View全部实现了

Android基础入门教程——3.2 基于回调的事件处理机制

Android基础入门教程--3.2 基于回调的事件处理机制 标签(空格分隔): Android基础入门教程 本节引言 在3.1中我们对Android中的一个事件处理机制--基于监听的事件处理机制进行了学习,简单的说就是 为我们的事件源(组件)添加一个监听器,然后当用户触发了事件后,交给监听器去处理,根据不同的事件 执行不同的操作;那么基于回调的事件处理机制又是什么样的原理呢?好吧,还有一个问题:你知道 什么是方法回调吗?知道吗?相信很多朋友都是了解,但又说不出来吧!好了,带着这些疑问我们 对a

Android基础入门教程——3.1 基于监听的事件处理机制

Android基础入门教程--3.1.1 基于监听的事件处理机制 标签(空格分隔): Android基础入门教程 本节引言: 第二章我们学习的是Android的UI控件,我们可以利用这些控件构成一个精美的界面,但是仅仅是界面而已:下一步就要开始学习逻辑与业务实现了,本章节讲解的是Android的事件处理机制!何为事件处理机制?举个 简单的例子,比如点击一个按钮,我们向服务器发送登陆请求!当然,Android中的事件处理机制不止这一种, 比如屏幕发生选择,我们点击了屏幕上某个区域-简单点说,事件处

3.2 基于回调的事件处理机制

3.2 基于回调的事件处理机制 http://www.runoob.com/w3cnote/android-tutorial-callback-event-handle.html 1.什么是方法回调? 答:是将功能定义与功能分开的一种手段,一种解耦合的设计思想;在Java中回调是通过接口来实现的, 作为一种系统架构,必须要有自己的运行环境,且需要为用户提供实现接口;实现依赖于客户,这样就可以 达到接口统一,实现不同,系统通过在不同的状态下"回调"我们的实现类,从而达到接口和实现的分离!

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

基于监听的事件处理机制 前言: 我们开发的app更多的时候是需要与用户的交互----即对用户的操作进行响应 这就涉及到了android的事件处理机制; android给我们提供了两套功能强大的处理机制: ①基于监听的事件处理机制 ②基于回调的事件处理机制 在这一节中,我们会先介绍一下基于监听的事件处理机制 好了,废话不多说! 我们要先了解一下监听处理机制的模型 监听的处理模型: 处理模型图: 文字表述: 事件监听机制中由事件源,事件,事件监听器三类对象组成 处理流程: step 1:为某个事件源

Android事件处理机制

包括监听和回调两种机制. 1. 基于监听的事件处理: 事件监听包含三类对象,事件源,事件,事件监听器.Android的事件处理机制是一种委派式(Delegation)事件处理方式:普通组件(事件源)将整个事件处理委托给指定的对象(事件监听器):当该事件源发生指定的事件时,就通知所委托的事件监听器,由事件监听器来处理这个事件. 委派式事件处理方式类似于人类社会的分工协作.例如某单位发生火灾,该单位通常不自己处理该事件,而是通知消防局(事件监听器)去处理:发生治安事件,该单位通知公安局(事件监听器)

理解Android事件处理机制

Android的事件处理机制分为两大类:基于监听器和基于回调 1.基于监听器的事件处理 这种处理方式和Java的GUI组件监听器的几乎一样,是一种委托式的处理办法.即如果View组件(事件源)被单击或者长按(事件)后,系统将这个单击事件委托给特定对象(监听器)处理,特定对象可以是Listener对象也可以是组件指定的事件处理方法.这里涉及到三个成员:事件源,事件和监听器.其中监听器是核心,它包含了事件的处理的实现. 下面是一个简单的Button监听器,采用匿名内部类的实现形式.界面布局文件只是线

Android手指滑动切换页面

Android手指滑动切换页面 介绍:实现手指滑动切换页面,页面头部的tab下方出现一个条纹来显示当前页面.也可以点击tab来切换页面.可以更改tab的配色方案. 下载地址:http://www.devstore.cn/code/info/1080.html 运行截图: 热门源码下载: 高仿京东商城 Android快速开发不可或缺的11个工具类 Android快速开发框架LoonAndroid Android应用源码比较不错的新闻客户端 版权声明:本文为博主原创文章,未经博主允许不得转载.