android 有很多传感器,可以利用传感器实现很多新奇的功能,在这里我们实现水平仪的功能,主要是利用方向传感器就可以了。
1.android 的坐标系是如何定义x, y z 轴的。
x轴的方向是沿着屏幕的水平方向从左向右,如果手机不是正方形的话,较短的边需要水平放置,较长的边需要垂直放置。
Y轴的方向是从屏幕的左下角开始沿着屏幕的的垂直方向指向屏幕的顶端。
将手机放在桌子上,z轴的方向是从手机指向天空。
2.方向传感器
在方向传感器中values变量的3个值都表示度数,它们的含义如下:
values[0]:该值表示方位,也就是手机绕着Z轴旋转的角度。0表示北(North);90表示东(East);180表示南(South);270表示西(West)。如果values[0]的值正好是这4个值,并且手机是水平放置,表示手机的正前方就是这4个方向。
values[1]:该值表示倾斜度,或手机翘起的程度。当手机绕着X轴倾斜时该值发生变化。values[1]的取值范围是-180≤values[1]≤180。假设将手机屏幕朝上水平放在桌子上,这时如果桌子是完全水平的,values[1]的值应该是0(由于很少有桌子是绝对水平的,因此,该值很可能不为0,但一般都是-5和5之间的某个值)。这时从手机顶部开始抬起,直到将手机沿X轴旋转180度(屏幕向下水平放在桌面上)。在这个旋转过程中,values[1]会在0到-180之间变化,也就是说,从手机顶部抬起时,values[1]的值会逐渐变小,直到等于-180。如果从手机底部开始抬起,直到将手机沿X轴旋转180度,这时values[1]会在0到180之间变化。也就是values[1]的值会逐渐增大,直到等于180。
values[2]:表示手机沿着Y轴的滚动角度。取值范围是-90≤values[2]≤90。假设将手机屏幕朝上水平放在桌面上,这时如果桌面是平的,values[2]的值应为0。将手机左侧逐渐抬起时,values[2]的值逐渐变小,直到手机垂直于桌面放置,这时values[2]的值是-90。将手机右侧逐渐抬起时,values[2]的值逐渐增大,直到手机垂直于桌面放置,这时values[2]的值是90。在垂直位置时继续向右或向左滚动,values[2]的值会继续在-90至90之间变化。
笔者在实现水平仪的过程中发现一个问题,由于笔者只有摩托defy手机一部,搭载的是android 4.0系统,发现需要注册方向传感器、加速度传感器、磁场传感器(可能不需要),而不是大多说网上说的只注册方向传感器就可以了,只注册方向传感器只能获取到values[0],values[1]、values[2]不能正常获取的到。
现在这个水平仪还有一个问题就是水泡有些闪烁的厉害,基本功能已经实现了。有人改进了可以告诉一下我。
1.自定义LevelView.java,这个ImageView就是自定义水平仪的表盘和水泡View
1 package com.example.level; 2 import android.content.Context; 3 import android.graphics.Bitmap; 4 import android.graphics.BitmapFactory; 5 import android.graphics.Canvas; 6 import android.util.AttributeSet; 7 import android.widget.ImageView; 8 9 public class LevelView extends ImageView{ 10 //定义水平仪的表盘图片 11 Bitmap back_c; 12 //定义水平仪的气泡图片 13 Bitmap bubble_l; 14 //定义圆形水平仪中气泡x、y的坐标 15 int bubbleX_c,bubbleY_c; 16 public LevelView(Context context, AttributeSet attrs) { 17 super(context, attrs); 18 // TODO Auto-generated constructor stub 19 //加载水平仪图片和气泡图片 20 back_c=BitmapFactory.decodeResource(getResources(), R.drawable.level); 21 bubble_l=BitmapFactory.decodeResource(getResources(), R.drawable.ball_l); 22 } 23 @Override 24 protected void onDraw(Canvas canvas){ 25 super.onDraw(canvas); 26 canvas.drawBitmap(back_c,(getWidth()-back_c.getWidth())/2, 27 (getHeight()-back_c.getHeight())/2,null); 28 canvas.drawBitmap(bubble_l,(getWidth()-back_c.getWidth())/2+bubbleX_c, 29 (getHeight()-back_c.getHeight())/2+bubbleY_c,null); 30 } 31 }
2.主Activity,MainActivity.java
1<