android 电阻单点触摸屏校准

[复制链接]

今天做了android下触摸屏的校准,注意触摸屏可能有不一样,我们目前是用的是单点的电阻是触摸屏,android 平台是 2.1

下面来说下触摸屏的校准

client 采集数据:计算校对系数,写入文件 /data/etc/xxxx  通过propty来设置状态   InputDevice.java 根据propty 来读取校对的系数来校对数据。

校对数据模型采用    M=ax+by+k1;  N=cx+dy+k2,其中 M,N为经校对系数计算后的准确的触摸屏位置。

那么我们要做的是通过数据采集来计算a,b,k1,c,d,k2,对于每一维的坐标,都是三个系数,因此我们采集三个有效的数据点。成而得到

M1=ax1+by1+k1 ; N1=cx1+dy1+k2

M2=ax2+by2+k1 ; N2=cx2+dy2+k2

M3=ax2+by2+k1 ; N3=cx2+dy2+k2,其中(M1,N1),(M2,N2),(M3,N3),是你校对的标准数据,我的代码里取

做上角(32,32),右上脚(SCREEN_WIDTH-32,32),右下脚(32,SCREEN_HEIGHT-32),

(x1,y1),(x2,y2),(x3,y3)分别是获取的没校准前的 触摸屏的数据。

那么可以解得a,b,k1,c,d,k2,让后将这6个数据写入到/data/et/xxx文件中。

然后InputDevice.java读取propty的状态来决定是否使用校对系数.。

当触摸屏设置完后就会设置为done

当InputDevie 发现propty为done的时候读取校对系数建立校对模型。

有触摸屏传来的数据(x,y),那么由公式,X准=ax+by+k1; Y准=cx+dy+k2; 试验验证准有效

代码分析:

界面代码 TouchCalibration.java,它很简单,一个全屏的activty

模型M的取值范围

int xList[] = {

32, UI_SCREEN_WIDTH - 32, 32, UI_SCREEN_WIDTH - 32, UI_SCREEN_WIDTH / 2

};

模型N的取值范围

int yList[] = {

32, 32, UI_SCREEN_HEIGHT - 32, UI_SCREEN_HEIGHT - 32, UI_SCREEN_HEIGHT / 2

};

为五个参考点的坐标,其实只用了3个点,哈哈(还没搞明白五个点的数学模型,如果有知道的,希望能不吝赐教)

重载 onTouchEvent的接口,然后活去取三个点的实际触摸到的坐标

x1,y1,x2,y2,x3,y3,而这个准确的位置分别对应了xList[0],yList[0],xList[1],yList[1],xList[2],yList[2],

取道数据后,用Calibrate.java来计算出 a,b,k1,c,d,k2,三个未知数三个一次方程求解,

主要函数在perform_calibration 中

a=((y3-y2)*(M2-M1)-(M3-M2)*(y2-y1))/((y3-y2)*(x2-x1)-(y2-y1)*(x3-x2))

其它的可以自己计算出来,

float M1,M2,M3,N1,N2,N3;

float a,b,k1,c,d,k2;

float x1,y1,x2,y2,x3,y3;

float mul,div;

float scaling = (float)65536.0;

M1=cal.xfb[0];

N1=cal.yfb[0];

M2=cal.xfb[1];

N2=cal.yfb[1];

M3=cal.xfb[2];

N3=cal.yfb[2];

x1=cal.x[0];

y1=cal.y[0];

x2=cal.x[1];

y2=cal.y[1];

x3=cal.x[2];

y3=cal.y[2];

div=((y3-y2)*(x2-x1)-(y2-y1)*(x3-x2));

mul=((y3-y2)*(M2-M1)-(M3-M2)*(y2-y1));

a=mul/div;

div=((x3-x2)*(y2-y1)-(x2-x1)*(y3-y2));

mul=(x3-x2)*(M2-M1)-(x2-x1)*(M3-M2);

