分享

Android 屏幕重力感应

 wanwanstudy 2012-02-09

由于重力感应器在板上安装的方向不同,而移植时需要调整相关的代码。

解决屏幕显示颠倒相关问题,相关的有两部分代码:

1. 内核重力感应器驱动部分,如 MMA7660

1vi drivers/input/gsensor/mma7660.c

在这个文件中寻找相似以下的代码

1axis.y = mma7660_convert_to_int(buffer[MMA7660_REG_X_OUT]);
2axis.x = mma7660_convert_to_int(buffer[MMA7660_REG_Y_OUT]);
3axis.z = mma7660_convert_to_int(buffer[MMA7660_REG_Z_OUT]);

然后按照你自己板的需要,将 X,Y 进行交换,进行相反数运算,将 Z 进行相反运算。

其实可以做得更方便一些,把这几个操作写到 Kconfig 里面,通过宏来控制这些运算,就不用再改代码了。

01#ifdef CONFIG_SWAP_XY
02{
03  typeof(x) __tmp;
04  __tmp = x;
05  x = y;
06  y = __tmp;
07}
08#endif
09 
10#ifdef CONFIG_REVERSE_X
11  x = -x;
12#endif
13 
14#ifdef CONFIG_REVERSE_Y
15  y = -y;
16#endif
17/* X Y 感应方向有问题,这很容易看出来。 */
18#ifdef CONFIG_REVERSE_Z
19  z = -z;  /* 按正常情况下拿着设备,屏幕斜向上,如果不灵敏,把屏幕朝下试试,如果灵敏了,一般是 Z 反了。 */
20#endif

2. Android部分,如果出现菜单显示正常,但是玩重力感应游戏时有问题,这部分就要修改(2.1)

1vim frameworks/base/core/java/android/view/WindowOrientationListener.java
1public void onSensorChanged(SensorEvent event) {
2    float[] values = event.values;
3    float X = values[_DATA_X];
4    float Y = values[_DATA_Y];
5    float Z = values[_DATA_Z];
6    float OneEightyOverPi = 57.29577957855f;
7    float gravity = (float) Math.sqrt(X*X+Y*Y+Z*Z);

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多