android详细解释键盘和鼠标事件

合集下载

android 事件传递原理

android 事件传递原理

android 事件传递原理Android是当前最流行的移动操作系统,它的事件传递机制是安卓开发中必须了解的一个问题。

本文将带您从简单到复杂的三个方面,逐步解析安卓事件传递的原理。

一、事件类型首先,我们需要知道Android事件的三大类型:1. 触摸事件:通过手指在屏幕上进行滑动、点击等手势操作触发。

2. 按键事件:用户在设备上的按键输入,如键盘、物理键等。

3. 轨迹球事件:主要针对轨迹球设备,但是由于这种设备很少被使用,所以这里不再深入讲解。

二、事件传递流程在了解了事件类型后,我们可以探讨一下事件传递的具体流程。

每一个事件都是通过ViewGroup或者View的dispatchTouchEvent()方法进行传递的。

我们可以将事件的传递过程抽象为TouchTarget链表。

当一个事件发生后,它会从Activity开始一层层向下传递,当找到能够处理该事件的View或ViewGroup时,则会调用其onTouchEvent()方法完成相应操作。

如果从顶层的ViewGroup开始寻找,当它的dispatchTouchEvent()方法返回true时,则整个事件处理结束。

如果返回false,则事件继续向下传递给下一个ViewGroup或View,直到找到可以处理这个事件的View为止。

由此可见,对于同一个事件,ViewGroup和父子View的处理有时是相互影响的,需要通过继承ViewGroup或者View,重写dispatchTouchEvent()和onTouchEvent()方法来控制事件传递的方式。

三、事件分发机制实际上,在ViewGroup中,事件传递机制涉及到的方法有三个:1. dispatchTouchEvent():负责分发事件。

2. onInterceptTouchEvent():拦截事件,阻止向下分发。

3. onTouchEvent():接收分发下来的事件。

其中,事件分发有三个阶段:1. 捕获阶段:事件从Activity传递到最外层的ViewGroup。

第2章 键盘和鼠标事件

第2章 键盘和鼠标事件
例:当用户在TextBox1中按下〈Ctrl〉+〈Shift〉+〈Alt〉+ 当用户在TextBox1中按下〈Ctrl〉 TextBox1中按下 Shift〉 Alt〉 F10〉键时结束运行。 〈F10〉键时结束运行。 If e.KeyCode = Keys.F10 AndAlso (e.Alt OrElse e.Control OrElse e.Shift) Then End End If
2.1
2.1.1 KeyPress事件 KeyPress事件
键盘事件
键盘事件:将窗体的KeyPreview属性设置为True KeyPreview属性设置为True。 键盘事件:将窗体的KeyPreview属性设置为True。 KeyPress事件中有一个参数 KeyPress事件中有一个参数e,是系统定义的 事件中有一个参数e System.Windows.Forms.KeyEventArgs类 System.Windows.Forms.KeyEventArgs类,它的 KeyChar属性返回用户所按键的字符 属性返回用户所按键的字符。 KeyChar属性返回用户所按键的字符。 1. 判断、处理用户按键 判断、
第 2 章
键盘和鼠标事件
本章讲述的主要内容
2.1 键盘事件 2.2 鼠标事件
第 2 章
1.键盘事件: 1.键盘事件: 键盘事件
键盘和鼠标事件
KeyPress:按下某ASCII字符键。 KeyPress:按下某ASCII字符键。 ASCII字符键 KeyDown:按下任意键。 KeyDown:按下任意键。 KeyUp:释放键盘上的任意键。 KeyUp:释放键盘上的任意键。
2.1
2.1.1 KeyPress事件 KeyPress事件
键盘事件

键盘和鼠标事件

键盘和鼠标事件

例如:直接按光标键时移动图片的位置,按 下Shift键再按光标键时放缩图片,按 Shift+Ctrl键时复位图片的位置及大小。 将窗体的KeyPreview属性设置为True Image1的Strech属性设置为True.

Private Sub Form_Load() Label1.Caption = "直接按光标键移动图片,按下 Shift键再按光标键放缩图片,按Shift+Ctrl键复 位图片。" End Sub Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) If Shift = 3 Then Image1.Move 2000, 1000, 1000, 1000 '复位图 片 End If
KeyPress事件中得到的是按键对应的字符 的ASCII码(KeyAscii) KeyUp,KeyDown事件中得到的是按键对应 的键号(KeyCode),键盘104个键都对应着 唯一的键号。

KeyPress事件 对象的KeyPress事件过程的一般格式为:
Privat Sub Object_KeyPress(KeyAscii As Integer)
Function ShiftStatus(Shift As Integer) As String Select Case Shift Case 0: s = "" Case 1: s = “Shift+" Case 2: s = "Ctrl+" Case 3: s = "Shift+Ctrl+" Case 4: s = "Alt+" Case 5: s = "Shift+Alt+" Case 6: s = "Ctrl+Alt+" Case 7: s = "Shift+Ctrl+Alt+" End Select ShiftStatus = s End Function

鼠标和键盘事件

鼠标和键盘事件

第14页
5、标签数组的使用 Label[] lblArray; lblArray; lblArray = new Label[] { label1, label4, label5, label4 label5 label6 label7 label8 label6, label7, label8 }; 将所有label1的地方外层加循环 的地方外层加循环, label1改为 将所有label1的地方外层加循环,将label1改为 lblArray[i]
第9页
【打字游戏】 打字游戏】
要使窗体在可以获得焦点的控件之前截获键盘事件, 要使窗体在可以获得焦点的控件之前截获键盘事件, 应该将窗体的KeyPreview属性设为 属性设为true。 应该将窗体的 属性设为 。 (1)窗体的KeyPreview属性设为 )窗体的 属性设为true 属性设为 (2)int score //表示得分 ) 表示得分
第11页
2、标签上文字的获取 假设范围为英文字母A 假设范围为英文字母A—Z。 Random aa=new Random(); label1.Text= ( (char) aa.Next(65,91)).ToString();
第12页
3、键盘事件 private void Form1_KeyPress(object sender, KeyPressEventArgs e) { if (e.KeyChar == char.Parse(label1.Text) || e.KeyChar == char.Parse(label1.Text.ToLower())) { score += 10; label3.Text = score.ToString(); label1.Text = ((char)aa.Next(65, 91)).ToString(); label1.Top = 20问题 1、鼠标的位置 、 2、哪个鼠标按键按动 、

Android按键事件处理流程--KeyEvent

Android按键事件处理流程--KeyEvent

Android按键事件处理流程--KeyEvent 刚接触Android开发的时候,对touch、key事件的处理总是⼀知半解,⼀会是Activity⾥的⽅法,⼀会是各种View中的,⾃⼰始终不清楚到底哪个在先哪个在后,总之对整个处理流程没能很好的把握。

每次写这部分代码的时候都有些⼼虚,因为我不是很清楚什么时候、以什么样的顺序被调⽤,⼤都是打下log看看,没问题就算ok了。

但随着时间流逝,这种感觉⼀直折磨着我。

期间也在⽹上搜索了相关资料,但总感觉不是那么令⼈满意。

⾃打开始研究Android源码起,这部分内容的分析早就被列在我的TODO list上了。

因为弄懂这部分处理逻辑对明明⽩⽩地写android程序实在是太重要了,所以今天我就带领⼤家看看这部分的处理逻辑。

touch事件的处理我将放在另⼀篇博客中介绍(相⽐KeyEvent,⼤体都⼀样,只是稍微复杂些)。

为了突出本⽂的重点,我们直接从事件被派发到View层次结构的根节点DecorView开始分析,这⾥我们先来看看DecorView# dispatchKeyEvent⽅法,代码如下:@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {final int keyCode = event.getKeyCode();final int action = event.getAction();final boolean isDown = action == KeyEvent.ACTION_DOWN;/// 1. 第⼀次down事件的时候,处理panel的快捷键if (isDown && (event.getRepeatCount() == 0)) {// First handle chording of panel key: if a panel key is held// but not released, try to execute a shortcut in it.if ((mPanelChordingKey > 0) && (mPanelChordingKey != keyCode)) {boolean handled = dispatchKeyShortcutEvent(event);if (handled) {return true;}}// If a panel is open, perform a shortcut on it without the// chorded panel keyif ((mPreparedPanel != null) && mPreparedPanel.isOpen) {if (performPanelShortcut(mPreparedPanel, keyCode, event, 0)) {return true;}}}/// 2. 这⾥是我们本⽂的重点,当window没destroy且其Callback⾮空的话,交给其Callback处理if (!isDestroyed()) { // Activity、Dialog都是Callback接⼝的实现final Callback cb = getCallback(); // mFeatureId < 0 表⽰是application的DecorView,⽐如Activity、Dialogfinal boolean handled = cb != null && mFeatureId < 0 ? cb.dispatchKeyEvent(event) // 派发给callback的⽅法: super.dispatchKeyEvent(event); // 否则直接派发到ViewGroup#dispatchKeyEvent(View层次结构)if (handled) {return true; // 如果被上⾯的步骤处理了则直接返回true,不再往下传递}}/// 3. 这是key事件的最后⼀步,如果到这⼀步还没处理掉,则派发到PhoneWindow对应的onKeyDown, onKeyUp⽅法return isDown ? PhoneWindow.this.onKeyDown(mFeatureId, event.getKeyCode(), event): PhoneWindow.this.onKeyUp(mFeatureId, event.getKeyCode(), event);} 接下来我们按照这个派发顺序依次来看看相关⽅法的实现,这⾥先看看Activity(Callback)的dispatchKeyEvent实现:/*** Called to process key events. You can override this to intercept all* key events before they are dispatched to the window. Be sure to call* this implementation for key events that should be handled normally.** @param event The key event.** @return boolean Return true if this event was consumed.*/@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {/// 2.1. 回调接⼝,实际开发中⽤处不⼤,你感兴趣可以参看其⽅法doconUserInteraction();Window win = getWindow();/// 2.2. 从这⾥事件的处理交给了与之相关的window对象,实质是派发到了view层次结构if (win.superDispatchKeyEvent(event)) {return true; // 被view层次结构处理掉了则直接返回true}View decor = mDecor;if (decor == null) decor = win.getDecorView();/// 2.3. 到这⾥如果view层次结构没处理则交给KeyEvent本⾝的dispatch⽅法,Activity的各种回调⽅法会被触发return event.dispatch(this, decor != nulldecor.getKeyDispatcherState() : null, this);}紧接着我们看看,Window#superDispatchKeyEvent⽅法,相关代码如下:<!-- Window.java -->/*** Used by custom windows, such as Dialog, to pass the key press event* further down the view hierarchy. Application developers should* not need to implement or call this.**/public abstract boolean superDispatchKeyEvent(KeyEvent event);<!-- PhoneWindow.java -->@Overridepublic boolean superDispatchKeyEvent(KeyEvent event) {return mDecor.superDispatchKeyEvent(event);}<!-- DecorView.superDispatchKeyEvent --> public boolean superDispatchKeyEvent(KeyEvent event) {/// 2.2.1. 进⼊view层次结构了,即调⽤ViewGroup的对应实现了。

关于捕获android系统鼠标轨迹和键盘key值

关于捕获android系统鼠标轨迹和键盘key值

-------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------目录一、找出设备中,我用的是什么event? (2)二、对input_event数据结构的解释 (3)1、code: (4)2、type: (4)3、value: (5)三、抓取event值的原理: (5)1、打开event设备 (5)2、read 设备 (5)3、判断是什么事件 (6)4、保存您想要的键盘值,(相对/绝对)x,y 的值。

(6)5、键盘映射 (6)四、如何在Android系统上使用程序,并抓到我们需要的值? (6)五、附录key转换表 (7)一、找出设备中,我用的是什么event?关于该设备打开的是哪个event,我们可以通过命令,cat /proc/bus/input/devices 来查看,执行这个命令后,你会看到您的设备上有多少eventX。

root@lenovo-desktop:~# cat /proc/bus/input/devicesI: Bus=0019 V endor=0000 Product=0001 Version=0000N: Name="Power Button"P: Phys=PNP0C0C/button/input0S: Sysfs=/devices/LNXSYSTM:00/LNXSYBUS:00/PNP0C0C:00/input/input0U: Uniq=H: Handlers=kbd event0B: EV=3B: KEY=100000 0 0 0I: Bus=0019 V endor=0000 Product=0001 Version=0000N: Name="Power Button"P: Phys=LNXPWRBN/button/input0S: Sysfs=/devices/LNXSYSTM:00/LNXPWRBN:00/input/input1U: Uniq=H: Handlers=kbd event1B: EV=3B: KEY=100000 0 0 0I: Bus=0017 V endor=0001 Product=0001 Version=0100N: Name="Macintosh mouse button emulation"P: Phys=S: Sysfs=/devices/virtual/input/input2U: Uniq=H: Handlers=mouse0 event2B: EV=7B: KEY=70000 0 0 0 0 0 0 0 0B: REL=3I: Bus=0011 Vendor=0001 Product=0001 Version=ab41N: Name="AT Translated Set 2 keyboard"P: Phys=isa0060/serio0/input0S: Sysfs=/devices/platform/i8042/serio0/input/input3U: Uniq=H: Handlers=kbd event3B: EV=120013B: KEY=4 2000000 3803078 f800d001 feffffdf ffefffff ffffffff fffffffeB: MSC=10B: LED=7I: Bus=0003 V endor=17ef Product=600e V ersion=0111N: Name="Lenovo Optical Mouse"P: Phys=usb-0000:00:1d.1-1/input0S: Sysfs=/devices/pci0000:00/0000:00:1d.1/usb3/3-1/3-1:1.0/input/input4U: Uniq=H: Handlers=mouse1 event4B: EV=17B: KEY=70000 0 0 0 0 0 0 0 0B: REL=103B: MSC=10…..…..我的ubunte系统上敲完这个命令后,能够看到event0—event7,共8个设备。

Android按键事件处理流程 -- KeyEvent

Android按键事件处理流程 -- KeyEvent

Android按键事件处理流程 -- KeyEvent2014/6/24 13:18:58 xiaoweiz 程序员俱乐部我要评论(0)•••刚接触Android开发的时候,对touch、key事件的处理总是一知半解,一会是Activity里的方法,一会是各种View中的,自己始终不清楚到底哪个在先哪个在后,总之对整个处理流程没能很好的把握。

每次写这部分代码的时候都有些心虚,因为我不是很清楚什么时候、以什么样的顺序被调用,大都是打下log看看,没问题就算ok了。

但随着时间流逝,这种感觉一直折磨着我。

期间也在网上搜索了相关资料,但总感觉不是那么令人满意。

自打开始研究Android源码起,这部分内容的分析早就被列在我的TODO list上了。

因为弄懂这部分处理逻辑对明明白白地写android程序实在是太重要了,所以今天我就带领大家看看这部分的处理逻辑。

touch事件的处理我将放在另一篇博客中介绍(相比KeyEvent,大体都一样,只是稍微复杂些)。

为了突出本文的重点,我们直接从事件被派发到View层次结构的根节点DecorView 开始分析,这里我们先来看看DecorView#dispatchKeyEvent方法,代码如下:@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {final int keyCode = event.getKeyCode();final int action = event.getAction();final boolean isDown = action == KeyEvent.ACTION_DOWN;/// 1. 第一次down事件的时候,处理panel的快捷键if (isDown && (event.getRepeatCount() == 0)) {// First handle chording of panel key: if a panel key is held // but not released, try to execute a shortcut in it.if ((mPanelChordingKey > 0) && (mPanelChordingKey != keyCode)) {boolean handled = dispatchKeyShortcutEvent(event);if (handled) {return true;}}// If a panel is open, perform a shortcut on it without the // chorded panel keyif ((mPreparedPanel != null) && mPreparedPanel.isOpen) { if (performPanelShortcut(mPreparedPanel, keyCode, event, 0)) {return true;}}}/// 2. 这里是我们本文的重点,当window没destroy且其Callback 非空的话,交给其Callback处理if (!isDestroyed()) { // Activity、Dialog都是Callback接口的实现final Callback cb = getCallback(); // mFeatureId < 0 表示是application的DecorView,比如Activity、Dialogfinal boolean handled = cb != null && mFeatureId < 0 ? cb.dispatchKeyEvent(event) // 派发给callback的方法: super.dispatchKeyEvent(event); // 否则直接派发到ViewGroup#dispatchKeyEvent(View层次结构)if (handled) {return true; // 如果被上面的步骤处理了则直接返回true,不再往下传递}}/// 3. 这是key事件的最后一步,如果到这一步还没处理掉,则派发到PhoneWindow对应的onKeyDown, onKeyUp方法return isDown ? PhoneWindow.this.onKeyDown(mFeatureId, event.getKeyCode(), event): PhoneWindow.this.onKeyUp(mFeatureId,event.getKeyCode(), event);}接下来我们按照这个派发顺序依次来看看相关方法的实现,这里先看看Activity(Callback)的dispatchKeyEvent实现:/*** Called to process key events. You can override this to intercept all* key events before they are dispatched to the window. Be sure to call* this implementation for key events that should be handled normally. ** @param event The key event.** @return boolean Return true if this event was consumed.*/@Overridepublic boolean dispatchKeyEvent(KeyEvent event) {/// 2.1. 回调接口,实际开发中用处不大,你感兴趣可以参看其方法doc onUserInteraction();Window win = getWindow();/// 2.2. 从这里事件的处理交给了与之相关的window对象,实质是派发到了view层次结构if (win.superDispatchKeyEvent(event)) {return true;}View decor = mDecor;if (decor == null) decor = win.getDecorView();/// 2.3. 到这里如果view层次结构没处理则交给KeyEvent本身的dispatch方法,Activity的各种回调方法会被触发return event.dispatch(this, decor != nulldecor.getKeyDispatcherState() : null, this);}紧接着我们看看,Window#superDispatchKeyEvent方法,相关代码如下:<!-- Window.java -->/*** Used by custom windows, such as Dialog, to pass the key press event * further down the view hierarchy. Application developers should * not need to implement or call this.**/public abstract boolean superDispatchKeyEvent(KeyEvent event);<!-- PhoneWindow.java -->@Overridepublic boolean superDispatchKeyEvent(KeyEvent event) {return mDecor.superDispatchKeyEvent(event);}<!-- DecorView.superDispatchKeyEvent -->public boolean superDispatchKeyEvent(KeyEvent event) {/// 2.2.1. 进入view层次结构了,即调用ViewGroup的对应实现了。

第7章 鼠标和键盘事件过程

第7章 鼠标和键盘事件过程

第 7.3.1 与拖放有关的属性、事件和方法 七 章 2.拖放的事件 鼠 (1)DragDrop事件 DragDrop事件,在一个完整的拖放过程(即将一个源控件拖 标 动到一个目标对象上,并释放鼠标按钮)完成后发生;或者使 用对象的Drag方法时,并将其action参数设置为2时,该事件发 和 生。 键 DragDrop事件过程的功能是用来控制在一个拖动操作完成时 将会发生的情况,格式如下: 盘 Private Sub对象_DragDrop(Source As Control,X As Single,Y 事 As Single) 其中,source表示正在被拖动的源控件。当source参数中可能 件 会使用多种类型的控件时,应使用TypeOf关键字和If语句一起 过 确定其具体类型。参数X,Y返回鼠标指针当前位置。 程
第 七 章 鼠 标 和 键 盘 事 件 过 程
7.2 键盘事件
7.2.1 KeyPress事件
7.2.2 KeyDown和KeyUp事件
第 七 章 鼠 标 和 键 盘 事 件 过 程
第 7.2.1 KeyPress事件 七 章 KeyPress事件,是用户在对象上使用键盘完成的一次完 鼠 整按键操作(包括按下和释放键盘上按键)所触发的事件。 能够识别KeyPress的对象必须在按键操作时具有焦点。标 必须注意的是,只有数字、字母符号、【Tab】、 和 【Enter】、和【Backspace】等按键才能触发KeyPress 键 事件。 KeyPress事件过程的语法格式如下: 盘 Private Sub对象名_ KeyPress(KeyAscii As Integer) 事 …… 件 End Sub 过 程
第 七 章 2. KeyUp 事件 鼠 KeyUp事件,是用户在具有焦点的对象上释放键盘按键的操 作。键盘上的任意按键都可以触发KeyUp事件。 标 KeyUp事件能够识别出的信息包括: 和 ①事件发生在哪个对象上; 键 ②被释放键在键盘上的物理位置; ③有没有同时按住键盘上的【Shift】等控制键。 盘 其事件过程的语法格式如下: 事 Private Sub 对象名_KeyUp(KeyCode As Integer, Shift As Integer) 件 …… 过 End Sub 程

android键盘和触摸事件先后顺序处理

android键盘和触摸事件先后顺序处理

android键盘和触摸事件先后顺序处理activity和VIEW都能接收触摸和按键,如果响应事件只需要在继承类里复写事件函数即可但是对于VIEW来说,我们如果不改变DRAW,不需要继承,所以如果想响应事件,则需要当一个视图(如一个按钮)被触摸时,该对象上的 onT ouchEvent() 方法会被调用。

不过,为了侦听这个事件,你必须扩展这个类并重写该方法。

很明显,扩展每个你想使用的视图对象(只是处理一个事件)是荒唐的。

这就是为什么视图类也包含了一个嵌套接口的集合,这些接口含有实现起来简单得多的回调函数。

这些接口叫做事件侦听器 event listeners ,是用来截获用户和你的界面交互动作的“门票”。

1.只有一个ACTIVITY得情况:当鼠标键按下时(即触摸)首先触发dispatchT ouchEvent然后触发onUserInteraction再次onT ouchEvent如果是点击的话,紧跟着下列事件(点击分俩步,ACTION_DOWN,ACTION_up)触发dispatchT ouchEvent再次onT ouchEvent当ACTION_up事件时不会触发onUserInteraction(可查看源代码)当键盘按下时首先触发dispatchKeyEvent然后触发onUserInteraction再次onKeyDown如果按下紧接着松开,则是俩步紧跟着触发dispatchKeyEvent然后触发onUserInteraction再次onKeyUp注意与触摸不同,当松开按键时onUserInteraction也会触发。

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

(同理 dispatchKeyEvent)onUserInteraction :Called whenever a key, touch, or trackball event is dispatched to the* activity.2.activity里有一个LAYOUT,在布局里有个按钮。

模拟键盘鼠标事件

模拟键盘鼠标事件

android中的MotionEvent 及其它事件处理2014-09-18 08:47 7386人阅读评论(0) 收藏举报MotionEvent对象当用户触摸屏幕时将创建一个MotionEvent对象。

MotionEvent包含关于发生触摸的位置和时间等细节信息。

MotionEvent对象被传递到程序中合适的方法比如View对象的onTouchEvent()方法中。

在这些方法中我们可以分析MotionEvent对象那个,以决定要执行的操作。

MotionEvent对象是与用户触摸相关的时间序列,该序列从用户首次触摸屏幕开始,经历手指在屏幕表面的任何移动,直到手指离开屏幕时结束。

手指的初次触摸(ACTION_DOWN 操作),滑动(ACTION_MOVE操作)和抬起(ACTION_UP)都会创建MotionEvent对象。

所以每次触摸时候这三个操作是肯定发生的,而在移动过程中会产生大量事件,每个事件都会产生对应的MotionEvent对象记录发生的操作,触摸的位置,使用的多大压力,触摸的面积,合适发生,以及最初的ACTION_DOWN和时发生等相关的信息。

在设置事件时我们有2种设置的方式,一种是委托式一种是回调式。

第一种就是将事件的处理委托给监听器处理,你可以定义一个View.OnTouchListener接口的子类作为监听器,其中有onTouch()方法。

而第二种是重写View类自己本身的onTouchEvent方法,也就是控件自己处理事件。

onTouch方法接收一个MotionEvent参数和一个View参数,而onTouchEvent方法仅接收MotionEvent参数。

这是因为监听器可以监听多个View 控件的事件。

通过MotionEvent方法getation可以得到该Motionevent具体是哪个操作如ACTION_DOWN。

1、MotionEvent中getAction()与getActionMasked()的区别如果我们在监听Ontouch()里面测试的时候会发现,这两个返回值竟然是一样的。

android触摸事件详解(完结)

android触摸事件详解(完结)

android触摸事件详解(完结)冲突的原因 电脑本来设计好了最简单的规则,down事件碰到哪个控件,哪个控件就接收全部事件,是原始的以⼈为本!但⼈偏偏喜欢打破规则。

或者是偷懒,便捷缘故,如scrollView.不需要设计旁边下拉条。

⼈就想往中间拉,管你碰到中间什么控件,我就要滑动的事件。

为什么电脑端没有这么多冲突?因为电脑端时代,是键盘,和⿏标,⼈还算守规则,要滑动,⽤滚动条啊,有了触摸后。

拉什么拉,我要流的滑。

所以出现了截断,截断就像是潘多拉之盒,虽然有了截断的便利,也带来了世界的混乱。

因为事件的处理是从控件树的上层到下层,截断后,上下之间顺序优先独占,虽然对于scorllview,⼤部分是ok的。

但有时候这⼜和我们⼈类感觉的不匹配。

为什么下滑⾥⾯的不让下滑,因为下滑不知道⾥⾯还有下滑啊,下滑必须掌控下滑动作。

不⾏,下滑碰到下滑,要给⾥⾯下滑。

等等。

所以才会产⽣控件间事件该如何分配的问题。

所以总结电脑的设计(⽆冲突,有时候不那么⽅便):down碰到谁给谁,铁⼀般的纪律。

要滑动,⽤滚动条。

⼈类的感觉(全部截断):0.有时候,⼿碰到了⼦控件,还是要把事件给上层,所以就产⽣了截断,打开了混乱的源头。

如scorllview:在⼦控件上滑动,事件还要归scrollview。

⼈类的感觉(外部截断):1.有时候,上层截断后,需要把上层不需要的动作,分配给下层。

所以需要上层,精确控制⾃⼰的截取,放⾏⾃⼰不需要的。

⼈类的感觉(内部截断):2.有时候,上层截断后,需要把下层需要的动作,分配给下层。

所以需要上层,先放⾏down,让下层执⾏getparent().disallowinterxxxxx. 这样让下层掌握控制权。

我的感觉:优先碰到谁给谁,如果⼀定要截断,那么只截取⾃⼰的。

如果⼦和我要抢同⼀个事件,那么优先看看是否可以避免这种设计。

所以尽量不⽤getparent().disallowinter.尽量⽤外部截断法来分配滑动,因为简洁,容易理解和定位bug,只有⼀种情况是必须使⽤内部截断法的。

第7章 鼠标和键盘事件

第7章 鼠标和键盘事件
DragMode属性 属性:DragMode属性有两个值:0和1,设置为1,控件可以被拖动, 属性 设置为0,控件无法拖动。 DragOver事件: 触发条件为当拖动控件1经过控件2是,会触发控件2的 事件: 事件 DragOver事件。
事件语法格式: Private Sub Text1_DragOver(Source As Control, X As Single, Y As Single, State As Integer)
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) Randomize If f = True Then Me.ForeColor = RGB(255 * Rnd, 255 * Rnd, 255 * Rnd) If Button = 1 Then Form1.DrawWidth = 5 Form1.PSet (X, Y) Else Form1.DrawWidth = 1 Me.Circle (X, Y), Rnd * 600 End If End If End Sub Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) f = False End Sub
7.1
鼠标事件
大多数控件能够识别鼠标的MouseMove、 MouseDow和 MouseUp 、 大多数控件能够识别鼠标的 和 事件,通过响应这些鼠标事件, 事件 , 通过响应这些鼠标事件 ,能在应用程序对鼠标位置及状态 的变化作出响应操作具体事件如下表所示。 的变化作出响应操作具体事件如下表所示。 事件名称 Click DblClick MouseMove MouseDown MouseUP 发生条件 单击鼠标左键的时候发生 双击鼠标左键的时候发生 鼠标移动的时候续发生 鼠标左键或者右键按下的时候发生 鼠标左键或者右键被释放的时候发生

