在android下,事件的发生是在监听器下进行,android系统能够响应按键事件和触摸屏事件。事件说明例如以下:

onClick(View v)一个普通的点击button事件

boolean onKeyMultiple(int keyCode,int repeatCount,KeyEvent event)用于在多个事件连续时发生,用于按键反复,必须重载@Override实现

boolean onKeyDown(int keyCode,KeyEvent event)用于在按键进行按下时发生

boolean onKeyUp(int keyCode,KeyEvent event)用于在按键进行释放时发生

onTouchEvent(MotionEvent event)触摸屏事件,当在触摸屏上有动作时发生

boolean onKeyLongPress(int keyCode, KeyEvent event)当你长时间按时发生

对于这几个函数的实例

首先我们建立一个android项目,当项目建立好之后,直接在默认的main.xml文件里拖放一个button按钮。其它的不须要在这里做什么了,然后就能够到命名好的.java文件里进行先关代码的书写。

1.    对要使用的控件进行引用。当然你也能够用到的时候再在相关类控件加入引用

import android.app.Activity;

import android.os.Bundle;

import android.view.KeyEvent;

import android.view.MotionEvent;

import android.view.View;

import android.widget.Button;

import android.widget.Toast;

2.    获得相关对象。设置控件监听器

Button button=(Button) findViewById(R.id.button1);

//设置监听

button.setOnClickListener(newButton.OnClickListener()

{

@Override

publicvoid
onClick(View v) {

//TODO
Auto-generated method stub

DisplayToast("事件触发成功");

}

});

请注意这里末尾使用的是分号“。这里就是获得button的实例,然后对他进行监听,当用户点击时就会发生onClick事件,这里还用到一个方法,就是显示一个短消息,在屏幕停留几秒钟就会自己主动消失。其方法例如以下:

publicvoid
DisplayToast(String str)

{

Toast.makeText(this,
str, Toast.LENGTH_SHORT).show();

}

当然你也能够设置显示长点。即Toast.LENGTH_SHORT改为Toast.LENGTH_LONG

3.    当按键按下是发生的事件

public boolean onKeyDown(int keyCode,KeyEvent event)

{

switch(keyCode)

{

case KeyEvent.KEYCODE_0:

DisplayToast("你按下数字键0");

break;

case KeyEvent.KEYCODE_DPAD_CENTER:

DisplayToast("你按下中间键");

break;sss

case KeyEvent.KEYCODE_DPAD_DOWN:

DisplayToast("你按下下方向键");

break;

case KeyEvent.KEYCODE_DPAD_LEFT:

DisplayToast("你按下左方向键");

break;

case KeyEvent.KEYCODE_DPAD_RIGHT:

DisplayToast("你按下右方向键");

break;

case KeyEvent.KEYCODE_DPAD_UP:

DisplayToast("你按下上方向键");

break;

case KeyEvent.KEYCODE_ALT_LEFT:

DisplayToast("你按下组合键alt+←");

break;

}

return super.onKeyDown(keyCode, event);

}

这里全部的keyCode都囊括了,这仅仅是几个比較典型的样例,效果例如以下:

4.        当按键弹起时发生的事件。代码例如以下:

publicboolean
onKeyUp(int keyCode,KeyEvent event)

{

switch(keyCode)

{

case KeyEvent.KEYCODE_0:

DisplayToast("松开数字键0");

break;

case KeyEvent.KEYCODE_DPAD_CENTER:

DisplayToast("松开中间键");

break;

case KeyEvent.KEYCODE_DPAD_DOWN:

DisplayToast("松开下方向键");

break;

case KeyEvent.KEYCODE_DPAD_LEFT:

DisplayToast("松开左方向键");

break;

case KeyEvent.KEYCODE_DPAD_RIGHT:

DisplayToast("松开右方向键");

break;

case KeyEvent.KEYCODE_DPAD_UP:

DisplayToast("松开上方向键");

break;

case KeyEvent.KEYCODE_ALT_LEFT:

DisplayToast("松开组合键alt+←");

break;

}

returnsuper.onKeyUp(keyCode,
event);

}

效果与上图类似,仅仅是文字不一样

