Android使用Sensor感應(yīng)器實現(xiàn)線程中刷新UI創(chuàng)建android測力計的功能
本文實例講述了Android使用Sensor感應(yīng)器實現(xiàn)線程中刷新UI創(chuàng)建android測力計的功能。分享給大家供大家參考,具體如下:
前面一篇《Android基于Sensor感應(yīng)器獲取重力感應(yīng)加速度的方法》我們介紹了sensor的基本知識以及一個使用其中加速度感應(yīng)器獲取數(shù)據(jù)的例子。
前面提到過一個問題,就是說感應(yīng)器刷新頻率太快,假如我們要做一個UI中,需要根據(jù)方向數(shù)據(jù)繪制一個一個移動的箭頭,那么就要太過頻繁的刷新繪制界面,占用很多的資源,體驗性也會很差,《android 2高級編程》中一個演示測力器的例子,卻無意中給我們提供了一種此情況下刷新UI的解決方案,這下我們就知道了如何防止感應(yīng)器在界面中過于頻繁的刷新。
下面是自己修改的代碼,供大家參考
/*
* @author octobershiner
* 2011 07 27
* SE.HIT
* 這是《Android 2 高級編程》中的一個實例,關(guān)于感應(yīng)器的使用很普通,但是介紹了一種使用感應(yīng)器的應(yīng)用如何刷新UI的好辦法,值得學(xué)習(xí)
* 我添加了一些注釋和onPause方法
* 一個演示感應(yīng)器在線程中刷新UI的例子 測力器的應(yīng)用
* */
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服務(wù),選擇加速度感應(yīng)器
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的時候,關(guān)閉監(jiān)聽器
public void onPause(){
sensorManager.unregisterListener(sensorEventListener);
super.onPause();
}
private final SensorEventListener sensorEventListener = new SensorEventListener() {
//系統(tǒng)設(shè)置的重力加速度標(biāo)準(zhǔn)值,設(shè)備在水平靜止的情況下就承受這個壓力,所以默認(rèn)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是一個接口,需要你實現(xiàn)run方法,上面的TimerTask就是實現(xiàn)了這個接口同樣需要實現(xiàn)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();
}
});
}
}
線程知識和我一樣不足的同學(xué),我們一起再學(xué)習(xí)線程吧,以后會更新相關(guān)的學(xué)習(xí)體會,與大家分享
忘了,還有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程序設(shè)計有所幫助。
- Android利用Sensor(傳感器)實現(xiàn)水平儀功能
- Android使用Sensor感應(yīng)器獲取用戶移動方向(指南針原理)
- Android基于Sensor感應(yīng)器獲取重力感應(yīng)加速度的方法
- android 傳感器(OnSensorChanged)使用介紹
- 解析如何在android中增加gsensor驅(qū)動(MMA7660)
- Android利用方向傳感器獲得手機(jī)的相對角度實例說明
- Android 利用方向傳感器實現(xiàn)指南針具體步驟
- Android重力傳感器實現(xiàn)滾動的彈球
- Android 傳感器--光照傳感器詳解及使用
- Android利用Sensor(傳感器)實現(xiàn)指南針小功能
相關(guān)文章
Android 破解視頻App去除廣告功能詳解及解決辦法總結(jié)
這篇文章主要介紹了Android 破解視頻App去除廣告功能詳解及解決辦法總結(jié)的相關(guān)資料,這里對視頻播放原理及破解去除廣告幾種方法進(jìn)行了總結(jié),需要的朋友可以參考下2016-12-12
Android Mms之:聯(lián)系人管理的應(yīng)用分析
本篇文章是對Android中的聯(lián)系人管理進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
Android調(diào)用相機(jī)并將照片存儲到sd卡上實現(xiàn)方法
Android中實現(xiàn)拍照有兩種方法,一種是調(diào)用系統(tǒng)自帶的相機(jī),還有一種是自己用Camera類和其他相關(guān)類實現(xiàn)相機(jī)功能,這種方法定制度比較高,需要的朋友可以了解下2012-12-12
Android的OkHttp包中的HTTP攔截器Interceptor用法示例
攔截器是OkHttp處理HTTP請求方面所具有的一個強(qiáng)大特性,這里我們就來看一下Android的OkHttp包中的HTTP攔截器Interceptor用法示例,需要的朋友可以參考下2016-07-07
Android畫圖實現(xiàn)MPAndroidchart折線圖示例詳解
這篇文章主要為大家介紹了Android畫圖實現(xiàn)MPAndroidchart折線圖示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-07-07
Android Studio安裝配置、環(huán)境搭建詳細(xì)步驟及基本使用的詳細(xì)教程
這篇文章主要介紹了Android Studio安裝配置、環(huán)境搭建詳細(xì)步驟及基本使用的詳細(xì)教程,需要的朋友可以參考下2020-03-03

