紧跟着上一篇博文,在android内核中实现屏幕校准,这一篇博文主要做的便是将可执行文件ts_calibrate移植成android的apk应用。
现在我们已经知道,ts_calibrate就是取了触摸屏 5个点的坐标,然后与对应的显示屏的点坐标联立方程,求解得到7个校准参数。
直接上源码过程:
新建一个类Calibrate,类方法perform_calibration()实现上述求解7个校准参数的算法,calibrate_main()将7个校准参数生成pointercal文件。具体实现都是从tslib源码目录下tests/ts_calibrate.c中copy出来的。
然后就是画一个校准页面引导点击屏幕的操作,依次取得5个点的坐标。
先在校准页面TSCalibrateActivity里获取一下屏幕的相关参数:
Display display = this.getWindowManager().getDefaultDisplay();
Point outSize = new Point();
// 通过Display对象获取屏幕宽、高数据并保存到Point对象中
display.getSize(outSize);
// 从Point对象中获取宽、高
UI_SCREEN_WIDTH = 800;//outSize.x;
UI_SCREEN_HEIGHT = 480;//outSize.y;
但实际情况是,获取出来的值一直对不上,本来是分辨率800 * 480,获取的结果一直是752 * 480,查过了什么状态栏导航栏这些,但是我用的全屏显示,没这两个啊。没搞懂,先写死吧。
根据上面取出来的UI_SCREEN_WIDTH 、UI_SCREEN_HEIGHT,确定了显示屏的左上角、右上角、右下角、左下角、中间的坐标。并依此实现屏幕校准的引导页面。
接下来就是确定触摸屏的5个点坐标,
android上取点坐标的方法,比如通过getX()或者getRawX()都是取的显示屏的坐标,所以需要做换算一下。查阅资料,具体可以参考博文 (链接: link.)
其中两个公式:
x=(x-xmin)*480/(xmax-xmin) ;
y=(y-ymin)*800/(ymax-ymin);
将公式逆推下,就可以从显示屏的坐标换算成触摸屏的点坐标了
x1 = (int)(( event.getRawX() * 4095.0 ) / (float)UI_SCREEN_WIDTH);//4095
y1 = (int)(( event.getRawY() * 4095.0 ) / (float)UI_SCREEN_HEIGHT);//usb touch x 0x7ff
然后你以为这样取的点坐标,用Calibrate去处理就万事大吉了?
根据我的血泪教训,那就是错觉。。。。
因为我们在上一篇博文中,我已经改了屏幕驱动,现在通过android获取的显示屏的坐标是已经经过校准的了,用这个校准后的显示屏坐标换算出来的触摸屏坐标也是换算过后的,并不是原始的坐标!!!
就这,肯定得不出能用的7个校准参数啊 - -||
所以,后来我又在屏幕驱动里添加了一个calibration_flag,用来标志是否进行校准:
if(calibration_flag == 1)
{array_x[cnt] = LCD_X;array_y[cnt] = LCD_Y;
}
else
{array_x[cnt] = X;array_y[cnt] = Y;
}
在进入屏幕校准程序后,就将这个标志位写0;完成校准后,将标志位写1。
这样我的apk才算是大功告成。附一张成果图:
大部分源码都是从另一份源码上找的,我根据自己的实际情况从上面做了修改。有需要的可以下载看看。