最近一段时间在搞android的触摸屏校正,想把心得记下来与大家分享,废话不多说,开始讲解.

注:调试使用的是

一、修改内核驱动

修改触摸屏驱动(kernel/drivers/input/touchscreen/s3c-ts.c)

-input_set_abs_params(ts->dev, ABS_X, X_COOR_MIN, X_COOR_MAX, X_COOR_FUZZ, 0);

-input_set_abs_params(ts->dev, ABS_Y, Y_COOR_MIN, Y_COOR_MAX, Y_COOR_FUZZ, 0);

+input_set_abs_params(ts->dev, ABS_X, 0, 0xFFF, 0, 0);

+input_set_abs_params(ts->dev, ABS_Y, 0, 0xFFF, 0, 0);

-input_set_abs_params(ts->dev, ABS_MT_POSITION_X, X_COOR_MIN,X_COOR_MAX, 0, 0);

-input_set_abs_params(ts->dev, ABS_MT_POSITION_Y, Y_COOR_MIN,Y_COOR_MAX, 0, 0);

+input_set_abs_params(ts->dev, ABS_MT_POSITION_X, 0, 0xFFF, 0, 0);

+input_set_abs_params(ts->dev, ABS_MT_POSITION_Y, 0, 0xFFF, 0, 0);

if(m_status == 1){

input_report_abs(ts->dev, ABS_MT_TOUCH_MAJOR, 500);

input_report_abs(ts->dev, ABS_MT_POSITION_X, m_lx);

input_report_abs(ts->dev, ABS_MT_POSITION_Y, m_ly);

+input_report_abs(ts->dev, ABS_PRESSURE, 1);

printk("X1:%d Y1:%d/n",m_lx,m_ly);

input_mt_sync(ts->dev);

input_report_abs(ts->dev, ABS_MT_TOUCH_MAJOR, 500);

input_report_abs(ts->dev, ABS_MT_POSITION_X, press_x);

input_report_abs(ts->dev, ABS_MT_POSITION_Y, press_y);

+ input_report_abs(ts->dev, ABS_PRESSURE, 1);

input_mt_sync(ts->dev);

}

else{

input_report_abs(ts->dev, ABS_MT_TOUCH_MAJOR, 500);

input_report_abs(ts->dev, ABS_MT_POSITION_X, x);

input_report_abs(ts->dev, ABS_MT_POSITION_Y, y);

+ input_report_abs(ts->dev, ABS_PRESSURE, 1);

printk("X2:%d Y2:%d/n",x,y);

input_mt_sync(ts->dev);

}

#if 1

+ input_report_abs(ts->dev, ABS_PRESSURE, 0);

#endif

-input_set_abs_params(ts->dev, ABS_X, X_COOR_MIN, X_COOR_MAX, X_COOR_FUZZ, 0);

-input_set_abs_params(ts->dev, ABS_Y, Y_COOR_MIN, Y_COOR_MAX, Y_COOR_FUZZ, 0);

+input_set_abs_params(ts->dev, ABS_X, 0, 0xFFF, 0, 0);

+input_set_abs_params(ts->dev, ABS_Y, 0, 0xFFF, 0, 0);

-input_set_abs_params(ts->dev, ABS_MT_POSITION_X, X_COOR_MIN,X_COOR_MAX, 0, 0);

-input_set_abs_params(ts->dev, ABS_MT_POSITION_Y, Y_COOR_MIN,Y_COOR_MAX, 0, 0);

+input_set_abs_params(ts->dev, ABS_MT_POSITION_X, 0, 0xFFF, 0, 0);

+input_set_abs_params(ts->dev, ABS_MT_POSITION_Y, 0, 0xFFF, 0, 0);

if(m_status == 1){

input_report_abs(ts->dev, ABS_MT_TOUCH_MAJOR, 500);

input_report_abs(ts->dev, ABS_MT_POSITION_X, m_lx);

input_report_abs(ts->dev, ABS_MT_POSITION_Y, m_ly);

+input_report_abs(ts->dev, ABS_PRESSURE, 1);

printk("X1:%d Y1:%d/n",m_lx,m_ly);

input_mt_sync(ts->dev);

input_report_abs(ts->dev, ABS_MT_TOUCH_MAJOR, 500);

input_report_abs(ts->dev, ABS_MT_POSITION_X, press_x);

input_report_abs(ts->dev, ABS_MT_POSITION_Y, press_y);

+ input_report_abs(ts->dev, ABS_PRESSURE, 1);

input_mt_sync(ts->dev);

}

else {

input_report_abs(ts->dev, ABS_MT_TOUCH_MAJOR, 500);

input_report_abs(ts->dev, ABS_MT_POSITION_X, x);

input_report_abs(ts->dev, ABS_MT_POSITION_Y, y);

+ input_report_abs(ts->dev, ABS_PRESSURE, 1);

printk("X2:%d Y2:%d/n",x,y);

input_mt_sync(ts->dev);

}

#if 1

+ input_report_abs(ts->dev, ABS_PRESSURE, 0);

#endif

