论坛首页 移动开发技术论坛

基于方向传感器的一个小应用——指北针(高手勿喷)

浏览 10091 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (10) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-08-15  

今日上课,学习了怎么利用传感器做应用···
做了个指北针,觉得有点意思···
就现学现卖一个,与大家分享一下···
高手勿笑···

先看一段代码,这是要在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);
    }
}

 

再看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) {}
}

 

   发表时间:2010-08-15  
第一次发帖···
格式掌握的不好···
请海涵···

这个应用还是挺好玩的···
不过遗憾的是模拟器测试不出效果···

我也是借老师手机测试的···
0 请登录后投票
   发表时间:2010-08-17  
上课?想问几个问题:
1. 老师水平怎么样?
2. 你们的学费多少?
3. 你工作多久了?

谢谢。
1 请登录后投票
   发表时间:2010-08-18  
1,老师是业内,开发水平不错···
2,因为某些原因,学费不贵,原因就不细说了···
3,还没工作,正在学习···
0 请登录后投票
   发表时间:2010-08-30  
国内android有搞头么?
0 请登录后投票
   发表时间:2011-06-01  
还真挺有搞头
0 请登录后投票
论坛首页 移动开发技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics