android 指南针
来源:互联网 发布:react native案例源码 编辑:程序博客网 时间:2024/04/28 14:47
@SuppressWarnings("deprecation")
public class CompassActivity extends Activity implements SensorListener {
CompassView view;
GLSurfaceView mSurfaceView;
public int mWidth;
public int mHeight;
public String ViewO, ViewA, xViewO, yViewO, zViewO, xViewA, yViewA, zViewA,
xD, yD, zD;
SensorManager sm;
public double jiao;
public int jiaodu;
String nan, dong;
int bei;
public String tmp;
Bitmap background1, background2;
int screenWidth = 0;
int screenHeight = 0;
private int x, y, z;
Sensor sensor;
SensorEventListener lsn;
public boolean runTo;
/** 感应器 */
static float degree0 = 0;
float degree1 = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sm = (SensorManager) getSystemService(SENSOR_SERVICE);
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
int screenWidth = display.getWidth();
int screenHeight = display.getHeight();
view = new CompassView(this, screenWidth, screenHeight);
setContentView(view);
if (sm != null) {
sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
// 注册listener,第三个参数是检测的精确度
lsn = new SensorEventListener() {
public void onSensorChanged(SensorEvent e) {
synchronized (this) {
x = (int) e.values[SensorManager.DATA_X];
y = (int) e.values[SensorManager.DATA_Y];
z = (int) e.values[SensorManager.DATA_Z];
onStarts();
}
}
public void onAccuracyChanged(Sensor s, int accuracy) {
}
};
sm.registerListener(lsn, sensor, SensorManager.SENSOR_DELAY_GAME);
}
/** 重力感应 */
private boolean getGrivity() {
if (x >= y && y >= 0) {
return true;
} else {
return false;
}
}
protected void onDestroy() {
super.onDestroy();
// 关闭感应器
view.removeSensorListener();
}
public void onSensorChanged(int sensor, float[] values) {
if (Math.abs(values[0] - degree0) > 16
|| Math.abs(values[0] - degree1) > 10) {// 1)感应器的改变, 灵敏度,视野范围
synchronized (this) {
if (sensor == SensorManager.SENSOR_ORIENTATION) {
xViewO = " X:" + (int) values[0];
yViewO = " Y: " + (int) values[1];
zViewO = " Z: " + (int) values[2];
degree0 = (int) values[0];
degree1 = (int) values[1];
ViewO = xViewO + yViewO + zViewO;
}
}
}
}
public void onAccuracyChanged(int sensor, int accuracy) {
}
@Override
protected void onResume() {
super.onResume();
sm.registerListener(this, SensorManager.SENSOR_ORIENTATION
| Sensor.TYPE_ACCELEROMETER, SensorManager.SENSOR_DELAY_GAME);
}
private Handler checkHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
runTo = true;
break;
case 1:
runTo = false;
break;
}
}
};
@Override
protected void onStop() {
sm.unregisterListener(this);
super.onStop();
}
/** 指南针绘图类 */
class CompassView extends SurfaceView implements SurfaceHolder.Callback,
SensorEventListener {
SurfaceHolder mholder;
Bitmap background1;
SensorManager sensorManager;
Sensor orieSensor;
int screenWidth = 0;
int screenHeight = 0;
float degree = 0;
private final Object LOCK = new Object();
Sensor sensor;
public CompassView(Context context, int screenWidth, int screenHeight) {
super(context);
background1 = BitmapFactory.decodeResource(this.getResources(),
R.drawable.needle);
getHolder().addCallback(this);
this.screenWidth = screenWidth; // this.getWidth();
this.screenHeight = screenHeight; // this.getHeight();
sensorManager = (SensorManager) context
.getSystemService(Context.SENSOR_SERVICE);
orieSensor = sensorManager
.getDefaultSensor(Sensor.TYPE_ORIENTATION);
if (orieSensor != null) {
sensorManager.registerListener(this, orieSensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
synchronized (LOCK) {
mholder = holder;
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
synchronized (LOCK) {
mholder = null;
}
}
public void removeSensorListener() {
sensorManager.unregisterListener(this);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
// 画指针
@Override
public void onSensorChanged(SensorEvent event) {
Log.i("wop", "" + runTo);
if (!runTo) {
return;
}
if (Math.abs(event.values[1]) > 32 || // 围绕x轴的偏转(-180 to 180)
Math.abs(event.values[2]) > 20) { // 围绕y轴的偏转 (-90 to
// 90),
synchronized (LOCK) {
if (mholder != null) {
Canvas can = mholder.lockCanvas();
if (can == null)
return;
can.drawRGB(0, 0, 0);
Paint paint = new Paint();
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.GREEN);
can.drawText("指南针(立体)", 470, 30, paint);
can.drawText("东", 370, 162, paint);
can.drawText("西", 186, 162, paint);
can.drawText("北", 280, 74, paint);
can.drawText("南", 280, 254, paint);
can.drawText("(" + "角度:" + getJiaodu() + ")", 30, 30,
paint);
can.save();
can.rotate(event.values[0] + 90, screenWidth / 2,
screenHeight / 2);
can.drawBitmap(background1, screenWidth / 2
- background1.getWidth() / 2, screenHeight / 2
- background1.getHeight() / 2, null);
can.restore();
mholder.unlockCanvasAndPost(can);
}
}
} else {
synchronized (LOCK) {
if (mholder != null
&& (Math.abs(event.values[0] - degree) > 0.4)) { // 避免屏幕不动时重复绘制
degree = event.values[0];
Canvas can = mholder.lockCanvas();
if (can == null)
return;
can.drawRGB(0, 0, 0);
Paint paint = new Paint();
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.GREEN);
can.drawText("指南针(平面)", 470, 30, paint);
can.drawText("东", 370, 162, paint);
can.drawText("西", 186, 162, paint);
can.drawText("北", 280, 74, paint);
can.drawText("南", 280, 254, paint);
can.drawText("(" + "角度:" + getJiaodu() + ")", 30, 30,
paint);
can.save();
can.rotate(event.values[0] + 90, screenWidth / 2,
screenHeight / 2);
can.drawBitmap(background1, screenWidth / 2
- background1.getWidth() / 2, screenHeight / 2
- background1.getHeight() / 2, null);
can.restore();
mholder.unlockCanvasAndPost(can);
}
}
}
}
}
// 得到方向角
private String getJiaodu() {
// TODO
jiaodu = (int) CompassActivity.degree0;
if (jiaodu < 0) {
return "";
}
if (jiaodu == 0 || jiaodu == 360) {
dong = "正北";
}
if (jiaodu > 0 && jiaodu < 90) {
dong = "东北";
}
if (jiaodu == 90) {
dong = "正东";
}
if (jiaodu > 90 && jiaodu < 180) {
dong = "东南";
}
if (jiaodu == 180) {
dong = "正南";
}
if (jiaodu > 180 && jiaodu < 270) {
dong = "西南";
}
if (jiaodu == 270) {
dong = "正西";
}
if (jiaodu > 270 && jiaodu < 359) {
dong = "西北";
}
tmp = dong + jiaodu;
return tmp;
}
protected void onStarts() {
// TODO
if (getGrivity()) {
checkHandler.sendEmptyMessage(0);
} else {
checkHandler.sendEmptyMessage(1);
}
}
public class CompassActivity extends Activity implements SensorListener {
CompassView view;
GLSurfaceView mSurfaceView;
public int mWidth;
public int mHeight;
public String ViewO, ViewA, xViewO, yViewO, zViewO, xViewA, yViewA, zViewA,
xD, yD, zD;
SensorManager sm;
public double jiao;
public int jiaodu;
String nan, dong;
int bei;
public String tmp;
Bitmap background1, background2;
int screenWidth = 0;
int screenHeight = 0;
private int x, y, z;
Sensor sensor;
SensorEventListener lsn;
public boolean runTo;
/** 感应器 */
static float degree0 = 0;
float degree1 = 0;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
sm = (SensorManager) getSystemService(SENSOR_SERVICE);
WindowManager windowManager = getWindowManager();
Display display = windowManager.getDefaultDisplay();
int screenWidth = display.getWidth();
int screenHeight = display.getHeight();
view = new CompassView(this, screenWidth, screenHeight);
setContentView(view);
if (sm != null) {
sensor = sm.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
// 注册listener,第三个参数是检测的精确度
lsn = new SensorEventListener() {
public void onSensorChanged(SensorEvent e) {
synchronized (this) {
x = (int) e.values[SensorManager.DATA_X];
y = (int) e.values[SensorManager.DATA_Y];
z = (int) e.values[SensorManager.DATA_Z];
onStarts();
}
}
public void onAccuracyChanged(Sensor s, int accuracy) {
}
};
sm.registerListener(lsn, sensor, SensorManager.SENSOR_DELAY_GAME);
}
/** 重力感应 */
private boolean getGrivity() {
if (x >= y && y >= 0) {
return true;
} else {
return false;
}
}
protected void onDestroy() {
super.onDestroy();
// 关闭感应器
view.removeSensorListener();
}
public void onSensorChanged(int sensor, float[] values) {
if (Math.abs(values[0] - degree0) > 16
|| Math.abs(values[0] - degree1) > 10) {// 1)感应器的改变, 灵敏度,视野范围
synchronized (this) {
if (sensor == SensorManager.SENSOR_ORIENTATION) {
xViewO = " X:" + (int) values[0];
yViewO = " Y: " + (int) values[1];
zViewO = " Z: " + (int) values[2];
degree0 = (int) values[0];
degree1 = (int) values[1];
ViewO = xViewO + yViewO + zViewO;
}
}
}
}
public void onAccuracyChanged(int sensor, int accuracy) {
}
@Override
protected void onResume() {
super.onResume();
sm.registerListener(this, SensorManager.SENSOR_ORIENTATION
| Sensor.TYPE_ACCELEROMETER, SensorManager.SENSOR_DELAY_GAME);
}
private Handler checkHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 0:
runTo = true;
break;
case 1:
runTo = false;
break;
}
}
};
@Override
protected void onStop() {
sm.unregisterListener(this);
super.onStop();
}
/** 指南针绘图类 */
class CompassView extends SurfaceView implements SurfaceHolder.Callback,
SensorEventListener {
SurfaceHolder mholder;
Bitmap background1;
SensorManager sensorManager;
Sensor orieSensor;
int screenWidth = 0;
int screenHeight = 0;
float degree = 0;
private final Object LOCK = new Object();
Sensor sensor;
public CompassView(Context context, int screenWidth, int screenHeight) {
super(context);
background1 = BitmapFactory.decodeResource(this.getResources(),
R.drawable.needle);
getHolder().addCallback(this);
this.screenWidth = screenWidth; // this.getWidth();
this.screenHeight = screenHeight; // this.getHeight();
sensorManager = (SensorManager) context
.getSystemService(Context.SENSOR_SERVICE);
orieSensor = sensorManager
.getDefaultSensor(Sensor.TYPE_ORIENTATION);
if (orieSensor != null) {
sensorManager.registerListener(this, orieSensor,
SensorManager.SENSOR_DELAY_NORMAL);
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceCreated(SurfaceHolder holder) {
synchronized (LOCK) {
mholder = holder;
}
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
synchronized (LOCK) {
mholder = null;
}
}
public void removeSensorListener() {
sensorManager.unregisterListener(this);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
// 画指针
@Override
public void onSensorChanged(SensorEvent event) {
Log.i("wop", "" + runTo);
if (!runTo) {
return;
}
if (Math.abs(event.values[1]) > 32 || // 围绕x轴的偏转(-180 to 180)
Math.abs(event.values[2]) > 20) { // 围绕y轴的偏转 (-90 to
// 90),
synchronized (LOCK) {
if (mholder != null) {
Canvas can = mholder.lockCanvas();
if (can == null)
return;
can.drawRGB(0, 0, 0);
Paint paint = new Paint();
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.GREEN);
can.drawText("指南针(立体)", 470, 30, paint);
can.drawText("东", 370, 162, paint);
can.drawText("西", 186, 162, paint);
can.drawText("北", 280, 74, paint);
can.drawText("南", 280, 254, paint);
can.drawText("(" + "角度:" + getJiaodu() + ")", 30, 30,
paint);
can.save();
can.rotate(event.values[0] + 90, screenWidth / 2,
screenHeight / 2);
can.drawBitmap(background1, screenWidth / 2
- background1.getWidth() / 2, screenHeight / 2
- background1.getHeight() / 2, null);
can.restore();
mholder.unlockCanvasAndPost(can);
}
}
} else {
synchronized (LOCK) {
if (mholder != null
&& (Math.abs(event.values[0] - degree) > 0.4)) { // 避免屏幕不动时重复绘制
degree = event.values[0];
Canvas can = mholder.lockCanvas();
if (can == null)
return;
can.drawRGB(0, 0, 0);
Paint paint = new Paint();
paint.setFlags(Paint.ANTI_ALIAS_FLAG);
paint.setColor(Color.GREEN);
can.drawText("指南针(平面)", 470, 30, paint);
can.drawText("东", 370, 162, paint);
can.drawText("西", 186, 162, paint);
can.drawText("北", 280, 74, paint);
can.drawText("南", 280, 254, paint);
can.drawText("(" + "角度:" + getJiaodu() + ")", 30, 30,
paint);
can.save();
can.rotate(event.values[0] + 90, screenWidth / 2,
screenHeight / 2);
can.drawBitmap(background1, screenWidth / 2
- background1.getWidth() / 2, screenHeight / 2
- background1.getHeight() / 2, null);
can.restore();
mholder.unlockCanvasAndPost(can);
}
}
}
}
}
// 得到方向角
private String getJiaodu() {
// TODO
jiaodu = (int) CompassActivity.degree0;
if (jiaodu < 0) {
return "";
}
if (jiaodu == 0 || jiaodu == 360) {
dong = "正北";
}
if (jiaodu > 0 && jiaodu < 90) {
dong = "东北";
}
if (jiaodu == 90) {
dong = "正东";
}
if (jiaodu > 90 && jiaodu < 180) {
dong = "东南";
}
if (jiaodu == 180) {
dong = "正南";
}
if (jiaodu > 180 && jiaodu < 270) {
dong = "西南";
}
if (jiaodu == 270) {
dong = "正西";
}
if (jiaodu > 270 && jiaodu < 359) {
dong = "西北";
}
tmp = dong + jiaodu;
return tmp;
}
protected void onStarts() {
// TODO
if (getGrivity()) {
checkHandler.sendEmptyMessage(0);
} else {
checkHandler.sendEmptyMessage(1);
}
}
}
权限:<uses-permission android:name="android.permission.ACCESS_LOCATION" />
- android 指南针
- android指南针
- android指南针
- Android 指南针
- Android之指南针学习
- Android之指南针
- Android之指南针学习
- Android 自定义UI--指南针
- Android之指南针学习
- android 自定义指南针view
- Android之指南针学习
- Android自定义View------指南针
- android 指南针实例
- Android之指南针学习
- Android实现指南针功能
- Android之指南针学习
- Android开发之指南针
- Android之指南针学习
- 关于封装的想法
- 【2012校园招聘】天津天地伟业
- Html:表格
- 动态生成列
- 送给入门初学者的6条建议
- android 指南针
- 将阿拉伯数字(1234)钱化为中国数字钱(壹贰叁肆)
- 二叉树系列(1)已知二叉树的中序遍历和前序遍历,如何求后序遍历
- 按秒生成随机时间
- 秋思
- c3p0的用法
- hdu 1864 动态规划 01背包
- C#仿QQ皮肤_写作说明
- 得到SDcard大小