这样做的目的是根据使内核不使用限定好的坐标范围,x,y的坐标范围还原成0-4095

二、修改property_service.c(android2_2/system/core/init/property_service.c)

在property_perms增加

{

"ts.config.calibrate" , AID_SYSTEM, 0 }

这样做的目的是为可以了后面使用触摸屏校正程序可以对ts.config.calibrate这个系统属性进行操作,后面会说到.

三、修改InputDevice.java(android2_2/frameworks/base/services/java/com/android/server/InputDevice.java)

在generateAbsMotion函数中增加

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

if(prop!=null)

{

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

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

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

device.tInfo =null;

}

elseif(prop.equalsIgnoreCase("done")){

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

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

readCalibrate();

device.tInfo=tInfo;

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

}

else{

Slog.i("XXW prop", prop);

Slog.i("XXW","prop.equalsIgnoreCase else");

}

}

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

if (prop!=null)

{

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

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

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

device.tInfo = null;

}

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

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

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

readCalibrate();

device.tInfo=tInfo;

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

}

else{

Slog.i("XXW prop", prop);

Slog.i("XXW", "prop.equalsIgnoreCase else");

}

}

这里使用到系统属性ts.config.calibrate,当系统判断为现在处于触摸屏校正模式的时候(也就是ts.config.calibrate值为start的时候),不对驱动传递上来的坐标值进行转换.

上面第二点在在property_perms增加{

"ts.config.calibrate" , AID_SYSTEM, 0

}是为了系统有权限可以设置/读取这个属性

增加函数

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

staticvoidreadCalibrate(){

//xxw added

Slog.i("XXW","readCalibrate!");

TransformInfo t =null;

try{

FileInputStream is =newFileInputStream(CALIBRATION_FILE);

byte[] mBuffer =newbyte[64];

intlen = is.read(mBuffer);

is.close();

if(len >0) {

inti;

for(i =0; i

if(mBuffer[i] =='/n'||mBuffer[i] ==0) {

break;

}

}

len = i;

}

StringTokenizer st =newStringTokenizer(newString(mBuffer,0,0, len));

t =newTransformInfo ();

t.x1 = Integer.parseInt( st.nextToken() );

t.y1 = Integer.parseInt( st.nextToken() );

t.z1 = Integer.parseInt( st.nextToken() );

t.x2 = Integer.parseInt( st.nextToken() );

t.y2 = Integer.parseInt( st.nextToken() );

t.z2 = Integer.parseInt( st.nextToken() );

t.s = Integer.parseInt( st.nextToken() );

}catch(java.io.FileNotFoundException e) {

Slog.i("XXW","FileNotFound!");

}catch(java.io.IOException e) {

Slog.i("XXW","IOException");

}

tInfo = t;

Slog.i("XXW","readCalibrate done!");

}

static void readCalibrate(){

//xxw added

Slog.i("XXW","readCalibrate!");

TransformInfo t = null;

try {

FileInputStream is = new FileInputStream(CALIBRATION_FILE);

byte[] mBuffer = new byte[64];

int len = is.read(mBuffer);

is.close();

if (len > 0) {

int i;

for (i = 0 ; i < len ; i++) {

if (mBuffer[i] == '/n'||mBuffer[i] == 0) {

break;

}

}

len = i;

}

StringTokenizer st = new StringTokenizer( new String(mBuffer, 0, 0, len));

t = new TransformInfo ();

t.x1 = Integer.parseInt( st.nextToken() );

t.y1 = Integer.parseInt( st.nextToken() );

t.z1 = Integer.parseInt( st.nextToken() );

t.x2 = Integer.parseInt( st.nextToken() );

t.y2 = Integer.parseInt( st.nextToken() );

t.z2 = Integer.parseInt( st.nextToken() );

t.s = Integer.parseInt( st.nextToken() );

} catch (java.io.FileNotFoundException e) {

Slog.i("XXW", "FileNotFound!");

} catch (java.io.IOException e) {

Slog.i("XXW", "IOException");

}

tInfo = t;

Slog.i("XXW","readCalibrate done!");

}

修改InputDevice函数

·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150

