編輯:關於Android編程
本文實例講述了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:text 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:text android:textSize="40sp" android:text="CENTER" android:editable="false" android:singleLine="true" android:layout_margin="10px"/> </LinearLayout>
希望本文所述對大家Android程序設計有所幫助。
這幾天看了《Android開發藝術探索》這本書真的是挺不錯的,學了自定義View之後打算動手實踐一個輪播圖控件,網上有很多實現的方法,我最後實現起來跟他們也基本上都是大同
程序員很多,遍地都是,高手也很多,但是懂設計的程序員並不多,我覺得我們不僅要成為一個coder還要成為一個designer。我是一個比較注重ued的人,如果對一個app來
前言: 關於Android中的動畫吧,從我一開始接觸Android的時候,就陸陸續續的接觸過,不得不說,動畫在Android應用中應用的還是很多的,熟悉掌握了動畫,也可以
發生滑動效果的原因Android坐標系獲取view在屏幕上的坐標(view左上角的坐標) View view = (View) findViewById(R.id.