传感器(例子:指南针)

这两个例子的layout我就不写了,注意view名称要写全包名+view名

继承view

OneActivity

package com.example.administrator.map.MyOne;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;

import com.example.administrator.map.R;

/**
 * Created by Administrator on 2015/9/21.
 */
public class OneActivity extends Activity {
    private MyOneView compassView;
    private SensorManager sensorManager;
    private float[] values = new float[3];
    private final int SEND_DEGREE = 0x23;
    public Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            switch (msg.what) {
                case SEND_DEGREE:
                    compassView.invalidate();
                    compassView.setDegrees(Math.toDegrees(values[0]));
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_one_view);
        compassView = (MyOneView) findViewById(R.id.myoneview);
        sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        Sensor magneticSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        Sensor accelerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(listener, magneticSensor, SensorManager.SENSOR_DELAY_GAME);
        sensorManager.registerListener(listener, accelerSensor, SensorManager.SENSOR_DELAY_GAME);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (sensorManager != null) {
            sensorManager.unregisterListener(listener);
        }
    }

    private SensorEventListener listener = new SensorEventListener() {
        float[] accelerValues = new float[3];
        float[] magneticValues = new float[3];

        @Override
        public void onSensorChanged(SensorEvent event) {
            if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                accelerValues = event.values.clone();
            } else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
                magneticValues = event.values.clone();
            }
            float[] R = new float[9];

            SensorManager.getRotationMatrix(R, null, accelerValues, magneticValues);
            SensorManager.getOrientation(R, values);
            handler.sendEmptyMessage(SEND_DEGREE);
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };
}

MyOneView

package com.example.administrator.map.MyOne;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Path;
import android.util.AttributeSet;
import android.view.View;

/**
 * Created by Administrator on 2015/9/21.
 */
public class MyOneView extends View {
    private Paint mCenterCircle;
    private Paint mArrow;
    private Paint mBigCircle;
    private Paint mText;
    private int width;
    private int height;
    private double degrees;
    private Path mPath;
    private Bitmap mBitmap;
    private Canvas mCanvasBit;

    public void setDegrees(double degrees) {
        this.degrees = degrees;
    }

    public MyOneView(Context context) {
        super(context);
    }

    public MyOneView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mCenterCircle = new Paint();
        mCenterCircle.setColor(Color.GRAY);
        mCenterCircle.setStyle(Paint.Style.FILL);

        mArrow = new Paint();
        mArrow.setColor(Color.BLACK);
        mArrow.setStyle(Paint.Style.FILL);

        mPath = new Path();

        mBigCircle = new Paint();
        mBigCircle.setStrokeWidth(10);
        mBigCircle.setColor(Color.BLACK);
        mBigCircle.setStyle(Paint.Style.STROKE);

        mText = new Paint();
        mText.setColor(Color.BLUE);
        mText.setTextAlign(Paint.Align.CENTER);
        mText.setTextSize(70);
        mText.setStrokeWidth(10);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width = getDefaultSize(getSuggestedMinimumWidth(),widthMeasureSpec);
        height = getDefaultSize(getSuggestedMinimumHeight(),heightMeasureSpec);
        setMeasuredDimension(width,height);
        mBitmap = Bitmap.createBitmap(width,height, Bitmap.Config.ARGB_8888);
        mCanvasBit = new Canvas(mBitmap);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        mPath.reset();
        mPath.moveTo(width/2,height/2-160);
        mPath.lineTo(width/2-50,height/2);
        mPath.lineTo(width/2+50,height/2);
        mPath.close();
        mCanvasBit.drawCircle(width / 2, height / 2, 400, mBigCircle);
        mCanvasBit.drawText("N", width / 2, height / 2 - 300, mText);
        mCanvasBit.rotate(90, width / 2, height / 2);
        mCanvasBit.drawText("E", width / 2, height / 2 - 300, mText);
        mCanvasBit.rotate(90, width / 2, height / 2);
        mCanvasBit.drawText("S", width / 2, height / 2 - 300, mText);
        mCanvasBit.rotate(90, width / 2, height / 2);
        mCanvasBit.drawText("W", width / 2, height / 2 - 300, mText);
        mCanvasBit.rotate(90, width / 2, height / 2);
        for (int i = 1;i<=24;i++){
            mCanvasBit.rotate(360/24, width / 2, height / 2);
            mCanvasBit.drawLine(width/2,height/2-400,width/2,height/2-360,mText);
        }
        canvas.drawPath(mPath, mArrow);
        canvas.drawCircle(width / 2, height / 2, 80, mCenterCircle);
        canvas.rotate((float) -degrees, width / 2, height / 2);
        canvas.drawBitmap(mBitmap, 0, 0, null);
    }
}

