android水平仪(水准仪)的实现

本文介绍了如何利用Android设备的方向传感器来创建一个水平仪应用。主要关注传感器坐标系的定义,特别是x, y, z轴的方向,以及方向传感器的三个关键值的含义。在实践中,作者发现仅注册方向传感器无法获取所有需要的数据,还需要结合加速度传感器和磁场传感器。虽然存在水泡闪烁的问题,但基本功能已实现。文章提供了自定义LevelView和MainActivity的实现细节。" 104097919,8025801,Eclipse中添加与部署Tomcat服务器教程,"['Eclipse开发工具', '服务器配置', 'Java Web', 'Tomcat服务器']
摘要由CSDN通过智能技术生成

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<
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值