5.        触摸屏事件。当用手或者用笔在触摸屏上做动作是发生,相关代码例如以下:

    public boolean onTouchEvent(MotionEvent event)

    {

        int Action = event.getAction();

        float X = event.getX();

        float Y = event.getY();

        mAction.setText("Action = " + Action);

        mPosition.setText("Position = (" + X + " , " + Y + ")");

        return true;

    }



当中 Action变量会得到三个返回值,代表三种不同的触摸阶段

Action = 0 : ACTION_DOWN

Action = 1 : ACTION_UP

Action = 2 。
ACTION_MOVE   就是拖动的感觉

6.        连续点击按键时发生的事件

Publicboolean onKeyMultiple(int keyCode,int repeatCount,KeyEvent event)

{

Return super.onKeyMultiple(keyCode, repeatCount, event);

}

Android onTouchEvent, onClick及onLongClick的调用机制

针对屏幕上的一个View控件。Android怎样区分应当触发onTouchEvent,还是onClick,亦或是onLongClick事件?

在Android中。一次用户操作能够被不同的View按次序分别处理。并将全然响应了用户一次UI操作称之为消费了该事件(consume),那么Android是按什么次序将事件传递的呢?

又在什么情况下判定为消费了该事件?

搞清楚这些问题对于编写出能正确响应UI操作的代码是非常重要的。尤其当屏幕上的不同View须要针对此次UI操作做出各种不同响应的时候更是如此,一个典型样例就是用户在桌面上放置了一个Widget,那么当用户针对widget做各种操作时,桌面本身有的时候要对用户的操作做出响应,有时忽略。

仅仅有搞清楚事件触发和传递的机制才有可能保证在界面布局非常复杂的情况下。UI控件仍然能正确响应用户操作。

1.  onTouchEvent

onTouchEvent中要处理的最经常使用的3个事件就是:ACTION_DOWN、ACTION_MOVE、ACTION_UP。

这三个事件标识出了最主要的用户触摸屏幕的操作。含义也非常清楚。

尽管大家天天都在用它们。可是有一点请留意,ACTION_DOWN事件作为起始事件,它的重要性是要超过ACTION_MOVE和ACTION_UP的,假设发生了ACTION_MOVE或者ACTION_UP,那么一定以前发生了ACTION_DOWN。

从Android的源码中能看到基于这样的不同重要性的理解而实现的一些交互机制,SDK中也有明白的提及,比如在ViewGroup的onInterceptTouchEvent方法中,假设在ACTION_DOWN事件中返回了true。那么兴许的事件将直接发给onTouchEvent。而不是继续发给onInterceptTouchEvent。

2.  onClick、onLongClick与onTouchEvent

以前看过一篇帖子提到,假设在View中处理了onTouchEvent,那么就不用再处理onClick了,由于Android仅仅会触发当中一个方法。这个理解是不太正确的,针对某个view,用户完毕了一次触碰操作。显然从传感器上得到的信号是手指按下和抬起两个操作,我们能够理解为一次Click,也能够理解为发生了一次ACTION_DOWN和ACTION_UP,那么Android是怎样理解和处理的呢?

在Android中。onClick、onLongClick的触发是和ACTION_DOWN及ACTION_UP相关的。在时序上,假设我们在一个View中同一时候覆写了onClick、onLongClick及onTouchEvent的话。onTouchEvent是最先捕捉到ACTION_DOWN和ACTION_UP事件的,其次才可能触发onClick或者onLongClick。基本的逻辑在View.java中的onTouchEvent方法中实现的:

case MotionEvent.ACTION_DOWN:

mPrivateFlags |= PRESSED;

refreshDrawableState();