b=mul/div;

k1=M1-a*x1-b*y1;

div=((y3-y2)*(x2-x1)-(y2-y1)*(x3-x2));

mul=((y3-y2)*(N2-N1)-(N3-N2)*(y2-y1));

c=mul/div;

div=((x3-x2)*(y2-y1)-(x2-x1)*(y3-y2));

mul=(x3-x2)*(N2-N1)-(x2-x1)*(N3-N2);

d=mul/div;

k2=N1-c*x1-d*y1;

Log.d("[hd debug]",a+":"+b+":"+k1+":"+c+":"+d+":"+k2+":");

cal.a[0]=(int)(a*scaling);

cal.a[1]=(int)(b*scaling);

cal.a[2]=(int)(k1*scaling);

cal.a[3]=(int)(c*scaling);

cal.a[4]=(int)(d*scaling);

cal.a[5]=(int)(k2*scaling);

cal.a[6]=(int)(scaling);

return true;

然后将三计算出来的值写入文件/data/etc/pointercal中,并设置ts.config.calibrate propty为done,

ts.config.calibrate propty是InputDevice.java,与触摸校对程序的通讯标志。

InputDevice.java 中修改你的generateAbsMotion函数,据说android 2.1支持多点触摸,我们用电阻式,所以没有去追究。

(我没有看懂)InputDevice.java代码,修改generateAbsMotion只能满足我的项目的需求,请仔细思考这里。

String prop = SystemProperties.get("ts.config.calibrate", "noset");

if (prop.equalsIgnoreCase("start")){

Log.d("XXW prop", prop);

Log.d("XXW", "prop.equalsIgnoreCase start");

device.tInfo = null;

}else if (prop.equalsIgnoreCase("done")){

Log.d("XXW prop", prop);

Log.d("XXW", "prop.equalsIgnoreCase done");

readCalibrate();

device.tInfo=tInfo;

SystemProperties.set("ts.config.calibrate", "end");

}else{

Log.d("XXW prop", prop);

Log.d("XXW", "prop.equalsIgnoreCase else");

}

这里根据propty设置是否采用校验系数,

如果采用的话,那么就使用隐射模型:

if (absX != null) {

if (device.tInfo != null){

reportData[j + MotionEvent.SAMPLE_X] = (device.tInfo.x1 * x + device.tInfo.y1 * y + device.tInfo.z1);

}

}

if (absY != null) {

if (device.tInfo != null){

reportData[j + MotionEvent.SAMPLE_Y] = (device.tInfo.x2 * x + device.tInfo.y2 * y + device.tInfo.z2);

}

}

来计算出新的坐标,

代码将在我的资源里给出,有心趣的同学自己实现,没有兴趣的同学花点分,去下载资源源码也是可以的。

