自定义触摸事件封装

  以前做过将红外触摸框的触摸事件进行简单的输入子系统获取,使用的是C语言,这次特地将以前的C封装为C++类,这样使用起来相对方便。该触摸事件采用了andrdoid操作事件的思想,采用多线程一个负责读取事件,一个负责分发事件,在类中采用了线程,使用的是linux的pthread_create函数,在类中线程函数我采用的是友元函数的方式。

  inputEvent.h 代码如下:

 1 #ifndef INPUTEVENT_H
 2 #define INPUTEVENT_H
 3
 4 #include "gui.h"
 5 #include <linux/input.h>
 6 #include <stdio.h>
 7 #include <pthread.h>
 8 #include <stdlib.h>
 9 #include <sys/types.h>
10 #include <string.h>
11 #include <sys/stat.h>
12 #include <fcntl.h>
13 #include <linux/fb.h>
14 #include <sys/ioctl.h>
15
16 using namespace android;
17
18 class InputEvent
19 {
20 public:
21     InputEvent(void);
22
23     int xScaleyScale(void); //显示屏幕和触摸屏幕比列关系
24
25     int getTouchEventNum() ; // 触摸框事件数列
26
27     friend void* readInput(void *data); //读取事件线程
28
29     friend void* dispatchInput(void *data); //分发事件线程
30
31     float getX(void); //获取x坐标
32
33     float getY(void); //获取y坐标
34
35     float getW(void); //获取触摸宽度
36
37     float getH(void); //获取触摸高度
38
39     int getDown(void); //按下
40
41     int getUp(void); //抬起
42
43 private:
44     //LCD和触摸框转换比例
45     float xScale;
46     float yScale;
47
48     int fd ; // dev的文件描述符
49     int fds[2];  //管道
50
51     float x; //x坐标
52     float y; //y坐标
53     int pressure; //按下
54     float touchMajor; //宽触摸
55     float touchMinor; //高触摸
56     int down,up; // 按下,抬起
57 };
58 #endi

gui.h头文件:

 1 #ifndef GUI_H
 2 #define GUI_H
 3
 4 #include <cutils/memory.h>
 5 #include <unistd.h>
 6 #include <utils/Log.h>
 7 #include <binder/IPCThreadState.h>
 8 #include <binder/ProcessState.h>
 9 #include <binder/IServiceManager.h>
10 #include <gui/SurfaceComposerClient.h>
11 #include <gui/ISurfaceComposer.h>
12 #include <ui/DisplayInfo.h>
13 #include <ui/Rect.h>
14 #include <ui/Region.h>
15 #include <android/native_window.h>
16 #include <SkGraphics.h>
17 #include <SkBitmap.h>
18 #include <SkCanvas.h>
19 #include <SkDevice.h>
20 #include <SkStream.h>
21 #include <SkImageDecoder.h>
22 #include <hardware/hwcomposer_defs.h>
23 #include <errno.h>
24 #include <sys/mman.h>
25 #include <binder/IMemory.h>
26 #include <SkImageEncoder.h>
27 #include <SkData.h>
28
29 #endif

