事件处理

news/2024/11/9 20:43:08

activity和VIEW都能接收触摸和按键,如果响应事件只需要在继承类里复写事件函数即可

但是对于VIEW来说,我们如果不改变DRAW,不需要继承,所以如果想响应事件,则需要

当一个视图(如一个按钮)被触摸时,该对象上的 onTouchEvent() 方法会被调用。不过,为了侦听这个事件,你必须扩展这个类并重写该方法。很明显,扩展每个你想使用的视图对象(只是处理一个事件)是荒唐的。这就是为什么视图类也包含了一个嵌套接口的集合,这些接口含有实现起来简单得多的回调函数。这些接口叫做事件侦听器 event listeners ,是用来截获用户和你的界面交互动作的“门票”。

 1.只有一个ACTIVITY得情况:

    当鼠标键按下时(即触摸)

   首先触发dispatchTouchEvent

   然后触发onUserInteraction

   再次onTouchEvent

   如果是点击的话,紧跟着下列事件(点击分俩步,ACTION_DOWN,ACTION_up)

  触发dispatchTouchEvent

  再次onTouchEvent

  当ACTION_up事件时不会触发onUserInteraction(可查看源代码)

  当键盘按下时

 首先触发dispatchKeyEvent

 然后触发onUserInteraction

 再次onKeyDown

 如果按下紧接着松开,则是俩步

 紧跟着触发dispatchKeyEvent

 然后触发onUserInteraction

 再次onKeyUp

 注意与触摸不同,当松开按键时onUserInteraction也会触发。

   Activity.dispatchTouchEvent(MotionEvent) - 这允许你的活动可以在分发给窗口之前捕获所有的触摸事件。

(同理 dispatchKeyEvent)

onUserInteraction :Called whenever a key, touch, or trackball event is dispatched to the
     * activity.

2.activity里有一个LAYOUT,在布局里有个按钮。

如果在按钮上触发一个CLICK事件

首先触发ACTIVITY的dispatchTouchEvent

然后触发ACTIVITY的onUserInteraction

然后触发LAYOUT的dispatchTouchEvent

然后触发LAYOUT的onInterceptTouchEvent

然后触发BUTTON的onTouch(这是一个ACTION_DOWN事件)

紧跟着是一个ACTION_UP事件

触发ACTIVITY的dispatchTouchEvent

注意不再触发ACTIVITY的onUserInteraction,因为他对ACTION_UP不起作用。

然后触发LAYOUT的dispatchTouchEvent

然后触发LAYOUT的onInterceptTouchEvent

然后触发BUTTON的onTouch

最后触发BUTTON的onClick.

如果你在ONTOUCH事件里返回true,消费了此事件,那么ONCLICK将不会被响应

但是如果你不写ONCLICK事件,而ONTOUCH事件返回FLASE

那么最终事件序列:

11-23 17:19:44.313: INFO/activity(803): dispatchTouchEvent
11-23 17:19:44.313: INFO/activity(803): onUserInteraction
11-23 17:19:44.322: INFO/LinearLayout(803): dispatchTouchEvent
11-23 17:19:44.333: INFO/LinearLayout(803): onInterceptTouchEvent
11-23 17:19:44.341: INFO/button(803): onTouch 
11-23 17:19:44.441: INFO/activity(803): dispatchTouchEvent
11-23 17:19:44.451: INFO/LinearLayout(803): dispatchTouchEvent
11-23 17:19:44.451: INFO/LinearLayout(803): onInterceptTouchEvent
11-23 17:19:44.461: INFO/button(803): onTouch

即事件不会再向上传递,估计是ONCLICK有默认响应不处理,而ONCLICK不会有返回值。

但是如果是继承了一个VIEW而且又覆写了onTouchEvent,他返回FALSE

当触摸事件发生时

11-23 17:25:59.691: INFO/activity(831): dispatchTouchEvent
11-23 17:25:59.691: INFO/activity(831): onUserInteraction
11-23 17:25:59.701: INFO/LinearLayout(831): dispatchTouchEvent
11-23 17:25:59.701: INFO/LinearLayout(831): onInterceptTouchEvent
11-23 17:25:59.701: INFO/button(831): onTouch 
11-23 17:25:59.701: INFO/Button(831): onTouchEvent
11-23 17:25:59.701: INFO/LinearLayout(831): onTouchEvent
11-23 17:25:59.701: INFO/activity(831): onTouchEvent
11-23 17:25:59.822: INFO/activity(831): dispatchTouchEvent
11-23 17:25:59.822: INFO/activity(831): onTouchEvent

奇怪的是,ONCLICK事件不再发生。

VIEW和ACTIVITY本身都有相应键盘事件的ONKEYUP和ONKEYDOWN

