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


猜你喜欢
- 本文实例讲述了Android控件之CheckBox、RadioButton用法。分享给大家供大家参考。具体如下:CheckBox和Radio
- 1.使用WIFI首先设置用户权限<uses-permission android:name="android.permiss
- 线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在。一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组
- 本文实例为大家分享了C#实现单词本功能的具体代码,供大家参考,具体内容如下看到网上有类似的教程视频实现单词本,于是自己敲了一个实现单词本功能
- using System;using System.Collections.Generic;using System.Linq;using
- jsoup是一个非常好用的html解析工具。使用时需要下载相应的jar包。下面就是我使用jsoup解析html的表格的java源
- Android中判断网络是否连接实例详解在android中,如何监测网络的状态呢,这个有的时候也是十分重要的,方法如下:public cla
- 1. 什么是局部类型?C# 2.0 引入了局部类型的概念。局部类型允许我们将一个类、结构或接口分成几个部分,分别实现在几个不同的.cs文件中
- 先为啥要纯手工打造呢,因为对方是用C++做的,我按照他们给出的WSDL实现了一个WebService,结果他们完全不能调用。具体是他们调用的
- spring task和线程池的研究最近因工作需求,研究了一下spring task定时任务,和线程池,有了一定收获,记录一下涉及如下内容1
- 我们的spring cloud微服务一般是打成jar包发布的,Linux下启动jar包和windows下一样,都是java -jar 包名,
- 一、什么是桥接模式桥接模式(Bridge Pattern):将抽象部分与它的实现部分分离,使它们都可以独立地变化。它是一种对象结构型模式,又
- 今天看《第一行代码》上面关于拍照和从相册选取图片那一部分,发现始终出不来效果,所以搜索其他资料学习一下相关知识,写一个简单的Demo。&nb
- 前言这是几个月前写的博文,睡前看了觉得有些敷衍,还是改了再发吧。之前的博客做了个锁屏应用,在以前各种酷炫的锁屏效果是很流行的,有时候会去锁屏
- 前言牛顿摆大家应该都不陌生,也叫碰碰球、永动球(理论情况下),那么今天我们用Flutter实现这么一个理论中的永动球,可以作为加载Loadi
- Spring Boot 程序优化一、延迟初始化Bean一般在 SpringBoot 中都拥有很多的耗时任务,比如数据库建立连接、初始线程池的
- 代码注释是架起程序设计者与程序阅读者之间的通信桥梁,最大限度的提高团队开发合作效率。也是程序代码可维护性的重要环节之一。所以我们不是为写注释
- 前言任何一个服务如果没有监控,那就是两眼一抹黑,无法知道当前服务的运行情况,也就无法对可能出现的异常状况进行很好的处理,所以对任意一个服务来
- 摘要:本文介绍Linq查询基本操作(查询关键字)- from 子句- where 子句- select子句- group 子句- into
- 1.要求输入10个整数,从大到小排序输出输入:2 0 3 -4 8 9 5 1 7 6输出:9 8 7 6 5 3 2 1 0 -4解决方法