inputEvent.cpp

  1 #include "inputEvent.h"
  2
  3 void* readInput(void *data)  //读取事件线程
  4 {
  5     InputEvent *ev = (InputEvent*)data;
  6     struct input_event inputEvent;
  7     while(1)
  8     {
  9         read(ev->fd, &inputEvent, sizeof(struct input_event));
 10         // 向管道中写数据
 11         write(ev->fds[1], &inputEvent, sizeof(struct input_event));
 12     }
 13     return NULL;
 14 }
 15 void* dispatchInput(void *data)  //分发事件线程
 16 {
 17     InputEvent *ev = (InputEvent*)data;
 18     struct input_event inputEvent;
 19     while(1)
 20     {
 21         //从管道中读取数据
 22         read(ev->fds[0], &inputEvent, sizeof(struct input_event));
 23
 24         if(inputEvent.type == EV_ABS && inputEvent.code == ABS_X ){
 25             float fv = inputEvent.value * 1.0;
 26             ev->x = fv * ev->xScale;
 27             continue;
 28         }
 29         if(inputEvent.type == EV_ABS && inputEvent.code == ABS_Y ){
 30              float fv = inputEvent.value * 1.0;
 31              ev->y = fv * ev->yScale;
 32              continue;
 33         }
 34         if(inputEvent.type == EV_KEY && inputEvent.code == BTN_TOUCH ){
 35             ev->pressure = inputEvent.value;
 36             if(1 == ev->pressure )
 37             {
 38                 ev->down = 1;
 39                 ev->up = 0;
 40             }
 41             else if(0 == ev->pressure)
 42             {
 43                 ev->up  = 1;
 44                 ev->down = 0;
 45             }
 46             continue;
 47         }
 48         //增加flag的判断作用是touchMajor和toushMinor事件在pressure事件之前的比较准确
 49         if(inputEvent.type == EV_ABS && inputEvent.code == ABS_MT_TOUCH_MAJOR ){
 50              float fv = inputEvent.value * 1.0;
 51              ev->touchMajor = fv * 10; //10  = 0x4000 / 1920
 52              continue;
 53         }
 54
 55         if(inputEvent.type == EV_ABS && inputEvent.code == ABS_MT_TOUCH_MINOR ){
 56             float fv = inputEvent.value * 1.0;
 57             ev->touchMinor = fv * 18;  //18  15 = 0x4000 / 1080;
 58             continue;
 59         }
 60     }
 61     return NULL;
 62 }
 63
 64 InputEvent::InputEvent(void)
 65 {
 66     int num = getTouchEventNum();
 67     if( num == -1)
 68     {
 69         printf("No Touch Event\n");
 70         return ;
 71     }
 72     char name[64];
 73     sprintf(name, "/dev/input/event%d", num);
 74     fd = open(name, O_RDWR);
 75     if(fd < 0)
 76     {
 77         printf("Open dev Error");
 78         return ;
 79     }
 80
 81     xScaleyScale();//初始化xy坐标的比例关系
 82
 83     //创建无名管道
 84     if(-1 == pipe(fds))
 85     {
 86         printf("pipe\n");
 87         exit(-1);
 88     }
 89     pthread_t readId, disPatchId;
 90     pthread_create(&readId, NULL, readInput, (void*)this);
 91     pthread_create(&disPatchId, NULL, dispatchInput, (void*)this);
 92     return ;
 93 }
 94 int InputEvent::xScaleyScale(void)  //显示屏幕和触摸屏幕比列关系
 95 {
 96     sp<SurfaceComposerClient> surfaceComposerClient = new SurfaceComposerClient();  //创建SurfaceFlinger的本地代理
 97     DisplayInfo displayInfo;
 98     //获取屏幕的宽高等信息
 99     surfaceComposerClient->getDisplayInfo(surfaceComposerClient->getBuiltInDisplay(HWC_DISPLAY_PRIMARY), &displayInfo);
100     xScale = displayInfo.w / 32768.0;
101     yScale = displayInfo.h / 32768.0;
102     return 0;
103 }
104 int InputEvent::getTouchEventNum()   // 触摸框事件数列
105 {
106     char  name[64];       /* RATS: Use ok, but could be better */
107     char  buf[256] = { 0, };  /* RATS: Use ok */
108     int   fd = 0;
109     int   i;
110     for (i = 0; i < 32; i++)
111     {
112         sprintf(name, "/dev/input/event%d", i);
113         if ((fd = open(name, O_RDONLY, 0)) >= 0)
114         {
115             ioctl(fd, EVIOCGNAME(sizeof(buf)), buf);
116             if(strstr(buf, "MTOUC Touch"))
117             {
118                 close(fd);
119                 return i;
120             }
121             //printf("%s\n", name);
122             //printf("name: %s\n", buf);
123             close(fd);
124         }
125     }
126     return -1;
127 }
128
129 float InputEvent::getX(void)  //获取x坐标
130 {
131     return this->x;
132 }
133 float InputEvent::getY(void)  //获取y坐标
134 {
135     return this->y;
136 }
137 float InputEvent::getW(void)  //获取触摸宽度
138 {
139     return this->touchMajor;
140 }
141 float InputEvent::getH(void)  //获取触摸高度
142 {
143     return this->touchMinor;
144 }
145 int InputEvent::getDown(void)  //按下
146 {
147     return this->down;
148 }
149 int InputEvent::getUp(void)  //抬起
150 {
151     return this->up;
152 }

其中gui.h是一些android显示图像的头文件。

测试代码简单:

int main (int argc, char** argv)  

  InputEvent event;

  while(1){

    printf("X = %d\n",event.getX());

    printf("Y = %d\n",event.getY());

  }

  return 0;  

}

时间: 2024-12-07 16:16:13

自定义触摸事件封装的相关文章

