Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 653|回复: 0

[实例教程]Android原生(Native)C开发之三:鼠标事件篇

[复制链接]

该用户从未签到

发表于 2011-10-22 12:22:45 | 显示全部楼层 |阅读模式
在做SDL至Android的移植时,键盘事件是能正常捕获到,看了SLD的源码,发现用的device是 /dev/tty0,但是鼠标叫是不能成功捕获,总是得到 0,运行命令查看devices时,显示如下:


# cat /proc/bus/input/devices

cat /proc/bus/input/devices

I: Bus=0000 Vendor=0000 Product=0000 Version=0000

N: Name="qwerty"

P: Phys=

S: Sysfs=/class/input/input0

U: Uniq=

H: Handlers=kbd mouse0 event0

B: EV=2f

B: KEY=ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff f

fffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe

B: REL=3

B: ABS=7

B: SW=1




进入 /dev/input 目录,发现在3个device文件:mice,mouse0,event0,分别 cat这3个文件,发现只有 event0 有反应,如下图:

而且不管是点击鼠标还是按键,都有反应,但显示的是一堆乱码,而且点击鼠标出来的东西要多一点,难道这就是传说是的 touchscreen ?!
为了分析 event0 的返回值,写了一段代码 testmice.c,如下:
#include <stdio.h>

#include <stdlib.h>

#include <fcntl.h>

#include <linux/input.h>static int event0_fd = -1;

struct input_event ev0[64];//for handling event0, mouse/key/ts

static int handle_event0() {

    int button = 0, realx = 0, realy = 0, i, rd;    rd = read(event0_fd, ev0, sizeof(struct input_event) * 64);

    if ( rd < sizeof(struct input_event) ) return 0;    for (i = 0; i < rd / sizeof(struct input_event); i++) {

        printf("", ev0.type, ev0.code, ev0.value);

        if (ev0.type == 3 && ev0.code == 0)

            realx = ev0.value;

        else if (ev0.type == 3 && ev0.code == 1)

            realy = ev0.value;

        else if (ev0.type == 1) {

            if (ev0.code == 158) {

                //if key esc then exit

                return 0;

            }

        } else if (ev0.type == 0 && ev0.code == 0 && ev0.value == 0) {

            realx = 0, realy = 0;

        }

        printf("event(%d): type: %d; code: %3d; value: %3d; realx: %3d; realy: %3d\n", i,

   ev0.type, ev0.code, ev0.value, realx, realy);

    }    return 1;

}int main(void) {

int done = 1;

    printf("sizeof(struct input_event) = %d\n", sizeof(struct input_event));    event0_fd = open("/dev/input/event0", O_RDWR);    if ( event0_fd < 0 )

        return -1;    while ( done ) {

  printf("begin handel_event0...\n");

        done = handle_event0();

  printf("end handel_event0...\n");

    }    if ( event0_fd > 0 ) {

        close(event0_fd);

        event0_fd = -1;

    }    return 0;}




用交叉编译器编译好后(编译过程就不再详述,请参见 blog:Android原生(Native)C开发之一:环境搭建篇),push至 emulator后执行后,切换到android 模拟器,在模拟器上点几下mouse,程序就会打出你点击的信息,效果如下,果然能正确得到点击的 mouse pos,如下图:


分析上面的返回值,发现当按下 mouse left button 时,会得到4个事件,2个 type = 3 的事件返回了 pos x, pos y 的值,即mouse click pos, 另外1个 type = 1 的事件是按键事件(keydown),value就是按下的键的key,为0的应该就是 key的release事件,当松开 mouse时,也会得到两个 type = 1, 0 的事件,没有仔细去看它们的返回值,反正已经正确得到了 mosue的事件,下一步就是改SDL的事件驱动源码了...
回复

使用道具 举报

该用户从未签到

发表于 2011-10-22 12:22:49 | 显示全部楼层

Re:[实例教程]Android原生(Native)C开发之三:鼠标事件

感谢楼主分享,学习了
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

GMT+8, 2024-5-5 19:56 , Processed in 0.469528 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表