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" />