魔乐科技安卓开发教程----李兴华----19 传感器

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>

结果:
实现效果,但有闪退

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值