网站后台都有哪些,浏览器为什么打不开网站,猎头公司收费收费标准和方式,网站底部 图标基于GEC6818开发板的触摸实现——电子相册 本文主要涉及GEC6818开发板实现对触摸屏的相关操作#xff0c;可以识别上下左右的滑动#xff0c;通过滑动来进行图片的切换——电子相册。 其他相关GEC6818开发板的内容可以参考#xff1a; 01-基于粤嵌GEC6818实现屏幕的显示固定…基于GEC6818开发板的触摸实现——电子相册 本文主要涉及GEC6818开发板实现对触摸屏的相关操作可以识别上下左右的滑动通过滑动来进行图片的切换——电子相册。 其他相关GEC6818开发板的内容可以参考 01-基于粤嵌GEC6818实现屏幕的显示固定颜色进行自动切换 02-基于GEC6818开发板的画正方形、画圆的操作——使用mmap映射提高效率 03-基于GEC6818开发板实现BMP图片的加载——实例分析 文章目录 基于GEC6818开发板的触摸实现——电子相册一、 关于交互相关命令1.1 通用叙述1.1.1 struct timeval time1.1.2 __u16 type1.1.3 __u16 code1.1.4 __s32 value 1.2 触摸事件详细叙述1.2.1 struct timeval time1.2.2 __u16 type1.2.3 __u16 code1.2.4 __s32 value 二、实例分析使用触摸屏进行图片的切换电子相册2.1 代码实现2.2 代码解析 一、 关于交互相关命令
1.1 通用叙述
struct input_event {
struct timeval time;
__u16 type;
__u16 code;
__s32 value;
};下面具体的
1.1.1 struct timeval time 定义: struct timeval 是一个结构体通常用于表示时间间隔或时间戳。要实现长按或者点击需要使用到这个参数 成员: time.tv_sec: 从1970年1月1日开始的秒数。time.tv_usec: 微秒部分即秒数的小数部分。 作用: 为事件提供一个时间戳告诉我们事件发生的确切时间。
1.1.2 __u16 type 定义: __u16 是一个无符号16位整数用于存储事件的类型。 常见的类型: EV_SYN: 同步事件表示事件的序列结束。(0x00)EV_KEY: 键盘或按钮事件。(0x01)EV_REL: 相对位置事件例如鼠标的移动。(0x02)EV_ABS: 绝对位置事件例如触摸屏的触摸。(0x03)EV_MSC: 其他杂项事件。(0x04)… 以及其他的类型。
1.1.3 __u16 code 定义: __u16 是一个无符号16位整数用于存储事件的代码。 作用: 当事件类型已知时代码提供了更具体的信息。例如如果事件类型是EV_KEY那么代码可能表示哪个键被按下或释放。
1.1.4 __s32 value 定义: __s32 是一个带符号的32位整数用于存储事件的值。 作用: 根据事件类型和代码值字段表示事件的具体情况。例如对于EV_KEY事件值为0可能表示键被释放而值为1可能表示键被按下。 综上所述input_event结构体为Linux输入子系统提供了一个标准化的方式来描述各种输入设备发送的事件。通过时间戳、事件类型、代码和值应用程序可以精确地知道何时、从哪个设备和发生了什么类型的事件。 1.2 触摸事件详细叙述
当事件类型为触摸事件时即type为EV_ABSinput_event结构体中的参数具有以下含义
1.2.1 struct timeval time
时间戳: 告诉我们触摸事件发生的确切时间。
1.2.2 __u16 type
类型: 固定为EV_ABS表示这是一个绝对位置事件通常与触摸屏有关。
1.2.3 __u16 code
代码: 用于标识触摸事件的具体方面。常见的代码包括 ABS_X: 触摸点在X轴上的位置。ABS_Y: 触摸点在Y轴上的位置。ABS_PRESSURE: 触摸点的压力级别如果支持。(值为330)ABS_MT_SLOT: 多点触摸的槽位用于区分多个触摸点。ABS_MT_TRACKING_ID: 多点触摸的跟踪ID。… 以及其他的代码。
1.2.4 __s32 value
值: 表示与触摸事件相关的具体信息。 对于ABS_X和ABS_Y值表示触摸点在屏幕上的位置。对于ABS_PRESSURE值表示触摸点的压力级别。对于ABS_MT_SLOT值表示当前操作的触摸点槽位。对于ABS_MT_TRACKING_ID值表示触摸点的唯一跟踪ID。 这些参数结合起来使应用程序能够完全了解触摸事件的各个方面从而实现更加复杂和精确的交互响应。例如您可以使用ABS_X和ABS_Y的值来确定用户在屏幕上触摸的位置然后根据触摸点的压力和移动来实现不同的操作或效果。
二、实例分析使用触摸屏进行图片的切换电子相册
2.1 代码实现
实现图片的切换
#include stdio.h
#include fcntl.h
#include unistd.h
#include sys/mman.h
#include stdlib.h
#include linux/input.hint lcd_fd -1; // 全局的lcd描述符
unsigned int* plcd NULL;
#define TOUCH_PATH /dev/input/event0void lcdinit() {lcd_fd open(/dev/fb0, O_RDWR);if (-1 lcd_fd) {perror(open fb0 error);exit(1);}plcd mmap(NULL, 800 * 480 * 4, PROT_READ | PROT_WRITE, MAP_SHARED, lcd_fd, 0);if (plcd MAP_FAILED) {perror(mmap error);return;}
}void lcd_destory() {munmap(plcd, 800 * 480 * 4);close(lcd_fd);
}void point(int x, int y, unsigned int color) {if (x 0 x 800 y 0 y 480) {*(plcd y * 800 x) color;}
}
//添加背景颜色-color
void display_bgm(int color) {int w 800,h480;int x, y;for (y 0; y h; y) {for (x 0; x w; x) {point(x , y , color);}}
}void display_mid(const char* filename)
{display_bgm(0xFFFFFF);int x0,y0;//打开文件int fd open(filename, O_RDONLY);if(-1 fd){perror(open bmp error);return;}//判断是否为真的BMP文件unsigned char buf[2];read(fd,buf,2);if(buf[0]! 0x42 || buf[1]! 0x4d)//若果不是B M 的ASCII码{printf(NOT BMP\n);return;}//读取数据int width,height,depth;//读取宽度将偏移量偏移到宽度lseek(fd,0x12,SEEK_SET);read(fd,width,4);//读取四个字节read(fd,height,4);//高度lseek(fd,0x1c,SEEK_SET);read(fd,depth,4);//只支持色深24和32if(!(depth 24 || depth 32)){printf(NOT Support!\n);return;}printf(width %d height %d depth %d , width,height,depth);//处理居中的情况if(width800||height480){x0 (int)(800-width)/2;y0 (int)(480-height)/2;}//4.获取像素数组int line_valid_bytes abs(width)*depth/8;//一行有效字节数int line_bytes;//一行总字节数有效字节数赖子数 int laizi 0;if(line_valid_bytes%4){laizi 4-line_valid_bytes%4;}line_bytes line_valid_bytes laizi;int total_bytes line_bytes*abs(height);//整个像素数组的大小//开辟一块动态内存unsigned char *piexl (unsigned char *)malloc(total_bytes); //用完后需要释放内存lseek(fd,54,SEEK_SET);read(fd,piexl,total_bytes);unsigned char a,r,g,b;int color;int i 0;int x,y;for(y0;yabs(height);y){for(x0;xabs(width);x){//a r g b 0xargb 小端模式 b g r ab piexl[i];g piexl[i];r piexl[i];if(depth 32)//32 色的有透明度但是对24位的来说无所谓这个a的都无效{a piexl[i];}else{a 0;//不透明}color(a24)|(r16)|(g8)|(b);//在屏幕对应的位置显示point(width0?x0x:x0abs(width)-x-1, height0?y0abs(height)-y-1:y0y,color);}//每一行的末尾 有可能填充几个赖子i laizi;}//释放内存free(piexl);//关闭文件close(fd);
}int GetDirection()
{//1.打开触摸屏 lcdinit();int fd open(TOUCH_PATH,O_RDONLY);//只读打开if(fd0){perror(open fail);return 0;}int x_start-1,y_start-1; //坐标的初值int x_end -1,y_end -1; //坐标终点struct input_event ev;int flag0;while(1){//2.不停地从文件中读取数据int rread(fd, ev, sizeof(struct input_event));if(sizeof(ev)!r)//等待响应--如果当时没反应可以容忍进行等待{usleep(10);flag;if(flag10){perror(read ev error);break;}continue;}flag0;//3.解析数据if(ev.type EV_ABS) //触摸事件 {if(ev.code ABS_X){if (-1 x_start) //x轴{x_start ev.value; //起点}x_end ev.value; //终点}if(ev.code ABS_Y) //y轴{if (-1 y_start){y_start ev.value;}y_end ev.value; //终点}if(ev.code ABS_PRESSURE ev.value 0){if(x_start ! -1 y_start ! -1){break;}}}if(ev.type EV_KEY ev.code BTN_TOUCH ev.value 0) //按键事件{if(x_start ! -1 y_start ! -1){break;}}if (abs(x_end - x_start) (y_end - y_start)){if (x_end - x_start 0){return 4;}else{return 3;}}if (abs(x_end - x_start) (y_end - y_start)){if (y_end - y_start 0){return 2;}else{return 1;}}}//打印坐标printf(%d , %d\n, x_end, y_start);//4.关闭触摸屏lcd_destory();
}int main()
{//1 openconst char* images[] {1.bmp,2.bmp,3.bmp};int num_images sizeof(images) / sizeof(images[0]);int current_image_index 0;int direction0;while(1){directionGetDirection();printf(%d\n,direction);if (1 direction || 3 direction){if (3 current_image_index){current_image_index 0;}elsecurrent_image_index;display_mid(images[current_image_index]);}else if (2 direction || 4 direction){if (0 current_image_index){current_image_index 2;}elsecurrent_image_index--;display_mid(images[current_image_index]);}}return 0;}
2.2 代码解析
上面代码的核心函数是获取滑动方向的函数这个GetDirection函数的主要目的是从触摸屏设备中获取一个触摸的方向并返回相应的方向值。
以下是该函数的主要步骤和思路 初始化触摸屏使用lcdinit()函数初始化触摸屏设备。 打开触摸屏设备通过open系统调用打开触摸屏设备文件。 读取输入事件使用read系统调用从触摸屏设备文件中读取输入事件。 解析输入事件检查读取到的输入事件的类型和代码。 如果事件类型是EV_ABS则它是一个绝对坐标事件通常与触摸屏的X和Y坐标相关。 如果代码是ABS_X则更新X坐标的起点和终点。如果代码是ABS_Y则更新Y坐标的起点和终点。如果代码是ABS_PRESSURE并且值为0表示触摸事件结束程序将退出循环。 如果事件类型是EV_KEY并且代码是BTN_TOUCH则表示触摸事件结束程序将退出循环。 判断触摸方向 使用X和Y坐标的起点和终点来确定触摸方向。如果X方向的变化x_end - x_start的绝对值大于Y方向的变化y_end - y_start则认为是水平滑动。 如果X方向是正的则返回值为4可能表示右滑动。如果X方向是负的则返回值为3可能表示左滑动。 如果Y方向的变化y_end - y_start的绝对值大于X方向的变化则认为是垂直滑动。 如果Y方向是正的则返回值为2可能表示向下滑动。如果Y方向是负的则返回值为1可能表示向上滑动。 关闭触摸屏使用lcd_destory()函数关闭触摸屏设备。
总之该函数的核心逻辑是基于从触摸屏设备读取的输入事件来确定并返回触摸的方向。