【Android筆記 六】Android Sensor感應器介紹(二)線程中刷新 – Android移動開發技術文章_手機開發 Android移動開發教學課程

 

  上一篇中提到過一個問題,就是說感應器刷新頻率太快,假如我們要做一個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="https://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>

 

 

 

You May Also Like