职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 479|回复: 5

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

[复制链接]
已经来了吗 发表于 2011-8-1 10:00 | 显示全部楼层 |阅读模式
今日上课,学习了怎么利用传感器做应用···
做了个指北针,觉得有点意思···
就现学现卖一个,与大家分享一下···
高手勿笑···

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


江南枫 发表于 2011-8-1 10:01 | 显示全部楼层
第一次发帖···
格式掌握的不好···
请海涵···

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

我也是借老师手机测试的···

醉倚西风 发表于 2011-8-1 10:01 | 显示全部楼层
上课?想问几个问题:
1. 老师水平怎么样?
2. 你们的学费多少?
3. 你工作多久了?

谢谢。

走失的猫咪 发表于 2011-8-1 10:01 | 显示全部楼层
1,老师是业内,开发水平不错···
2,因为某些原因,学费不贵,原因就不细说了···
3,还没工作,正在学习···

月上萧萧 发表于 2011-8-1 10:01 | 显示全部楼层
国内android有搞头么?

北大青鸟 发表于 2011-8-1 10:01 | 显示全部楼层
还真挺有搞头


您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-2 08:43 , Processed in 0.148212 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表