if ((mViewFlags & LONG_CLICKABLE) == LONG_CLICKABLE) {

postCheckForLongClick();

break;

case MotionEvent.ACTION_UP:

if ((mPrivateFlags & PRESSED) != 0) {

boolean focusTaken = false;

if (isFocusable() && isFocusableInTouchMode() && !isFocused()) {

focusTaken = requestFocus();

if (!mHasPerformedLongPress) {

if (mPendingCheckForLongPress != null) {

removeCallbacks(mPendingCheckForLongPress);

if (!focusTaken) {

performClick();

break;

能够看到,Click的触发是在系统捕捉到ACTION_UP后发生并由performClick()运行的,performClick里会调用先前注冊的监听器的onClick()方法:

public boolean performClick() {

if (mOnClickListener != null) {

playSoundEffect(SoundEffectConstants.CLICK);

mOnClickListener.onClick(this);

return true;

return false;

LongClick的触发则是从ACTION_DOWN開始。由postCheckForLongClick()方法完毕:

private void postCheckForLongClick() {

mHasPerformedLongPress = false;

if (mPendingCheckForLongPress == null) {

mPendingCheckForLongPress = new CheckForLongPress();

mPendingCheckForLongPress.rememberWindowAttachCount();

postDelayed(mPendingCheckForLongPress, ViewConfiguration.getLongPressTimeout());

能够看到。在ACTION_DOWN事件被捕捉后,系统会開始触发一个postDelayed操作,delay的时间在Eclair2.1上为500ms,500ms后会触发CheckForLongPress线程的运行:

class CheckForLongPress implements Runnable {

public void run() {

if (isPressed() && (mParent != null)

&& mOriginalWindowAttachCount == mWindowAttachCount) {

if (performLongClick()) {

mHasPerformedLongPress = true;

假设各种条件都满足,那么在CheckForLongPress中运行performLongClick(),在这种方法中将调用onLongClick():

public boolean performLongClick() {

if (mOnLongClickListener != null) {

handled = mOnLongClickListener.onLongClick(View.this);

从实现中能够看到onClick()和onLongClick()方法是由ACTION_DOWN和ACTION_UP事件捕捉后依据各种情况终于确定是否触发的,也就是说假设我们在一个Activity或者View中同一时候监听或者覆写了onClick(),onLongClick()和onTouchEvent()方法,并不意味着仅仅会发生当中一种。

以下是一个onClick被触发的基本时序的Log:

04-05 05:57:47.123: DEBUG/TSActivity(209): onTouch ACTION_DOWN

04-05 05:57:47.263: DEBUG/TSActivity(209): onTouch ACTION_UP

04-05 05:57:47.323: DEBUG/TSActivity(209): onClick

能够看出是按ACTION_DOWN -> ACTION_UP -> onClick的次序发生的。

以下是一个onLongClick被触发的基本时序的Log:

04-05 06:00:04.133: DEBUG/TSActivity(248): onTouch ACTION_DOWN

04-05 06:00:04.642: DEBUG/TSActivity(248): onLongClick

04-05 06:00:05.083: DEBUG/TSActivity(248): onTouch ACTION_UP

能够看到。在保持按下的状态一定时间后会触发onLongClick,之后抬起手才会发生ACTION_UP。

3.  onClick和onLongClick能同一时候发生吗?

要弄清楚这个问题仅仅要理解Android对事件处理的所谓消费(consume)概念就可以。一个用户的操作会被传递到不同的View控件和同一个控件的不同监听方法处理,不论什么一个接收并处理了该次事件的方法假设在处理完后返回了true。那么该次event就算被全然处理了,其它的View或者监听方法就不会再有机会处理该event了。

onLongClick的发生是由单独的线程完毕的,而且在ACTION_UP之前,而onClick的发生是在ACTION_UP后。因此同一次用户touch操作就有可能既发生onLongClick又发生onClick。这样是不是不可思议?所以及时向系统表示“我已经全然处理(消费)了用户的此次操作”,是非常重要的事情。比如。我们假设在onLongClick()方法的最后return true。那么onClick事件就没有机会被触发了。

以下的Log是在onLongClick()方法return false的情况下,一次触碰操作的基本时序:

04-05 06:00:53.023: DEBUG/TSActivity(277): onTouch ACTION_DOWN

04-05 06:00:53.533: DEBUG/TSActivity(277): onLongClick

04-05 06:00:55.603: DEBUG/TSActivity(277): onTouch ACTION_UP

04-05 06:00:55.663: DEBUG/TSActivity(277): onClick

查看,在ACTION_UP还是触发后onClick()方法。

Android 屏幕实现水龙头事件的更多相关文章

  1. Android代码模拟物理、屏幕点击事件

    一.应用中模拟物理和屏幕点击事件 例如,模拟对某个view的点击事件 private void simulateClick(View view, float x, float y) { long do ...

  2. Android中的Touch事件

    Android中的Touch事件处理 主要内容 Activity或View类的onTouchEvent()回调函数会接收到touch事件. 一个完整的手势是从ACTION_DOWN开始,到ACTION ...

  3. 【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)

    来源:http://blog.csdn.net/zhaokaiqiang1992 更多:Android AutoLayout全新的适配方式, 堪称适配终结者 Android的屏幕适配一直以来都在折磨着 ...

  4. Android屏幕适配全攻略(最权威的官方适配指导)(转),共大家分享。

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...

  5. Android屏幕适配全攻略(最权威的官方适配指导) (转)

    招聘信息: Cocos2d-X 前端主程 [新浪微博]手机客户端iOS研发工程师 20k-40k iOS 开发工程师 iOS高级开发工程师(中国排名第一的企业级移动互联网云计算公司 和创科技 红圈营销 ...

  6. 【转】Android屏幕适配全攻略(最权威的官方适配指导)

    原文网址:http://blog.csdn.net/jdsjlzx/article/details/45891551 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的 ...

  7. Android屏幕适配全攻略(最权威的官方适配指导)

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入 ...

  8. Android 手势&触摸事件 MotionEvent

    1.http://blog.csdn.net/omg_2012/article/details/7881443 这篇相当好啊 2.http://blog.csdn.net/android_tutor/ ...

  9. Android 屏幕刷新机制

    这次就来梳理一下 Android 的屏幕刷新机制,把我这段时间因为研究动画而梳理出来的一些关于屏幕刷新方面的知识点分享出来,能力有限,有错的地方还望指点一下.另外,内容有点多,毕竟要讲清楚不容易,所以 ...

随机推荐

  1. sort 使用 tab键 作为 分隔符_人生如梦_百度空间

    sort 使用 tab键 作为 分隔符_人生如梦_百度空间 sort 使用 tab键 作为 分隔符 For some reason "\t" doesn't work right, ...

  2. js技术要点---JS 获取网页源代码

    JS 获取网页源代码 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html& ...

  3. 一种单片机支持WiFi的应用——SimpleWiFi在单片机中的应用

    一种单片机支持WiFi的应用——SimpleWiFi在单片机中的应用 先上图: 现在的智能控制都是基于微控制器,随着智能的手持终端的普及,基于智能终端的控制就会越来越普遍. WIFI便是其中的一种.W ...

  4. Powershell Mail module, 发送outbox 里的全部邮件(一个.csv文件代表一封邮件)

    把creating mail代码写到调用处,往outbox写入 mailxxx.csv文件,入面记录了邮件的主要内容 写入 #template $TMP = IMPORT-CSV "$($d ...

  5. PAT-B 1015. 德才论(同PAT 1062. Talent and Virtue)

    1. 在排序的过程中,注意边界的处理(小于.小于等于) 2. 对于B-level,这题是比較麻烦一些了. 源代码: #include <cstdio> #include <vecto ...

  6. hello MemSQL 入门安装演示样例

    一,介绍 MemSQL号称世界上最快的分布式关系型数据库,兼容mysql但快30倍,能实现每秒150万次事务.原理是仅用内存并将SQL预编译为C++. 二,部署 官网下载地址:http://www.m ...

  7. 开源图计算框架GraphLab介绍

    GraphLab介绍 GraphLab 是由CMU(卡内基梅隆大学)的Select 实验室在2010 年提出的一个基于图像处理模型的开源图计算框架.框架使用C++语言开发实现. 该框架是面向机器学习( ...

  8. android-包签名

    android-包签名 应用能在Android 系统上安装必须是经过有私有key的证书数据签名.Android系统通过证书确定应用的作者,和与应用建立信任关系.证书不会用于控制应用的安装.证书不需要权 ...

  9. 传京东副总裁蒉莺春或将接管POP业务-搜狐IT

    传京东副总裁蒉莺春或将接管POP业务-搜狐IT 传京东副总裁蒉莺春或将接管POP业务

  10. Android -&gt; 怎样避免Handler引起内存泄露

    很多其它内容,可訪问个人博客www.liangfeizc.com 错误代码 假设在Activiy中通过内部类(Runnable)的方式定义了一个变量runnable, final Runnable r ...