继承SurfaceView

TwoActivity

package com.example.administrator.map.MyTwo;

import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;

import com.example.administrator.map.R;
import com.example.administrator.map.MyTwo.MyTwoView;

/**
 * Created by Administrator on 2015/9/21.
 */
public class TwoActivity extends Activity {
    private SensorManager sensorManager;
    private MyTwoView myCompassView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_two_view);
        myCompassView= (MyTwoView) findViewById(R.id.mytwoview);
        sensorManager= (SensorManager) getSystemService(Context.SENSOR_SERVICE);
        Sensor magneticSensor=sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);
        Sensor accelerometerSensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        sensorManager.registerListener(listener,magneticSensor,SensorManager.SENSOR_DELAY_GAME);
        sensorManager.registerListener(listener,accelerometerSensor,SensorManager.SENSOR_DELAY_GAME);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (sensorManager!=null){
            sensorManager.unregisterListener(listener);
        }
    }

    private SensorEventListener listener=new SensorEventListener() {
        float[] accelerometerValues=new float[3];
        float[] magneticValues=new float[3];

        @Override
        public void onSensorChanged(SensorEvent event) {
            if (event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){
                accelerometerValues=event.values.clone();
            }else if (event.sensor.getType()==Sensor.TYPE_MAGNETIC_FIELD){
                magneticValues=event.values.clone();
            }
            float[] R=new float[9];
            float[] values=new float[3];
            SensorManager.getRotationMatrix(R,null,accelerometerValues,magneticValues);
            SensorManager.getOrientation(R,values);
            float degree= -(float) Math.toDegrees(values[0]);//旋转角度,因为canvas画图从90度开始,所有要减去90
            myCompassView.setDegree(degree);
        }

        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };
}

MyTwoView

package com.example.administrator.map.MyTwo;

import android.view.SurfaceView;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
/**
 * Created by Administrator on 2015/9/21.
 */
public class MyTwoView extends SurfaceView{
    private int width;
    private int height;
    private Paint paint_circle;
    private Paint paint_line;
    private Paint paint_text;
    private String[] direction = {"E","S", "W","N"};
    private float degree;

    public void setDegree(float degree) {
        this.degree = degree;
    }

    public MyTwoView(Context context) {
        super(context);
    }

    public MyTwoView(Context context, AttributeSet attrs) {
        super(context, attrs);
        SurfaceHolder holder = getHolder();
        holder.addCallback(callback);
        paint_circle = new Paint();
        paint_circle.setColor(Color.GREEN);//画笔颜色
        paint_circle.setStrokeWidth(10);//画笔粗细
        paint_circle.setStyle(Paint.Style.STROKE);//空心
        paint_circle.setAntiAlias(true);//设置抗锯齿

        paint_line = new Paint();
        paint_line.setColor(Color.RED);
        paint_line.setStrokeWidth(15);
        paint_line.setAntiAlias(true);

        paint_text = new Paint();
        paint_text.setColor(Color.YELLOW);
        paint_text.setTextSize(30);
        paint_text.setAntiAlias(true);
        paint_text.setTextAlign(Paint.Align.CENTER);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        width = getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);
        height = getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);
        setMeasuredDimension(width, height);
    }

    SurfaceHolder.Callback callback = new SurfaceHolder.Callback() {
        @Override
        public void surfaceCreated(final SurfaceHolder holder) {//此处开启线程
            new Thread(new Runnable() {
                @Override
                public void run() {
                    while (true) {
                        Canvas canvas = holder.lockCanvas();
                        canvas.drawColor(Color.BLACK);
                        canvas.drawCircle(width / 2, height / 2, 300, paint_circle);
                        canvas.drawCircle(width / 2, height / 2, 10, paint_circle);
                        canvas.save();
                        canvas.rotate(degree, width / 2, height / 2);
                        for (int i = 1; i <= 4; i++) {
                            canvas.save();
                            canvas.rotate(360 / 4 * i, width / 2, height / 2);
                            canvas.drawText(direction[i - 1], width / 2, height / 2 - 250, paint_text);
                            canvas.restore();
                        }
                        canvas.drawLine(width / 2 , height / 2-10, width / 2 , height / 2- 200, paint_line);
                        canvas.restore();
                        Log.d("aa","度数:"+degree);
                        holder.unlockCanvasAndPost(canvas);
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }).start();
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {

        }

        @Override
        public void surfaceDestroyed(SurfaceHolder holder) {//关闭线程

        }
    };
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值