视图部分:Myview
1、继承view
2、定义水平仪仪表盘图片、气泡图片、气泡坐标
3、构造函数中加载图片
back = BitmapFactory.decodeResource(getResources()
,R.drawable.back);
4、OnDraw函数中绘制图片
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
// 绘制水平仪表盘图片
canvas.drawBitmap(back, 0, 0, null);
// 根据气泡座标绘制气泡
canvas.drawBitmap(bubble, bubbleX, bubbleY, null);
}
activity部分
1、定义视图类、最大倾斜角、真机传感器
MyView show;
// 定义水平仪能处理的最大倾斜角,超过该角度,气泡将直接在位于边界。
int MAX_ANGLE = 30;
// 定义真机的Sensor管理器
SensorManagermSensorManager;
2、oncreate函数中获取真机传感器服务
// 获取真机的传感器管理服务 mSensorManager=(SensorManager)getSystemService(SENSOR_SERVICE);
3、onresume函数中注册监听器
public void onResume()
{
super.onResume();
// 为系统的方向传感器注册监听器
mSensorManager.registerListener(this,
mSensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
SensorManager.SENSOR_DELAY_GAME);
}
4、onpause、onstop中取消监听器
protected void onPause()
{
// 取消注册
mSensorManager.unregisterListener(this);
super.onPause(); }
5、传感器方向判断
public voidonSensorChanged(SensorEvent event)
{
floatvalues=event.values;
intsensorType=event.sensor.getType();
switch(sensorType)
{
case:
·
·
·
·
show.postInvalidate();
break;
}
6、计算气泡坐标是否在仪表盘内
// 计算x、y点的气泡是否处于水平仪的仪表盘内
private boolean isContain(int x, int y)
{
// 计算气泡的圆心座标X、Y
int bubbleCx = x + show.bubble.getWidth() / 2;
int bubbleCy = y + show.bubble.getWidth() / 2;
// 计算水平仪仪表盘的圆心座标X、Y
int backCx = show.back.getWidth() / 2;
int backCy = show.back.getWidth() / 2;
// 计算气泡的圆心与水平仪仪表盘的圆心之间的距离。
double distance = Math.sqrt((bubbleCx - backCx) *(bubbleCx - backCx)
+ (bubbleCy - backCy) * (bubbleCy - backCy));
// 若两个圆心的距离小于它们的半径差,即可认为处于该点的气泡依然位于仪表盘内
if (distance < (show.back.getWidth() - show.bubble.getWidth()) / 2)
{
return true;
}
else
{
return false;
}
}