android 不同方向重力感应计算

上一篇 / 下一篇  2012-12-20 13:31:49 / 个人分类:android开发

android中提供了重力感应,大多数我们使用的是加速度感应器,对于手机和平板来说还有不同,他们的相对的正方向的对应值是不同的。
首先介绍一下手机的重力感应方向:
手机屏幕向左侧方当X轴就朝向天空,垂直放置 这时候 Y 轴 与 Z轴没有重力分量,因为X轴朝向天空所以它的重力分量则最大 。这时候X轴 Y轴 Z轴的重力分量的值分别为(10,0,0)
       手机屏幕向右侧方当X轴就朝向地面,垂直放置 这时候 Y 轴 与 Z轴没有重力分量,因为X轴朝向地面所以它的重力分量则最小 。这时候X轴 Y轴 Z轴的重力分量的值分别为(-10,0,0)
       手机屏幕垂直竖立放置方当Y轴就朝向天空,垂直放置 这时候 X 轴 与 Z轴没有重力分量,因为Y轴朝向天空所以它的重力分量则最大 。这时候X轴 Y轴 Z轴的重力分量的值分别为(0,10,0)
       手机屏幕垂直竖立放置方当Y轴就朝向地面,垂直放置 这时候 X 轴 与 Z轴没有重力分量,因为Y轴朝向地面所以它的重力分量则最小 。这时候X轴 Y轴 Z轴的重力分量的值分别为(0,-10,0)

       手机屏幕向上当Z轴就朝向天空,水平放置 这时候 X 轴与Y轴没有重力分量,因为Z轴朝向天空所以它的重力分量则最大 。这时候X轴 Y轴 Z轴的重力分量的值分别为(0,0,10)
       手机屏幕向上当Z轴就朝向地面,水平放置 这时候 X 轴与Y轴没有重力分量,因为Z轴朝向地面所以它的重力分量则最小 。这时候X轴 Y轴 Z轴的重力分量的值分别为(0,0,-10)
上面是最基础的,自己在网上找一下重力感应的例子,试验一下,大多数是单方向的重力感应,而最近开发时要求手机三个方向,平板四个方向进行切换,然后使用重力感应操作小车玩具。
首先,寻找水平位置,我们并不是使用实际的物理水平位置,而是使用当前手机或者平板点击重力感应时的相对水平位置,这就需要获取第一次的加速度值作为差值,然后用之前获取的值减去差值就是我们计算的相对加速度值。
然后就是根据相对加速度值计算方向,这里通过函数来显示,下面中range是你选择的临界值,orientation是重点,它不是Configuration中的方向,而是通过Display获取的方向。
private int[] convertGravity(float dx, float dy, float gx, float gy,
float range,int orientation) {
int leftVolecity = 0;
int rightVolecity = 0;
float my = gy - dy;
float mx = gx - dx;
//Log.i("zhang", "mx :" + mx + "," + "my :" + my+":"+mDisplay_1.getOrientation());
if(Math.abs(mx) > Math.abs(my)){
if (Math.abs(mx) > range && mx > range){
if (orientation == 0){leftVolecity = -10;rightVolecity = 10;
}else if(orientation == 2){leftVolecity = 10;rightVolecity = -10;
}else if (orientation == 1){leftVolecity = -10;rightVolecity = -10;
}else if (orientation == 3){leftVolecity = 10;rightVolecity = 10;}
}else if (Math.abs(mx) > range && mx < -range){
if (orientation == 0){leftVolecity = 10;rightVolecity = -10;
}else if (orientation == 2){leftVolecity = -10;rightVolecity = 10;
}else if (orientation == 1){leftVolecity = 10;rightVolecity = 10;
}else if (orientation == 3){leftVolecity = -10;rightVolecity = -10;}
}
}else if(Math.abs(mx) < Math.abs(my)){
if (Math.abs(my) > range && my > range){
if (orientation == 0){leftVolecity = -10;rightVolecity = -10;
}else if (orientation == 2){leftVolecity = 10;rightVolecity = 10;
}else if (orientation == 1){leftVolecity = 10;rightVolecity = -10;
}else if (orientation == 3){leftVolecity = -10;rightVolecity = 10;}
}else if (Math.abs(my) > range && my < -range){
if (orientation == 0){leftVolecity = 10;rightVolecity = 10;
}else if (orientation == 2){leftVolecity = -10;rightVolecity = -10;
}else if (orientation == 1){leftVolecity = -10;rightVolecity = 10;
}else if (orientation == 3){leftVolecity = 10;rightVolecity = -10;}
}
}
return new int[] { leftVolecity, rightVolecity };
}
最后根据不同的方向值,定义操作物的运动方向。

TAG: Android android

 

评分:0

我来说两句

Open Toolbar