【Based Android】Android Sensor感应器介绍(二)线程中刷新UI 创建一个android测力计

上一篇文章http://www.cnblogs.com/octobershiner/archive/2011/11/06/2237880.html介绍了sensor的基本知识以及一个使用其中加速度感应器获取数据的例子。

  提到过一个问题,就是说感应器刷新频率太快,假如我们要做一个UI中,需要根据方向数据绘制一个一个移动的箭头,那么就要太过频繁的刷新绘制界面,占用很多的资源,体验性也会很差,《android 2高级编程》中一个演示测力器的例子,却无意中给我们提供了一种此情况下刷新UI的解决方案,这下我们就知道了如何防止感应器在界面中过于频繁的刷新。

  下面是自己修改的代码,供大家参考

  1 /* 
2 * @author octobershiner
3 * 2011 07 27
4 * SE.HIT
5 * 这是《Android 2 高级编程》中的一个实例,关于感应器的使用很普通,但是介绍了一种使用感应器的应用如何刷新UI的好办法,值得学习
6 * 我添加了一些注释和onPause方法
7 * 一个演示感应器在线程中刷新UI的例子 测力器的应用
8 * */
9
10 package uni.sensor;
11
12 import java.util.Timer;
13 import java.util.TimerTask;
14
15 import android.app.Activity;
16 import android.content.Context;
17 import android.hardware.Sensor;
18 import android.hardware.SensorEvent;
19 import android.hardware.SensorEventListener;
20 import android.hardware.SensorManager;
21 import android.os.Bundle;
22 import android.widget.TextView;
23
24 public class ForceometerActivity extends Activity{
25
26 SensorManager sensorManager;
27 TextView accelerationTextView;
28 TextView maxAccelerationTextView;
29
30 float currentAcceleration = 0;
31 float maxAcceleration = 0;
32
33 @Override
34 protected void onCreate(Bundle savedInstanceState) {
35 // TODO Auto-generated method stub
36 super.onCreate(savedInstanceState);
37 setContentView(R.layout.main);
38 //获取两个文本显示域
39 accelerationTextView = (TextView)findViewById(R.id.acceleration);
40 maxAccelerationTextView = (TextView)findViewById(R.id.maxAcceleration);
41 //获取sensor服务,选择加速度感应器
42 sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
43 Sensor accelerometer = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
44 //注册事件
45 sensorManager.registerListener(sensorEventListener,
46 accelerometer,
47 SensorManager.SENSOR_DELAY_FASTEST);
48
49 Timer updateTimer = new Timer("gForceUpdate");
50 updateTimer.scheduleAtFixedRate(new TimerTask() {
51 public void run() {
52 updateGUI();
53 }
54 }, 0, 100);
55
56
57 }
58
59 //添加的新方法,退出activity的时候,关闭监听器
60 public void onPause(){
61 sensorManager.unregisterListener(sensorEventListener);
62 super.onPause();
63 }
64
65
66 private final SensorEventListener sensorEventListener = new SensorEventListener() {
67 //系统设置的重力加速度标准值,设备在水平静止的情况下就承受这个压力,所以默认Y轴方向的加速度值为STANDARD_GRAVITY
68 double calibration = SensorManager.STANDARD_GRAVITY;
69
70 public void onAccuracyChanged(Sensor sensor, int accuracy) { }
71
72 public void onSensorChanged(SensorEvent event) {
73 double x = event.values[0];
74 double y = event.values[1];
75 double z = event.values[2];
76
77 //计算三个方向的加速度
78 double a = Math.round(Math.sqrt(Math.pow(x, 2) +
79 Math.pow(y, 2) +
80 Math.pow(z, 2)));
81
82 //消去原有的重力引起的压力
83 currentAcceleration = Math.abs((float)(a-calibration));
84 if (currentAcceleration > maxAcceleration)
85 maxAcceleration = currentAcceleration;
86 }
87 };
88
89 private void updateGUI() {
90 /*
91 * 推荐的一个刷新UI的方法
92 * Activity.runOnUiThread(Runnable)
93 * 在新的线程中更新UI
94 * Runnable是一个接口,需要你实现run方法,上面的TimerTask就是实现了这个接口同样需要实现run方法
95 * */
96 runOnUiThread(new Runnable() {
97 public void run() {
98 String currentG = currentAcceleration/SensorManager.STANDARD_GRAVITY
99 + "Gs";
100 accelerationTextView.setText(currentG);
101 accelerationTextView.invalidate();
102 String maxG = maxAcceleration/SensorManager.STANDARD_GRAVITY + "Gs";
103 maxAccelerationTextView.setText(maxG);
104 maxAccelerationTextView.invalidate();
105 }
106 });
107
108 }
109
110
111 }

线程知识和我一样不足的同学,我们一起再学习线程吧,以后会更新相关的学习体会,与大家分享

  忘了,还有main.xml文件

<?xml version="1.0" encoding="utf-8"?>  
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation
="vertical"
android:layout_width
="fill_parent"
android:layout_height
="fill_parent">
<TextView android:id="@+id/acceleration"
android:gravity
="center"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:textStyle
="bold"
android:textSize
="32sp"
android:text
="CENTER"
android:editable
="false"
android:singleLine
="true"
android:layout_margin
="10px"/>

<TextView android:id="@+id/maxAcceleration"
android:gravity
="center"
android:layout_width
="fill_parent"
android:layout_height
="wrap_content"
android:textStyle
="bold"
android:textSize
="40sp"
android:text
="CENTER"
android:editable
="false"
android:singleLine
="true"
android:layout_margin
="10px"/>

</LinearLayout>





posted @ 2011-11-09 15:57  leeon  阅读(1096)  评论(0编辑  收藏  举报