软件编程
位置:首页>> 软件编程>> Android编程>> Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能

Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能

作者:octobershiner  发布时间:2023-03-05 07:51:48 

标签:Android,Sensor

本文实例讲述了Android使用Sensor感应器实现线程中刷新UI创建android测力计的功能。分享给大家供大家参考,具体如下:

前面一篇《Android基于Sensor感应器获取重力感应加速度的方法》我们介绍了sensor的基本知识以及一个使用其中加速度感应器获取数据的例子。

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

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


/*
* @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文件


<?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程序设计有所帮助。

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com