package org.lxh.demo;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.util.AttributeSet;
import android.view.View;
public class ArrowView extends View implements SensorEventListener {
private Bitmap comp = null;
private float[] allValue;
public ArrowView(Context context, AttributeSet attrs) {
super(context, attrs);
// 底色为白色
super.setBackgroundColor(Color.WHITE);
this.comp = BitmapFactory.decodeResource(super.getResources(),
R.drawable.arrow);
// 现在只是找到了一个传感器,但是没有定义类型
SensorManager manager = (SensorManager) context
.getSystemService(Context.SENSOR_SERVICE);
manager.registerListener(this,
// 创建了一个适合于游戏操作的磁场传感器
manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),
SensorManager.SENSOR_DELAY_GAME);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override // 传感器方位改变
public void onSensorChanged(SensorEvent event) {
// 现在是方位传感器
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
float value[] = event.values; // 取得所有的偏离数据
ArrowView.this.allValue = value; // 取得三个轴的值
super.postInvalidate(); // 主线程的现实需要重绘
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint p = new Paint(); // 根据传感器的数值来改变球的速度
if (this.allValue != null) { // 已经取得了数据
float x = this.allValue[0] ;
float y = this.allValue[1] ;
canvas.restore(); // 重置绘图对象
// 设置以屏幕中心点作为旋转中心
canvas.translate(super.getWidth() / 2, super.getHeight() / 2) ;
// 判断y轴是否为0的旋转角度
if (y == 0 && x > 0) {
canvas.rotate(90) ; // 旋转角度为90度
} else if (y == 0 && x < 0) {
canvas.rotate(270) ; // 旋转角度为270度
} else { // 根据x和y的值计算旋转角度,而这个角度就是依靠tan()值来计算
if(y >= 0) {
canvas.rotate((float) Math.tanh(x / y) * 90);
} else {
canvas.rotate(180 + (float) Math.tanh(x / y) * 90);
}
}
}
canvas.drawBitmap(this.comp, -this.comp.getWidth() / 2,
-this.comp.getHeight() / 2, p);
}
}
<org.lxh.demo.ArrowView
android:layout_width="fill_parent"
android:layout_height="wrap_content" />