1.传感器常用方法及常量
android中支持的传感器
2.移动小球(方位传感器)
1、创建一个自定义的View类,Ballview
public class BallView extends View implements SensorEventListener {
private Bitmap ball=null;
private float [] allvalue;
private Point point =new Point();
private int xSpeed,ySpeed;
public BallView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
super.setBackgroundColor(Color.WHITE);//设置背景色
ball= BitmapFactory.decodeResource(getResources(),R.drawable.ball);
SensorManager manager= (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);//找到传感器,但未定义类型
manager.registerListener(this,manager.getDefaultSensor(Sensor.TYPE_ORIENTATION),SensorManager.SENSOR_DELAY_GAME);//创建一个适合游戏的方位传感器
}
@Override
public void onSensorChanged(SensorEvent event) {//传感器方位改变
if (event.sensor.getType()==Sensor.TYPE_ORIENTATION){//现在是方位传感器
float value[]=event.values;//取得所有的偏离数据
allvalue=value;//取得三个轴的值
super.postInvalidate();//主线程的显示需要重绘
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();//根据传感器的值来改变球的速度
if (allvalue!=null){//已经取得了数据
xSpeed=(int)allvalue[2];//计算X轴的速度
ySpeed=(int)-allvalue[1];
}
point.x+=xSpeed;
point.y+=ySpeed;
if (point.x<0){
point.x=0;
}
if (point.x>super.getWidth()-this.ball.getWidth()){//x轴已经显示过了
point.x=super.getWidth()-ball.getWidth();
}
if (point.y>super.getHeight()-this.ball.getHeight()){//y轴已经显示过了
point.y=super.getHeight()-ball.getHeight();//设置y轴的边界
}
canvas.drawBitmap(ball,point.x, point.y,paint);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
2、布局文件
插入自定义的组件ballview
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.fengray.myex032sensor.BallView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
结果:
完美实现
3.使用磁场传感器做个指北针
1、创建一个自定义的View类,arrowview
public class ArrowlView extends View implements SensorEventListener {
private Bitmap comp=null;
private float [] allvalue;
public ArrowlView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
super.setBackgroundColor(Color.WHITE);//设置背景色
comp= BitmapFactory.decodeResource(getResources(),R.drawable.arrows);
SensorManager manager= (SensorManager) context.getSystemService(Context.SENSOR_SERVICE);//找到传感器,但未定义类型
manager.registerListener(this,manager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD),SensorManager.SENSOR_DELAY_GAME);//创建一个适合游戏的磁场传感器
}
@Override
public void onSensorChanged(SensorEvent event) {//传感器方位改变
if (event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){//现在是方位传感器
float value[]=event.values;//取得所有的偏离数据
allvalue=value;//取得三个轴的值
super.postInvalidate();//主线程的显示需要重绘
}
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();//根据传感器的值来改变球的速度
if (allvalue!=null){//已经取得了数据
float x=allvalue[0];
float y=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);
}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(comp,-comp.getWidth()/2,-comp.getHeight()/2,paint);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
2、布局中插入自定义view
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.fengray.myex032sensor.ArrowlView
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</LinearLayout>
结果:
实现效果,但有闪退