首页 > 程序开发 > 移动开发 > Android >

【Android笔记 六】Android Sensor感应器介绍(二)线程中刷新

2011-07-28

上一篇中提到过一个问题,就是说感应器刷新频率太快,假如我们要做一个UI中,需要根据方向数据绘制一个一个移动的箭头,那么就要太过频繁的刷新绘制界面,占用很多的资源,体验性也会很差,《android 2高级编...

上一篇中提到过一个问题,就是说感应器刷新频率太快,假如我们要做一个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>

相关文章
最新文章
热点推荐