Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能
本文实例讲述了Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能。分享给大家供大家参考,具体如下:
前面一篇《Android基于Sensor感应器获取重力感应加速度的方法》我们介绍了sensor的基本知识以及一个使用其中加速度感应器获取数据的例子。
前面提到过一个问题,就是说感应器刷新频率太快,假如我们要做一个UI中,需要根据方向数据绘制一个一个移动的箭头,那么就要太过频繁的刷新绘制界面,占用很多的资源,体验性也会很差,《android2高级编程》中一个演示测力器的例子,却无意中给我们提供了一种此情况下刷新UI的解决方案,这下我们就知道了如何防止感应器在界面中过于频繁的刷新。
下面是自己修改的代码,供大家参考
/*
*@authoroctobershiner
*20110727
*SE.HIT
*这是《Android2高级编程》中的一个实例,关于感应器的使用很普通,但是介绍了一种使用感应器的应用如何刷新UI的好办法,值得学习
*我添加了一些注释和onPause方法
*一个演示感应器在线程中刷新UI的例子测力器的应用
**/
packageuni.sensor;
importjava.util.Timer;
importjava.util.TimerTask;
importandroid.app.Activity;
importandroid.content.Context;
importandroid.hardware.Sensor;
importandroid.hardware.SensorEvent;
importandroid.hardware.SensorEventListener;
importandroid.hardware.SensorManager;
importandroid.os.Bundle;
importandroid.widget.TextView;
publicclassForceometerActivityextendsActivity{
SensorManagersensorManager;
TextViewaccelerationTextView;
TextViewmaxAccelerationTextView;
floatcurrentAcceleration=0;
floatmaxAcceleration=0;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
//TODOAuto-generatedmethodstub
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);
Sensoraccelerometer=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//注册事件
sensorManager.registerListener(sensorEventListener,
accelerometer,
SensorManager.SENSOR_DELAY_FASTEST);
TimerupdateTimer=newTimer("gForceUpdate");
updateTimer.scheduleAtFixedRate(newTimerTask(){
publicvoidrun(){
updateGUI();
}
},0,100);
}
//添加的新方法,退出activity的时候,关闭监听器
publicvoidonPause(){
sensorManager.unregisterListener(sensorEventListener);
super.onPause();
}
privatefinalSensorEventListenersensorEventListener=newSensorEventListener(){
//系统设置的重力加速度标准值,设备在水平静止的情况下就承受这个压力,所以默认Y轴方向的加速度值为STANDARD_GRAVITY
doublecalibration=SensorManager.STANDARD_GRAVITY;
publicvoidonAccuracyChanged(Sensorsensor,intaccuracy){}
publicvoidonSensorChanged(SensorEventevent){
doublex=event.values[0];
doubley=event.values[1];
doublez=event.values[2];
//计算三个方向的加速度
doublea=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;
}
};
privatevoidupdateGUI(){
/*
*推荐的一个刷新UI的方法
*Activity.runOnUiThread(Runnable)
*在新的线程中更新UI
*Runnable是一个接口,需要你实现run方法,上面的TimerTask就是实现了这个接口同样需要实现run方法
**/
runOnUiThread(newRunnable(){
publicvoidrun(){
StringcurrentG=currentAcceleration/SensorManager.STANDARD_GRAVITY
+"Gs";
accelerationTextView.setText(currentG);
accelerationTextView.invalidate();
StringmaxG=maxAcceleration/SensorManager.STANDARD_GRAVITY+"Gs";
maxAccelerationTextView.setText(maxG);
maxAccelerationTextView.invalidate();
}
});
}
}
线程知识和我一样不足的同学,我们一起再学习线程吧,以后会更新相关的学习体会,与大家分享
忘了,还有main.xml文件
<?xmlversion="1.0"encoding="utf-8"?> <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextViewandroid: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"/> <TextViewandroid: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程序设计有所帮助。