本文实例讲述了android使用sensor感应器实现线程中刷新ui创建android测力计的功能。分享给大家供大家参考,具体如下:
前面一篇《android基于sensor感应器获取重力感应加速度的方法》我们介绍了sensor的基本知识以及一个使用其中加速度感应器获取数据的例子。
前面提到过一个问题,就是说感应器刷新频率太快,假如我们要做一个ui中,需要根据方向数据绘制一个一个移动的箭头,那么就要太过频繁的刷新绘制界面,占用很多的资源,体验性也会很差,《android 2高级编程》中一个演示测力器的例子,却无意中给我们提供了一种此情况下刷新ui的解决方案,这下我们就知道了如何防止感应器在界面中过于频繁的刷新。
下面是自己修改的代码,供大家参考
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
/* * @author octobershiner * 2011 07 27 * se.hit * 这是《android 2 高级编程》中的一个实例,关于感应器的使用很普通,但是介绍了一种使用感应器的应用如何刷新ui的好办法,值得学习 * 我添加了一些注释和onpause方法 * 一个演示感应器在线程中刷新ui的例子 测力器的应用 * */ package uni.sensor; import java.util.timer; import java.util.timertask; 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.widget.textview; public class forceometeractivity extends activity{ sensormanager sensormanager; textview accelerationtextview; textview maxaccelerationtextview; float currentacceleration = 0; float maxacceleration = 0; @override protected void oncreate(bundle savedinstancestate) { // todo auto-generated method stub super.oncreate(savedinstancestate); setcontentview(r.layout.main); //获取两个文本显示域 accelerationtextview = (textview)findviewbyid(r.id.acceleration); maxaccelerationtextview = (textview)findviewbyid(r.id.maxacceleration); //获取sensor服务,选择加速度感应器 sensormanager = (sensormanager)getsystemservice(context.sensor_service); sensor accelerometer = sensormanager.getdefaultsensor(sensor.type_accelerometer); //注册事件 sensormanager.registerlistener(sensoreventlistener, accelerometer, sensormanager.sensor_delay_fastest); timer updatetimer = new timer("gforceupdate"); updatetimer.scheduleatfixedrate(new timertask() { public void run() { updategui(); } }, 0, 100); } //添加的新方法,退出activity的时候,关闭监听器 public void onpause(){ sensormanager.unregisterlistener(sensoreventlistener); super.onpause(); } private final sensoreventlistener sensoreventlistener = new sensoreventlistener() { //系统设置的重力加速度标准值,设备在水平静止的情况下就承受这个压力,所以默认y轴方向的加速度值为standard_gravity double calibration = sensormanager.standard_gravity; public void onaccuracychanged(sensor sensor, int accuracy) { } public void onsensorchanged(sensorevent event) { double x = event.values[0]; double y = event.values[1]; double z = event.values[2]; //计算三个方向的加速度 double a = math.round(math.sqrt(math.pow(x, 2) + math.pow(y, 2) + math.pow(z, 2))); //消去原有的重力引起的压力 currentacceleration = math.abs((float)(a-calibration)); if (currentacceleration > maxacceleration) maxacceleration = currentacceleration; } }; private void updategui() { /* * 推荐的一个刷新ui的方法 * activity.runonuithread(runnable) * 在新的线程中更新ui * runnable是一个接口,需要你实现run方法,上面的timertask就是实现了这个接口同样需要实现run方法 * */ runonuithread( new runnable() { public void run() { string currentg = currentacceleration/sensormanager.standard_gravity + "gs" ; accelerationtextview.settext(currentg); accelerationtextview.invalidate(); string maxg = maxacceleration/sensormanager.standard_gravity + "gs" ; maxaccelerationtextview.settext(maxg); maxaccelerationtextview.invalidate(); } }); } } |
线程知识和我一样不足的同学,我们一起再学习线程吧,以后会更新相关的学习体会,与大家分享
忘了,还有main.xml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<?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> |
希望本文所述对大家android程序设计有所帮助。