对于VIEW来说,你可以setOnKeyListener(new OnKeyListener(){

            @Override
            public boolean onKey(

来响应键盘事件,如果你既对VIEW写了这个侦听,又覆写了ONKEYUP,DOWN事件,那么首先

进入ONKEY

比如用反向键把焦点切换到按钮上

事件序列:

11-23 17:23:14.392: INFO/activity(803): dispatchKeyEvent
11-23 17:23:14.404: INFO/activity(803): onUserInteraction
11-23 17:23:14.412: INFO/LinearLayout(803): dispatchKeyEvent
11-23 17:23:14.412: INFO/button(803): onKey
11-23 17:23:14.422: INFO/activity(803): onKeyUp

当按回车时

11-23 17:35:55.692: INFO/activity(831): dispatchKeyEvent
11-23 17:35:55.713: INFO/activity(831): onUserInteraction
11-23 17:35:55.722: INFO/LinearLayout(831): dispatchKeyEvent
11-23 17:35:55.732: INFO/button(831): onKey
11-23 17:35:55.813: INFO/activity(831): dispatchKeyEvent
11-23 17:35:55.824: INFO/activity(831): onUserInteraction
11-23 17:35:55.831: INFO/LinearLayout(831): dispatchKeyEvent
11-23 17:35:55.831: INFO/button(831): onKey
11-23 17:35:55.953: INFO/button(831): onClick

最后补充下:不需要那么复杂,如果对于控件想响应他的触摸事件,如果继承

则覆写ONTOUCHEVENT,如果不覆写则侦听ONTOUCH

如果覆写了ONTOUCHEVENT,则不再响应ONCLICK事件

如果写了ONCLICK,则不要再搞ONTOUCHEVENT了

所以ONCLICK和ONTOUCHEVENT二取一,另外如果有ONTOUCH侦听,那么此函数要先于其他函数执行

对于ONCLICK来说,要从头走俩便ONTOUCH,一次是DOWN,一次是UP

同样的对于ONKEY,以及ONKEYUP和DOWN

如果既覆写了ONKEYUODOWN,又SET了侦听ONKEY,那么ONKEY要优先执行,对于一个回车按键触发时

11-24 09:55:18.601: INFO/activity(951): dispatchKeyEvent
11-24 09:55:18.611: INFO/activity(951): onUserInteraction
11-24 09:55:18.621: INFO/LinearLayout(951): dispatchKeyEvent
11-24 09:55:18.641: INFO/button(951): onKey
11-24 09:55:18.711: INFO/activity(951): dispatchKeyEvent
11-24 09:55:18.756: INFO/activity(951): onUserInteraction
11-24 09:55:18.775: INFO/LinearLayout(951): dispatchKeyEvent
11-24 09:55:18.791: INFO/button(951): onKey
11-24 09:55:18.822: INFO/button(951): onClick

SDK中文事件处理:http://blog.csdn.net/iefreer/archive/2009/09/23/4586351.aspx


http://www.niftyadmin.cn/n/4487790.html

相关文章

comsol学习,群聊不能放过

群里面的公告,群资料,千万不能忽视,往往里面就藏着一些干货,而且一些优质的群里,会有大神帮助解答问题,日常遇到一些困难就可以向他们求助。 comsol电化学:610518825 comsol流体传动、传热&…

锂硫电池中不同商用集流体的性能差异分析

01 引言 商业化锂离子电池是使用石墨作为负极、锂离子嵌入型材料作为正极的储能器件。然而,其能量密度不能超过600 Wh kg−1,难以满足电动汽车的里程需求。锂硫电池因其低成本和高理论能量密度的特点,而被认为是极具前景的下一代电池。尽管…

PHP面试题详解

自己从网上找了几份常考到的PHP面试题进行了整理,然后才有了这份PHP面试题,并且我把所有的题目进行了详细分析和代码分析,希望可以对大家有帮助,谢谢大家。 这份试题我也上传到了百度云,有需要的可以直接去百度云下载这…

C++静态成员函数和变量

代码一: [cpp] view plaincopyprint? class Point{ public: void output() { } static void init() { } }; int main() { Point pt; pt.init(); pt.output(); } 代码二:[cpp] view …

有限元分析50年发展之路

计算机辅助工程(CAE)作为一门新兴的学科已经逐渐的走下神坛,成为了各大企业中设计新产品过程中不可缺少的一环。传统的CAE技术是指工程设计中的分析计算与分析仿真,具体包括工程数值分析、结构与过程优化设计、强度与寿命评估、运…

BestCoder Round #11 (Div. 2)

太菜&#xff0c;仅仅能去Div2.&#xff08;都做不完 ORZ。。。 各自是 HDU&#xff1a; 5054 Alice and Bob 5055 Bob and math problem 5056 Boring count 5057 Argestes and Sequence # 1001 碰面仅仅能在坐标中间。 所以推断一下就好了。 #include<cstdio> #includ…

通俗易懂:非线性与线性的区别是什么?

文章来源-公众号&#xff1a;有限元仿真分析 非线性是自然界复杂性的典型性质之一&#xff0c;那么你对非线性了解多少呢&#xff1f;以下可见一斑&#xff1a; 什么是非线性 非线性(non-linear)&#xff0c;即 变量之间的数学关系&#xff0c;不是直线而是曲线、曲面、或不确…

一个有N个整数元素的一维数组{A[0],A[1],....,A[N-1],A[N]},这个数组有很多连续的子数组,那么连续子数组之和的最大的一个的值是什么?...

1.动态规划的思想解决 /*** 在时间复杂度为O(N)内找出数组中最大的子序列的累加和*/public static int sumNum(int[] array) {int n array.length;int all array[n - 1], start array[n - 1];int count 0;for (int i n - 2; i > 0; i--) {if ((start array[i]) > a…