InputDevice(int_id,int_classes, String _name,

AbsoluteInfo _absX, AbsoluteInfo _absY,

AbsoluteInfo _absPressure, AbsoluteInfo _absSize) {

id = _id;

classes = _classes;

name = _name;

absX = _absX;

absY = _absY;

absPressure = _absPressure;

absSize = _absSize;

readCalibrate();

InputDevice(int _id, int _classes, String _name,

AbsoluteInfo _absX, AbsoluteInfo _absY,

AbsoluteInfo _absPressure, AbsoluteInfo _absSize) {

id = _id;

classes = _classes;

name = _name;

absX = _absX;

absY = _absY;

absPressure = _absPressure;

absSize = _absSize;

readCalibrate();

编译后生成services.jar,须替换android文件系统里面的system/framwork里面的services.jar

四、修改触摸屏校正程序

修改onTouchEvent(CalibrationTest.java)

CalibrationTest.java这里是我使用的触摸屏校正程序,我的屏的分辨率为800*480,所以改成

mResultPts[(STEP -1) * mPtsLength] =

event.getX()*4095/(800-1);

mResultPts[(STEP -1) * mPtsLength + 1] =

event.getY()*4095/(480-1);

修改AndroidManifest.xml 增加

android:sharedUserId="android.uid.system"

xmlns:android="http://schemas.android.com/apk/res/android"

package="touchscreen.test"

android:sharedUserId="android.uid.system">

修改 Android.mk增加

LOCAL_CERTIFICATE := platform

五、修改init.rc增加

#create tslib

mkdir

/data/system/tslib/ 0777

chmod 0666

/data/system/tslib/pointercal

触摸屏校正看来起貌似简单,但要改的东西确实太多,我自己也是摸索了好几天才搞定的,呵呵!

android触摸屏坐标转换,(转)android触摸屏校正详解相关推荐

  1. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

  2. android中怎么网络判断,Android中判断网络是否连接实例详解

    Android中判断网络是否连接实例详解 在android中,如何监测网络的状态呢,这个有的时候也是十分重要的,方法如下: public class ConnectionDetector { priv ...

  3. 【转】Android APK反编译就这么简单 详解(附图)

     转自:http://blog.csdn.net/vipzjyno1/article/details/21039349/ [置顶] Android APK反编译就这么简单 详解(附图) 分类: and ...

  4. android组件用法说明,Android第三方控件PhotoView使用方法详解

    Android第三方控件PhotoView使用方法详解 发布时间:2020-10-21 15:06:09 来源:脚本之家 阅读:74 作者:zhaihaohao1 PhotoView的简介: 这是一个 ...

  5. Android 颜色渲染(九) PorterDuff及Xfermode详解

    Android 颜色渲染(九)  PorterDuff及Xfermode详解 之前已经讲过了除ComposeShader之外Shader的全部子类, 在讲ComposeShader(组合渲染)之前,  ...

  6. android 截图 listview,Android屏幕及view的截图实例详解

    Android屏幕及view的截图实例详解 屏幕可见区域的截图 整个屏幕截图的话可以用View view = getWindow().getDecorView(); public static Bit ...

  7. Android消息传递之EventBus 3.0使用详解

    前言: 前面两篇不仅学习了子线程与UI主线程之间的通信方式,也学习了如何实现组件之间通信,基于前面的知识我们今天来分析一下EventBus是如何管理事件总线的,EventBus到底是不是最佳方案?学习 ...

  8. Android低功耗蓝牙(BLE)使用详解

    代码地址如下: http://www.demodashi.com/demo/13390.html 与普通蓝牙相比,低功耗蓝牙显著降低了能量消耗,允许Android应用程序与具有更严格电源要求的BLE设 ...

  9. Android系统(96)---Android 数据交换解析框架Gson使用详解

    Android 数据交换解析框架Gson使用详解 Json 是一种文本形式的数据交换格式,比 xml 更为轻量.Json 的解析和生成的方式很多,在 Android 平台上最常用的类库有 Gson 和 ...

  10. android自定义view案例,Android自定义View的实现方法实例详解

    一.自绘控件 下面我们准备来自定义一个计数器View,这个View可以响应用户的点击事件,并自动记录一共点击了多少次.新建一个CounterView继承自View,代码如下所示: 可以看到,首先我们在 ...

最新文章

  1. 如何让自学更有效率?
  2. 4-uboot编译流程
  3. 运行ant脚本(转载)
  4. Java内存泄漏问题
  5. [Head First Java] - 线程共享数据问题
  6. [转载] Java | Java 面向对象知识小抄
  7. mac安装python3.7_MAC 安装Python3.7
  8. 520 丁磊向全国英语老师“表白”:再送有道词典笔
  9. 交换机端口mtu值最大_交换机 MTU
  10. akka mysql_Spray + Akka高性能异步IO并发
  11. 关于urlEncode
  12. NagiosQL 3的安装
  13. echarts实现省份迁徙图
  14. Day 9 2021.3.10多线程-Lambda表达式-File类
  15. 1.maya基本操作
  16. Java开源在线商城系统 ostocy-jshop
  17. 中国电信无线网服务器,中国电信网上营业厅
  18. MOOC人工智能原理学习笔记1
  19. 无人驾驶卡车开上干线,嬴彻科技、主线科技们如何拿下产业化赛点?
  20. Matlab提取矩阵行数与列数

热门文章

  1. CAD格式转换大全你想要的转换格式这里都有
  2. erlang游戏源码--英雄远征分析
  3. echarts 图表导出PDF(带滚动条)/图片导出PDF
  4. 电脑wps可以语音录入吗_wps电脑如何设置语音播报
  5. 初学XML,用什么编辑器?
  6. 24点游戏c++实现
  7. 《数据新闻大趋势》:数据新闻将成为主流?
  8. python readline 返回行号_python readline()返回多行
  9. Kotlin学习笔记(一)
  10. 让看代码成为一种享受! 使用Carbon生成漂亮的代码图片