电阻触摸屏 linux 校准软件,android 电阻单点触摸屏校准相关推荐

  1. RK3288 10.1寸电阻触摸屏调试与校准软件的运行

    作者:Dennis 电话:13349909990(微信同号) 邮箱:dennis@we-signage.com 说明:本文所提供的技术方案适用于 恒耀源科技有限公司 RK3288主板以及使用该主板的所 ...

  2. Android电阻触摸屏校准

    首先电阻屏为什么需要校准,这是电气方面的知识,我也不懂,这里就不说了,这里主要讲讲自己在项目中是怎么通过应用程序来实现校准的,好记性不如烂笔头这里有一篇讲解触摸屏校准原理和优化的文章,道客巴巴上的,先 ...

  3. 在Linux中运行Android软件

    想要在PC上运行Android软件就需要模拟器,Windows版的Android模拟器软件很多,但是Linux平台的就不多了,今天推荐一款Linux下的Android模拟器软件Anbox Anbox官 ...

  4. 2011年linux数据库的android在线分享

    www.linuxidc.com 2011年9月12日 21:39 <目录> Android 3D 游戏开发教程 2011年10月19日 19:53 <目录> Android ...

  5. 嵌入式linux和嵌入式android系统有什么区别和联系?

    转自:http://bbs.eeworld.com.cn/thread-430437-1-1.html 这个问题很多人问,尤其是初入嵌入式的菜鸟.其实大家都认为android是java,已经不是lin ...

  6. Linux Kernel and Android 休眠与唤醒(中文版)

    Linux Kernel and Android 休眠与唤醒(中文版) 四月 18th, 2010 0 Comments/1664 hits Table of Contents 简介 国际化 版本信息 ...

  7. 安卓虚拟linux系统教程,在Linux上模拟Android应用程序的3种方法 | MOS86

    如果您是Android的忠实拥护者,那么您可能已经知道自己最喜欢的移动操作系统是Linux. 过去我们已经介绍了Android如何基于开放源代码组件,Android真的是开放源代码吗? Android ...

  8. android 触摸防抖,一种触摸屏防抖优化方法、系统及触摸屏终端与流程

    本发明涉及触摸屏技术领域,尤其涉及一种触摸屏防抖优化方法.系统及触摸屏终端. 背景技术: 随着电子信息产业的快速发展,触摸屏作为具有人机交互功能的智能产品,应用面极为广泛,但其存在着较多的触摸抖动问题 ...

  9. 以wifi为媒介,linux系统与android设备交互

    -.通过hostapd.dhcp和iptables创建wifi热点 我早在三年前,就注意android了.不过最近才买了台天宇w719,而之前我一直在用MTK平台手机. 买手机之前一个星期内,我通过互 ...

  10. 在UBUNTU LINUX下搭建 ANDROID开发

    菜鸟系列之一:在 UBUNTU LINUX下搭建 ANDROID开发 第一步:激活 ROOT用户.................................................... ...

最新文章

  1. Ubuntu18.04+RTX 2080Ti+CUDA 10.0 +cuDNN+PyTorch搭建深度学习环境
  2. 干货|2018物流机器人行业报告发布!不容错过
  3. python excel增加一列_(用Python修改excel中一列数据)python新增一列
  4. 【SICP练习】107 练习3.8
  5. SpringBoot系列: Redis基础
  6. 【PAT乙级】1064 朋友数 (20 分)
  7. python中pickle模块_Python pickle模块的用法
  8. 3dvary灯光材质为什么不亮_详解CG灯光渲染师的职业技能
  9. 万能显卡驱动win7_驱动工具更新!完美支持苹果电脑驱动
  10. 【Pygame闯关游戏】手残勿入,最新虐心游戏《见缝插针》——不得不玩的一款游戏。
  11. 物联网大数据商业模式画布-0406-v1.1王玉娟
  12. python: 校园网登录脚本
  13. 高德地图web精准定位
  14. 第二周教学课件及实验任务已发布!
  15. Tomcat里 appBase和docBase的区别
  16. 2020 idea 查看内存消耗_查看运行时某个java对象占用JVM大小及通过idea查看java的内存占用情况...
  17. linux中文麻酱字_红糖麻酱卷的做法——Nice to meet you
  18. OpenGL学习十九:纹理过滤
  19. 关于RBM、DBN和相关问题
  20. linux 媒体管理器,Linux系统的多媒体管理大师-Compupic

热门文章

  1. Centos7 局域网邮件服务器实践
  2. 使用scrapy爬取dota2贴吧数据并进行分析
  3. STRING网站分析蛋白质相互作用
  4. Vue项目打包文件过大(优化)
  5. win10计算机名访问win7,实现Win10与Win7局域网共享,教你这招
  6. 小程序和app究竟哪个好?
  7. QT操作word表格——垂直居中、水平居中
  8. 智能家居语音控制系统项目毕业答辩
  9. 中标麒麟桌面版7.0(NeoKylin linux desktop release 7.0)配置pyqt5运行环境说明
  10. [转]用python来开发webgame服务端(3)