这两个例子的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) {//关闭线程
}
};
}