本文 详细介绍了如何利用Android 系统的传感器开发水平仪应用的全过程。通过对该案例开发的讲解, 介绍了传感器应用的开发方法以及通过Eclipse 开发Android 应用程序的过程。
1 Android 平台简介
互联网巨头Google 公司于2007 年11 月5 日推出了全新的嵌入式软件平台---Android, 该平台由操作系统、中间件、用户界面以及应用软件组成, 是一个真正开放的移动应用开发平台。
2007 年11 月初, Google 与其他33 家手机厂商、软硬件供应商、手机芯片供应商、移动运营商联合组成了开放手机联盟(Open Handset Alliance), 发布了名为Android 的手机软件平台, 并宣布该平台完全开放。同时Google 希望Android 平台成为一套标准化、开放式的移动嵌入式软件平台。
由于Android 系统具有开发性、平等性、无界性以及方便性等优点, 所以很快被业界所接受。从2008 年初开始, 越来越多的开发人员投身到Android 应用的开发当中。
而Android 系统的一大亮点之一就是传感器的使用, 利用传感器可以开发出很多新奇有趣的应用程序。例如计步器、水平仪, 甚至在很多游戏中都可以使用传感器来操作游戏。传感器的种类有很多种, 其中包括加速度传感器、姿态传感器、磁场传感器、温度传感器以及光传感器等, 介绍的水平仪应用就是使用姿态传感器的。
2 案例功能
将结合水平仪案例的开发详细介绍如何在Android 平台下开发传感器应用, 下面首先对水平仪的功能及界面进行简单的介绍。
2.1 程序界面
程序运行后的效果如图1 所示, 用户可以通过调整手机的姿态来控制界面中各个气泡的位置。与真正的水平仪一样, 在使用手机水平仪时, 需要将手机平放到某个平面上才可以。
图1 水平仪应用程序界面
2.2 软件功能
运行该程序, 当改变手机的姿态时, 界面中的气泡便会根据手机的姿态向高处进行相应的移动。
当手机所处的平面水平时, 各个气泡都应该位于中间的指定区域。
3 开发环境搭建
正式进入代码开发之前, 首先需要对开发环境进行搭建,其搭建步骤如下所列。
(1) 安装Java 开发环境JDK.
(2) 从网上下载Android 开发环境SDK 的压缩包, 并将其解压到磁盘上的某个位置。
(3) 将SDK 解压目录中的tools 目录添加到系统的PATH环境变量中。
(4) 下载并安装Eclipse 集成开发环境。
(5) 为Eclipse 安装Android 开发插件ADT, 并在Eclipse的Preferences 中配置Android 插件的SDK LOCATION.
(6) 在Eclipse 的AVD Manager 中创建Android 虚拟设备(AVD), 并启动模拟器。
(7) 下载并安装用来调试Android 传感器应用的SeNSorsimulator传感器模拟器软件。
(8) 在模拟器中安装Sensorsimulator 所对应的apk 文件并对其进行调试使Sensorsimulator 应用程序能够与Android 模拟器进行通信。
4 开发前的准备
前面完成了开发环境的搭建, 但在正式进行代码开发之前, 还需要再做一些开发前的准备工作, 其步骤如下:
(1) 首先启动之前安装好Eclipse.
(2) 然后依次点击File|New|Other|Android|Android Project进入项目的创建界面。
(3) 在项目创建界面中, 输入项目的名称、所使用的目标平台、所在的包名等信息, 如图2 所示。
图2 在Eclipse 中创建Android 项目
(4) 点击"Finish" 完成项目的创建。
(5) 在程序中将会用到的图片资源存放到项目文件夹的res/drawable-mdpi 目录下, 如图3 所示。
图3 图片资源
(6) 为应用程序引入调试时使用的Sensorsimulator 支持jar 包, 该jar 包位于Sensorsimulator 安装目录中的bin 目录下:
5 自定义View 的开发
本案例需要自定义一个View 来绘制水平仪的用户界面,首先需要在项目文件夹的SRC/wyf/ytl 目录下创建一个名为Main-View 的java 类, 并使其继承自View 类, 其代码框架如下:
PACkage wyf.ytl; //声明所在包
import android.content.Context;//引入Context 类
import android.graphICs.Bitmap; //引入Bitmap 类
import android.graphics.BitmapFactory; //引入相关类
import android.graphics.CANvas; //引入Canvas 类
import android.graphics.Color; //引入Color 类
import android.graphics.Paint; //引入Paint 类
import android.graphics.RectF; //引入RectF 类
import android.graphics.Paint.Style; //引入Style 类
import android.util.AttributeSet; //引入AttributeSet 类
import android.view.View; //引入View 类
public class MainView extends View{
Paint paint = new Paint(); //画笔
//图片资源的声明
Bitmap shangBitmap1; //上面的大矩形图
Bitmap shangBitmap2; //上面的气泡
Bitmap zuoBitmap1; //左面的大矩形图
Bitmap zuoBitmap2; //左面图的气泡
Bitmap zhongBitmap1; //中间的大圆图
Bitmap zhongBitmap2; //中间的小气泡
Bitmap xiaBitmap1; //右下的矩形图
Bitmap xiaBitmap2; //右下的气泡
//背景矩形的位置声明
int shang1_X = 60; //上面的大矩形图
int shang1_Y = 12;
int zuo1_X = 12; //左面的大矩形图
int zuo1_Y = 60;
int zhong1_X = 65; //中间的大圆图
int zhong1_Y = 65;
int xia1_X = 145; //右下的矩形图
int xia1_Y = 145;//水泡的位置声明
int shang2_X; //上面的气泡XY 坐标
int shang2_Y;
int zuo2_X; //左面图的气泡XY 坐标
int zuo2_Y;
int zhong2_X; //中间的小气泡XY 坐标
int zhong2_Y;
int xia2_X; //右下的气泡XY 坐标
int xia2_Y;
public MainView(Context context, AttributeSet attrs){
super(context, attrs);
initBitmap(); //初始化图片资源
initLOCation(); //初始化气泡的位置
}
private void initBitmap(){ //初始化图片的方法
…//该处省略了部分代码,将在后面进行介绍
}
private void initLocation(){ //初始化气泡位置的方法
…//该处省略了部分代码,将在后面进行介绍
}
@Override
protected void onDraw(Canvas canvas){//重写的绘制方法
super.onDraw(canvas);
…//该处省略了部分代码,将在后面进行介绍
}
}
上述代码中的initBitmap 以及initLocation 方法是对界面进行初始化方法, 而onDraw 方法会根据需要绘制整个界面。
MainView 类构造器中调用了两个单独的方法对整个界面进行了初始化, 这是一种非常好的编程习惯。因为把不同功能的代码各自编写成独立的方法可以使主逻辑清晰, 且各个方法中的代码都不是很长, 会大大提高代码的可读性以及可维护性。
完成了代码框架的开发后就可以对其中各个方法进行开发了, 首先开发的是图片资源的初始化方法, 其代码如下:
private void initBitmap(){ //初始化图片资源的方法
shangBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.shang1);
shangBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.shang2);
zuoBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.zuo1);
zuoBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.zuo2);
zhongBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.zhong1);
zhongBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.zhong2);
xiaBitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.xia1);
xiaBitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.xia2);
}
www.55dianzi.com