|
今日上课,学习了怎么利用传感器做应用···
做了个指北针,觉得有点意思···
就现学现卖一个,与大家分享一下···
高手勿笑···
先看一段代码,这是要在activity里做的···
Activity代码
package com.ashtray;
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.util.Log;
public class main extends Activity {
//传感器管理对象
SensorManager manager;
//传感器对象
Sensor sensor;
//界面
OrenView view;
//新建一个传感器事件监听器,重写其方法,主要是重写 onSensorChanged
SensorEventListener listener = new SensorEventListener(){
public void onSensorChanged(SensorEvent event) {
//这个浮点数详细说明一下,是一个长度为三的浮点型数组,每一个元素在不同的传感器都有不同的含义。此处因为使用的是方向传感器,所以只关注第一个浮点数,即角度。而且这个角度是以相对于北方度数的一个角度(北方为0,顺时针转动,东方为90,南方为180,西方为270)
float orentation = event.values[0];
Log.i("####",""+orentation);
//将这个值传向页面
view.setDegree(orentation);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//产生页面对象
view = new OrenView(this);
setContentView(view);
//得到传感器管理对象
manager = (SensorManager)this.getSystemService(Context.SENSOR_SERVICE);
//得到传感器对象,Sensor.TYPE_ORIENTATION是个静态int常量,表示不同的传感器
sensor = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
//注册传感器,返回一个布尔值,用来判断是否注册成功,确定下一步操作
//第三个参数表示传感器的灵敏度或者说刷新率
//boolean reg =
manager.registerListener(listener, sensor,SensorManager.SENSOR_DELAY_NORMAL);
}
//注意重写这个方法,在这个方法中要执行传感器的注销
//否则当退出应用时传感器已然运作
public void onStop(){
super.onStop();
manager.unregisterListener(listener, sensor);
}
}
package com.ashtray;
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.util.Log;
public class main extends Activity {
//传感器管理对象
SensorManager manager;
//传感器对象
Sensor sensor;
//界面
OrenView view;
//新建一个传感器事件监听器,重写其方法,主要是重写 onSensorChanged
SensorEventListener listener = new SensorEventListener(){
public void onSensorChanged(SensorEvent event) {
//这个浮点数详细说明一下,是一个长度为三的浮点型数组,每一个元素在不同的传感器都有不同的含义。此处因为使用的是方向传感器,所以只关注第一个浮点数,即角度。而且这个角度是以相对于北方度数的一个角度(北方为0,顺时针转动,东方为90,南方为180,西方为270)
float orentation = event.values[0];
Log.i("####",""+orentation);
//将这个值传向页面
view.setDegree(orentation);
}
public void onAccuracyChanged(Sensor sensor, int accuracy) {}
};
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//产生页面对象
view = new OrenView(this);
setContentView(view);
//得到传感器管理对象
manager = (SensorManager)this.getSystemService(Context.SENSOR_SERVICE);
//得到传感器对象,Sensor.TYPE_ORIENTATION是个静态int常量,表示不同的传感器
sensor = manager.getDefaultSensor(Sensor.TYPE_ORIENTATION);
//注册传感器,返回一个布尔值,用来判断是否注册成功,确定下一步操作
//第三个参数表示传感器的灵敏度或者说刷新率
//boolean reg =
manager.registerListener(listener, sensor,SensorManager.SENSOR_DELAY_NORMAL);
}
//注意重写这个方法,在这个方法中要执行传感器的注销
//否则当退出应用时传感器已然运作
public void onStop(){
super.onStop();
manager.unregisterListener(listener, sensor);
}
}
再看View界面中的代码···
我用的是SurfaceView,绘制的细节我就不赘述了···
不清楚的朋友我们再探讨···
界面代码
package com.ashtray;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class OrenView extends SurfaceView implements SurfaceHolder.Callback{
SurfaceHolder holder;
Paint paint;
Bitmap bit;
Bitmap background;
//本类的一个属性,角度,接收自传感器
public float degree;
public OrenView(Context context) {
super(context);
this.setKeepScreenOn(true);
paint = new Paint();
bit = BitmapFactory.decodeResource(context.getResources(),R.drawable.pin);
background = BitmapFactory.decodeResource(context.getResources(),R.drawable.news);
background = Bitmap.createScaledBitmap(background, 320, 450,false);
holder = this.getHolder();
holder.addCallback(this);
}
public float getDegree() {
return degree;
}
public void setDegree(float degree) {
this.degree = degree;
}
//启动一个自定义的线程
public void surfaceCreated(SurfaceHolder holder) {
Thread t = new MyThread();
t.start();
}
class MyThread extends Thread{
public void run() {
while(true){
Canvas c = holder.lockCanvas();
if(c != null){
c.save();
c.drawBitmap(background, 0, 0, paint);
// try {
// sleep(500);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
//手机转动多少度,就绘制负的多少度,保持绘制的指针指向0度,即指向北方
c.rotate(-1*degree,148,216);
c.drawBitmap(bit, 148, 40, paint);
c.restore();
holder.unlockCanvasAndPost(c);
}
}
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}
public void surfaceDestroyed(SurfaceHolder holder) {}
}
package com.ashtray;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class OrenView extends SurfaceView implements SurfaceHolder.Callback{
SurfaceHolder holder;
Paint paint;
Bitmap bit;
Bitmap background;
//本类的一个属性,角度,接收自传感器
public float degree;
public OrenView(Context context) {
super(context);
this.setKeepScreenOn(true);
paint = new Paint();
bit = BitmapFactory.decodeResource(context.getResources(),R.drawable.pin);
background = BitmapFactory.decodeResource(context.getResources(),R.drawable.news);
background = Bitmap.createScaledBitmap(background, 320, 450,false);
holder = this.getHolder();
holder.addCallback(this);
}
public float getDegree() {
return degree;
}
public void setDegree(float degree) {
this.degree = degree;
}
//启动一个自定义的线程
public void surfaceCreated(SurfaceHolder holder) {
Thread t = new MyThread();
t.start();
}
class MyThread extends Thread{
public void run() {
while(true){
Canvas c = holder.lockCanvas();
if(c != null){
c.save();
c.drawBitmap(background, 0, 0, paint);
// try {
// sleep(500);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
//手机转动多少度,就绘制负的多少度,保持绘制的指针指向0度,即指向北方
c.rotate(-1*degree,148,216);
c.drawBitmap(bit, 148, 40, paint);
c.restore();
holder.unlockCanvasAndPost(c);
}
}
}
}
public void surfaceChanged(SurfaceHolder holder, int format, int width,int height) {}
public void surfaceDestroyed(SurfaceHolder holder) {}
}
|
|