【事件】封装touch触摸事件 --- DOM2级、单点触控

//封装touch触摸事件 --- DOM2级.单点触控 if (!Object.prototype.addTouchEvents) { Object.defineProperty(Object.prototype, 'addTouchEvents', { value: function(Obj) { var noop = function() {}; var defaults = { start: noop, //开始 move: noop, //移动 end: noop, //结束 left

自定义DOM事件函数封装

非原生DOM触发,个性化定制的自定义事件. currentTarget(DOM对象):要触发事件的元素节点. type(字符串):触发的事件类型,例如"keydown". bubbles(布尔值):表示事件是否应该冒泡. cancelable(布尔值):表示事件是否可以取消. detail(对象):任意值,保存在 event 对象的 detail 属性中. 1 function customEvent (currentTarget, type, bubbles, cancelable,

iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

-- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事件(手势操作).运动事件.远程控制事件等展开学习: iOS事件简介 触摸事件 手势识别 运动事件 远程控制事件 iOS事件 在iOS中事件分为三类: 触摸事件:通过触摸.手势进行触发(例如手指点击.缩放) 运动事件:通过加速器进行触发(例如手机晃动) 远程控制事件:通过其他远程设备触发(例如耳机控制

【REACT NATIVE 系列教程之一】触摸事件的两种形式与四种TOUCHABLE组件详解

本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/react-native/2203.html 本文是RN(React Native)系列教程第一篇,当然也要给自己的群做个广告:   React Native @Himi :126100395  刚创建的群,欢迎一起学习.讨论.进步. 本文主要讲解两点: 1.   PanResponder:触摸事件,用以获取用户手指所在屏幕的坐标(x,y)或触

转发:iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

-- iOS事件全面解析 转载来自崔江涛(KenshinCui) 链接:http://www.cnblogs.com/kenshincui/p/3950646.html 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事件(手势操作).运动事件.远程控制事件等展开学习: iOS事件简介 触摸事件 手势识别 运动事件 远程控制事件 iOS事件 在iOS中事件分为三类: 触摸事

iOS的触摸事件的用法以及和手势识别器的区别

1.首先来介绍下触摸事件和手势识别器的利与弊 触摸事件和手势识别器二者之间有直接的关系 手势识别器是在触摸事件的基础上演变过来的 当我们用到触摸事件时 默认的uiview是没有什么效果的 只能自定义view才能实现事件的触摸 通常用到的方法如下: – touchesBegan:withEvent: – touchesMoved:withEvent: – touchesEnded:withEvent: - touchesCancelled:withEvent: 而手势识别器是在触摸事件的基础上而封

Android触摸事件(二)-TouchUtils,触摸辅助工具类

目录 目录 概述 关于拖动 原理 实现过程 关键变量定义 事件处理回调 偏移量计算 实现 关于缩放 原理 实现过程 缩放比例计算方法 事件处理回调 变量定义 缩放流程 关于辅助功能 使用方法 源码 概述 此类的主要作用是封装了一些触摸事件需要常用的操作,只需要实现简单的接口即可以使用.实现操作如下: 界面拖动(基于单点触摸的移动事件) 界面的缩放(基于两点触摸的移动事件) 此类只是一个辅助工具类,并不是必须的也不需要继承此类就可以使用. 此类基于AbsTouchEventHandle类回调的事件

android源码解析(三十)--&gt;触摸事件分发流程

前面一篇文章中我们分析了App返回按键的分发流程,从Native层到ViewRootImpl层到DocorView层到Activity层,以及在Activity中的dispatchKeyEvent方法中分发事件,最终调用了Activity的finish方法,即销毁Activity,所以一般情况下假如我们不重写Activity的onBackPress方法或者是onKeyDown方法,当我们按下并抬起返回按键的时候默认都是销毁当前Activity.而本文中我们主要介绍触摸事件的分发流程,从Nativ

屏幕触摸事件监听,判断上下左右的操作行为,判断方法缩小的操作行为

在手机屏幕上能够实现的人机交互行为,大致包括点击按钮,拉动滑动块,物体缩放,上下左右拉动等. 手机屏幕触摸事件的监听方法: 1.首先要设置一块布局区域,frameLayout/LinearLayout等都可以,并为布局设置id: 2.在Activity中声明相应的布局类型,并通过findViewById()方法找到该布局,然后为该布局区域设置setOnTouchListener()方法,就能监听在相应屏幕触摸操作 实现屏幕触摸事件监听的代码: private LinearLayout Land;