第十章鼠标和键盘事件

第十章鼠标和键盘事件
Private Sub Text1_KeyPress (KeyAscii As Integer)
KeyAscii = Asc(Ucase(Chr(KeyAscii))) End Sub
例10.4
通过编程序,在一个文本框(Text1)中限定只能
输入数字、小数点,只能响应BackSpace 键及回车键。
keycode 参数通过 ASCII 值或键代码常数来识别键。字母键 的键代码与此字母的大写字符的 ASCII 值相同。所以 "A" 和 "a" 的 keycode 都是由 Asc("A") 返回的数值。在下例中用
KeyDown 事件判断是否按下了 "A" 键:
Private Sub Text1_KeyDown(KeyCode As _ Integer, Shift As Integer) If KeyCode = vbKeyA Then MsgBox "You pressed the A key.“ End if End Sub Private Sub Text1_KeyDown(KeyCode As _ Integer, Shift As Integer) If KeyCode = vbKey1 And shift=1 Then MsgBox "You pressed the ! key.“ End if End Sub
2.shift参数
shift 表示是在该事件发生时响应SHIFT、CTRL 和 ALT 键 的状态,它是一个整数。其含义与上一节中MouseMove、
MouseDown、MouseUp事件中的shift参数完全相同。
例如:下例是用Shift参数判断是否按下了字母的大写形式。 Private Sub Text1_KeyDown(KeyCode As

android按键监听及键盘事件流(无法监听删除键)

android按键监听及键盘事件流(无法监听删除键)

android按键监听及键盘事件流(无法监听删除键)最近在做一个密码按键输入功能时需要对每次按键进行一些处理,于是使用了OnKeyListener 接口监听,对于正常文本格式的输入按键事件都能监听到,但是一旦修改EditText 的输入类型为NumbberPassword(android:inputType="numberPassword")则无法监听到键盘的删除按钮事件。

于是查阅资料:一般使用 OnKeyListener 接口监听按键事件如下:editText.setOnKeyListener(new View.OnKeyListener() {@Overridepublic boolean onKey(View v, int keyCode, KeyEvent event) {if(event.getAction() == KeyEvent.ACTION_DOWN) {switch (keyCode) {case KeyEvent.KEYCODE_DEL:// 处理相关退格键行为return true;...}}return false;}});上面这个这个方案在大多数情况下都没有问题,但是当使用android:inputType="numberPassword" 时事件并未得到响应。

于是翻看了关于 OnKeyListener 的注释:/*** Interface definition for a callback to be invoked when a ha rdware key event is* dispatched to this view. The callback will be invoked befor e the key event is* given to the view. This is only useful for hardware keyboar ds; a software input* method has no obligation to trigger this listener.*/public interface OnKeyListener {/*** Called when a hardware key is dispatched to a view. This a llows listeners to* get a chance to respond before the target view.* <p>Key presses in software keyboards will generally NOT trigger this method,* although some may elect to do so in some situations. Do not assume a* software input method has to be key-based; even if it is, it may use key presses* in a different way than you expect, so there is no way to re liably catch soft* input key presses.*/boolean onKey(View v, int keyCode, KeyEvent event);}类注释大概的意思是:硬件按键会一定会回调这个接口,这仅对硬件键盘有用。

android系统提供的处理物理按键事件的回调方法 -回复

android系统提供的处理物理按键事件的回调方法 -回复

android系统提供的处理物理按键事件的回调方法-回复Android系统提供了多种处理物理按键事件的回调方法,这些方法可以让开发者轻松地实现用户与设备的交互。

在本文中,我们将一步一步地回答关于这些回调方法的问题,并详细介绍它们的使用场景和功能。

1. 什么是物理按键事件回调方法?物理按键事件回调方法是指在Android系统中,用于接收和处理物理按键事件的一组方法。

这些方法定义在View类及其子类中,可以通过重写这些方法来实现自定义的按键事件处理逻辑。

2. Android系统提供了哪些物理按键事件回调方法?Android系统提供了以下几个常用的物理按键事件回调方法:- onKeyDown(int keyCode, KeyEvent event):表示有按键按下的触发事件。

- onKeyUp(int keyCode, KeyEvent event):表示有按键松开的触发事件。

- onKeyLongPress(int keyCode, KeyEvent event):表示有按键长按的触发事件。

- onKeyMultiple(int keyCode, int repeatCount, KeyEvent event):表示有按键连续按下的触发事件。

3. 如何重写物理按键事件回调方法?要重写物理按键事件回调方法,首先需要在自定义的View类中添加相应的方法签名,如onKeyDown、onKeyUp等。

然后,将所需的按键事件处理逻辑代码写在这些方法内部。

例如,在一个自定义的View类中,我们可以重写onKeyDown方法来处理按键按下事件:java@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) { 根据按键的keyCode判断按下的是哪个物理按键if (keyCode == KeyEvent.KEYCODE_BACK) {在这里添加处理返回按键的逻辑return true; 消费事件,防止事件继续传递}return super.onKeyDown(keyCode, event);}4. 物理按键事件回调方法的使用场景有哪些?物理按键事件回调方法在Android开发中具有广泛的使用场景,下面列举了几个常见的应用场景:- 实现返回键的功能:通过重写onKeyDown方法,可以在用户按下返回键时执行相应的操作,例如返回上一个页面或退出应用程序。

Android按键事件传递流程(二)

Android按键事件传递流程(二)

Android按键事件传递流程(⼆)5 应⽤层如何从Framework层接收按键事件由3.2和4.5.4节可知,当InputDispatcher通过服务端管道向socket⽂件描述符发送消息后,epoll机制监听到了I/O事件,epoll_wait就会执⾏返回发⽣事件的个数给eventCount,主线程开始执⾏epoll_wait后⾯的代码:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23for (int i = 0; i < eventCount; i++) {int fd = eventItems[i].data.fd;uint32_t epollEvents = eventItems[i].events;if (fd == mWakeReadPipeFd) {if (epollEvents & EPOLLIN) {awoken();} else {ALOGW("Ignoring unexpected epoll events 0x%x on wake read pipe.", epollEvents); }} else {ssize_t requestIndex = mRequests.indexOfKey(fd);if (requestIndex >= 0) {int events = 0;if (epollEvents & EPOLLIN) events |= EVENT_INPUT;if (epollEvents & EPOLLOUT) events |= EVENT_OUTPUT;if (epollEvents & EPOLLERR) events |= EVENT_ERROR;if (epollEvents & EPOLLHUP) events |= EVENT_HANGUP;pushResponse(events, mRequests.valueAt(requestIndex));} else {ALOGW("Ignoring unexpected epoll events 0x%x on fd %d that is ""no longer registered.", epollEvents, fd);}}fd是客户端socket⽂件描述符,不是mWakeReadPipeFd,因此if语句不成⽴,进⼊else⼦句。

Android开发中的键盘事件处理

Android开发中的键盘事件处理

Android开发中的键盘事件处理在Android开发中,键盘事件处理是一个非常重要的主题,因为它能够让开发者更加灵活地控制用户的输入。

本文将探讨键盘事件的基本原理、常见用途以及应该如何处理这些事件。

一、键盘事件的基本原理在Android中,键盘事件分为两种:按下事件和释放事件。

当用户按下键盘上的任意一个键时,系统会创建一个按下事件,并将其发送到当前屏幕上的活动(Activity)中。

当用户释放该键时,系统会创建一个释放事件,并将其发送到该活动。

每个键盘事件都有一个唯一的标识码,该标识码用于识别事件所对应的键。

这些标识码可以在android.view.KeyEvent类中找到。

此外,每个事件都可以包括一个或多个修饰符,例如Shift、Ctrl和Alt等。

这些修饰符可以通过android.view.KeyEvent类中的常量来进行识别。

二、键盘事件的常见用途键盘事件处理可以用于许多不同的用途,以下是其中的几个:1. 键盘快捷键在许多应用程序中,使用键盘快捷键可以加速用户的操作。

例如,当用户在编辑器中按下Ctrl+S时,可以将文档保存到磁盘上,而不需要通过菜单或工具栏来进行。

2. 游戏控制在许多游戏中,开发者使用键盘事件来控制角色的移动、射击和跳跃等动作。

通过处理这些事件,游戏可以在屏幕上呈现出交互式的图形和动画效果。

3. 表单验证在某些应用程序中,需要对用户的输入进行验证。

此时,开发者可以使用键盘事件来检查输入是否符合特定的模式或格式。

三、如何处理键盘事件为了能够处理键盘事件,我们需要在活动中重写onKeyDown()和onKeyUp()方法。

这些方法会接收到经过过滤和转换的按下/释放事件,并将这些事件转换为软件中的操作。

以下是一个简单的例子,演示如何在Android应用程序中处理键盘事件:```java@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {switch (keyCode) {case KeyEvent.KEYCODE_A:Log.d(TAG, "A key down");return true;case KeyEvent.KEYCODE_B:Log.d(TAG, "B key down");return true;}return super.onKeyDown(keyCode, event);}@Overridepublic boolean onKeyUp(int keyCode, KeyEvent event) { switch (keyCode) {case KeyEvent.KEYCODE_A:Log.d(TAG, "A key up");return true;case KeyEvent.KEYCODE_B:Log.d(TAG, "B key up");return true;}return super.onKeyUp(keyCode, event);}```以上代码中,我们将A键和B键的按下和释放事件分别映射到一个日志输出语句。

Android应用程序键盘(Keyboard)消息处理机制分析

Android应用程序键盘(Keyboard)消息处理机制分析

Android应用程序键盘(Keyboard)消息处理机制分析在Android系统中,键盘按键事件是由WindowManagerService服务来管理的,然后再以消息的形式来分发给应用程序处理,不过和普通消息不一样,它是由硬件中断触发的;在上一篇文章《Android应用程序消息处理机制(Looper、Handler)分析》中,我们分析了Android应用程序的消息处理机制,本文将结合这种消息处理机制来详细分析Android应用程序是如何获得键盘按键消息的。

在系统启动的时候,SystemServer会启动窗口管理服务WindowManagerService,WindowManagerService在启动的时候就会通过系统输入管理器InputManager来总负责监控键盘消息。

这些键盘消息一般都是分发给当前激活的Activity窗口来处理的,因此,当前激活的Activity窗口在创建的时候,会到WindowManagerService中去注册一个接收键盘消息的通道,表明它要处理键盘消息,而当InputManager监控到有键盘消息时,就会分给给它处理。

当当前激活的Activity窗口不再处于激活状态时,它也会到WindowManagerService中去反注册之前的键盘消息接收通道,这样,InputManager 就不会再把键盘消息分发给它来处理。

由于本文的内容比较多,在接下面的章节中,我们将分为五个部分来详细描述Android应用程序获得键盘按键消息的过程,每一个部分都是具体描述键盘消息处理过程中的一个过程。

结合上面的键盘消息处理框架,这四个过程分别是InputManager的启动过程、应用程序注册键盘消息接收通道的过程、InputManager分发键盘消息给应用程序的过程以及应用程序注销键盘消息接收通道的过程。

为了更好地理解Android应用程序获得键盘按键消息的整个过程,建议读者首先阅读Android应用程序消息处理机制(Looper、Handler)分析一文,理解了Android应用程序的消息处理机制后,就能很好的把握本文的内容。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/jinhaijian/article/details/6013985目的:通过全面的分析Android的鼠标和键盘事件。

了解Android中如何接收和处理键盘和鼠标事件,以及如何用代码来产生事件。

主要学习内容:1. 接收并处理鼠标事件:按下、弹起、移动、双击、长按、滑动、滚动2. 接收并处理按键事件:按下、弹起3. 模拟鼠标/按键事件1. Android事件现代的用户界面,都是以事件来驱动的来实现人机交换的,而Android上的一套UI控件,无非就是派发鼠标和键盘事件,然后每个控件收到相应的事件之后,做相应的处理。

如Button 控件,就只需要处理Down、move、up这几个事件,Down的时候重绘控件,move的时候一般也需要重绘控件,当up的时候,重绘控件,然后产生onClick事件。

在Android中通过实现OnClickListener接口的onClick方法来实现对Button控件的处理。

对于触摸屏事件(鼠标事件)有按下有:按下、弹起、移动、双击、长按、滑动、滚动。

按下、弹起、移动(down、move、up)是简单的触摸屏事件,而双击、长按、滑动、滚动需要根据运动的轨迹来做识别的。

在Android中有专门的类去识别,android.view.GestureDetector。

对于按键(keyevent),无非就是按下、弹起、长按等。

2. Android事件处理Android手机的坐标系是以左上定点为原点坐标(0,0), 向右为X抽正方形,向下为Y抽正方向。

2.1 简单触摸屏事件在Android中任何一个控件和Activity都是间接或者直接继承于android.view.View。

一个View对象可以处理测距、布局、绘制、焦点变换、滚动条,以及触屏区域自己表现的按键和手势。

当我们重写View中的onTouchEvent(MotionEvent)方法后,就可以处理简单的触摸屏事件。

代码如下:view plaincopy to clipboardprint?1.public boolean onTouchEvent(MotionEvent event)2. {3. int events[] = {MotionEvent.ACTION_DOWN, MotionEvent.ACTION_MOVE,4. MotionEvent.ACTION_UP, MotionEvent.ACTION_MOVE, MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_OUTSIDE,5. MotionEvent.ACTION_POINTER_DOWN,MotionEvent.ACTION_POINTER_UP,6. MotionEvent.EDGE_TOP,MotionEvent.EDGE_BOTTOM,MotionEvent.EDGE_LEFT,MotionEvent.EDGE_RIGHT};7.8. String szEvents[]={"ACTION_DOWN", "ACTION_MOVE",9. "ACTION_UP", "ACTION_MOVE", "ACTION_CANCEL", "ACTION_OUTSIDE",10. "ACTION_POINTER_DOWN","ACTION_POINTER_UP",11. "EDGE_TOP","EDGE_BOTTOM","EDGE_LEFT","EDGE_RIGHT"};12. for(int i=0; i < events.length; i++)13. {14. if(events[i] == event.getAction())15. {16. if(oldevent != event.getAction())17. {18. DisplayEventType(szEvents[i]);19. oldevent = event.getAction();20. }21. break;22. }23. }24. return super.onTouchEvent(event);25. }1.import android.view.GestureDetector;2.import android.view.GestureDetector.OnGestureListener;3.public class TestEvent extends Activity {4. /** Called when the activity is first created. */5.6. TextView m_eventType;7. int oldevent = -1;8. private GestureDetector gestureDetector= new GestureDetector(new OnGestureListener()9. {10.11. // 鼠标按下的时候,会产生onDown。

由一个ACTION_DOWN产生。

12. public boolean onDown(MotionEvent event) {13.14. DisplayEventType("mouse down" + " " + event.getX() + "," + event.getY());15. return false;16. }17. // 用户按下触摸屏、快速移动后松开,这个时候,你的手指运动是有加速度的。

18. // 由1个MotionEvent ACTION_DOWN,19. // 多个ACTION_MOVE, 1个ACTION_UP触发20. // e1:第1个ACTION_DOWN MotionEvent21. // e2:最后一个ACTION_MOVE MotionEvent22. // velocityX:X轴上的移动速度,像素/秒23. // velocityY:Y轴上的移动速度,像素/秒24. public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,25. float velocityY) {26. DisplayEventType("onFling");27. return false;28. }29. // 用户长按触摸屏,由多个MotionEvent ACTION_DOWN触发30. public void onLongPress(MotionEvent event) {31. DisplayEventType("on long pressed");32. }33. // 滚动事件,当在触摸屏上迅速的移动,会产生onScroll。

由ACTION_MOVE产生34. // e1:第1个ACTION_DOWN MotionEvent35. // e2:最后一个ACTION_MOVE MotionEvent36. // distanceX:距离上次产生onScroll事件后,X抽移动的距离37. // distanceY:距离上次产生onScroll事件后,Y抽移动的距离38. public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,39. float distanceY) {40. DisplayEventType("onScroll" + " " + distanceX + "," + distanceY);41. return false;42. }43. //点击了触摸屏,但是没有移动和弹起的动作。

onShowPress和onDown的区别在于44. //onDown是,一旦触摸屏按下,就马上产生onDown事件,但是onShowPress是onDown事件产生后,45. //一段时间内,如果没有移动鼠标和弹起事件,就认为是onShowPress事件。

46. public void onShowPress(MotionEvent event) {47. DisplayEventType("pressed");48.49. }50. // 轻击触摸屏后,弹起。

如果这个过程中产生了onLongPress、onScroll和onFling事件,就不会51. // 产生onSingleTapUp事件。

52. public boolean onSingleTapUp(MotionEvent event) {53. DisplayEventType("Tap up");54. return false;55. }56.57. });58.59.@Override60. public void onCreate(Bundle savedInstanceState) {61. super.onCreate(savedInstanceState);62. setContentView(yout.main);63. m_eventType = (TextView)this.findViewById(R.id.eventtype);64. }65.@Override66. public boolean onTouchEvent(MotionEvent event)67. {68. if(gestureDetector.onTouchEvent(event))69. return true;70. else71. return false;72. }73.74.}键盘事件比较简单,直接重写原来的方法就可以了。

代码如下:view plaincopy to clipboardprint?1.public boolean onKeyDown(int keyCode, KeyEvent event)2. {3. switch(keyCode)4. {5. case KeyEvent.KEYCODE_HOME:6. DisplayEventType("Home down");7. break;8. case KeyEvent.KEYCODE_BACK:9. DisplayEventType("Back down");10. break;11. case KeyEvent.KEYCODE_DPAD_LEFT:12. DisplayEventType("Left down");13. break;14. }15. //return true;16. return super.onKeyDown(keyCode, event);17. }18.@Override19. public boolean onKeyUp(int keyCode, KeyEvent event)20. {21. switch(keyCode)22. {23. case KeyEvent.KEYCODE_HOME:24. DisplayEventType("Home up");25. break;26. case KeyEvent.KEYCODE_BACK:27. DisplayEventType("Back up");28. break;29. case KeyEvent.KEYCODE_DPAD_LEFT:30. DisplayEventType("Left up");31. break;32. }33. //return true;34. return super.onKeyUp(keyCode, event);35. }。

相关文档
最新文档