问题大致如下,我调用了安卓的传感器并得到了在X轴的FLOAT型变量,然后利用android Handler和HandlerThread 线程实现界面组件信息的刷新,也就是刷新那个FLOAT值。但是我发现刷新值的过程很卡,感觉不流畅,我又将FLOAT保留了两位小数,结果还是不流畅,我想能不能通过一种刷新UI组建的方式使得这个变量在屏幕的输出流畅一些??
代码如下
package sensor.demo;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.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;public class SensorDemoActivity extends Activity {
private static final String TAG = "sensor";//设置LOG标签
private SensorManager sm;
TextView et;
public int flag = 0;
public float X_lateral;
public float Y_longitudinal;
public float Z_vertical;
String a; /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et = (TextView) findViewById(R.id.tv);
fuck.start();
sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);//创建一个SensorManager来获取系统的传感器服务
int sensorType = Sensor.TYPE_ACCELEROMETER;//选取加速度感应器
sm.registerListener(myAccelerometerListener,sm.getDefaultSensor(sensorType),SensorManager.SENSOR_DELAY_NORMAL);
//最常用的一个方法 注册事件
//参数1 :SensorEventListener监听器
// 参数2 :Sensor 一个服务可能有多个Sensor实现,此处调用getDefaultSensor获取默认的Sensor
//参数3 :模式 可选数据变化的刷新频率
}
//SensorEventListener接口的实现,需要实现两个方法
//方法1 onSensorChanged 当数据变化的时候被触发调用
//onAccuracyChanged 当获得数据的精度发生变化的时候被调用,比如突然无法获得数据时
//
final SensorEventListener myAccelerometerListener = new SensorEventListener(){
//复写onSensorChanged方法
public void onSensorChanged(SensorEvent sensorEvent){
if(sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
Log.i(TAG,"onSensorChanged");
//图解中已经解释三个值的含义
X_lateral = sensorEvent.values[0];
Y_longitudinal = sensorEvent.values[1];
Z_vertical = sensorEvent.values[2];
Log.i(TAG,"\n heading "+X_lateral);
Log.i(TAG,"\n pitch "+Y_longitudinal);
Log.i(TAG,"\n roll "+Z_vertical);
}
}
//复写onAccuracyChanged方法
public void onAccuracyChanged(Sensor sensor , int accuracy){
Log.i(TAG, "onAccuracyChanged");
}
};
// 很关键的部分:注意,说明文档中提到,即使activity不可见的时候,感应器依然会继续的工作,测试的时候可以发现,没有正常的刷新频率
//也会非常高,所以一定要在onPause方法中关闭触发器,否则讲耗费用户大量电量,很不负责。
public void onPause(){
sm.unregisterListener(myAccelerometerListener);
super.onPause();
}
HandlerThread fuck=new HandlerThread(""){
public void run() {
// TODO Auto-generated method stub
while (flag>=0) {
flag++;
Message msg=new Message();//申明一个消息
int ss=(int)(X_lateral*100);
int y=(int)(Y_longitudinal*100);
int z=(int)(Z_vertical*100);
float sss=((float)ss)/100; a="x="+sss;
msg.obj=a;//将字符串a的值赋值给message的第三个参数obj
updateBar.sendMessage(msg);//将msg的数据发送
}
}
};
Handler updateBar = new Handler() { @Override
public void handleMessage(Message msg) {
String b=(String) msg.obj;
et.setText(b);//将接收到的数据显示到TextView中
}
};
}
请教各位高手( ⊙ o ⊙ )啊!
代码如下
package sensor.demo;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.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.util.Log;
import android.widget.TextView;public class SensorDemoActivity extends Activity {
private static final String TAG = "sensor";//设置LOG标签
private SensorManager sm;
TextView et;
public int flag = 0;
public float X_lateral;
public float Y_longitudinal;
public float Z_vertical;
String a; /** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
et = (TextView) findViewById(R.id.tv);
fuck.start();
sm = (SensorManager)getSystemService(Context.SENSOR_SERVICE);//创建一个SensorManager来获取系统的传感器服务
int sensorType = Sensor.TYPE_ACCELEROMETER;//选取加速度感应器
sm.registerListener(myAccelerometerListener,sm.getDefaultSensor(sensorType),SensorManager.SENSOR_DELAY_NORMAL);
//最常用的一个方法 注册事件
//参数1 :SensorEventListener监听器
// 参数2 :Sensor 一个服务可能有多个Sensor实现,此处调用getDefaultSensor获取默认的Sensor
//参数3 :模式 可选数据变化的刷新频率
}
//SensorEventListener接口的实现,需要实现两个方法
//方法1 onSensorChanged 当数据变化的时候被触发调用
//onAccuracyChanged 当获得数据的精度发生变化的时候被调用,比如突然无法获得数据时
//
final SensorEventListener myAccelerometerListener = new SensorEventListener(){
//复写onSensorChanged方法
public void onSensorChanged(SensorEvent sensorEvent){
if(sensorEvent.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
Log.i(TAG,"onSensorChanged");
//图解中已经解释三个值的含义
X_lateral = sensorEvent.values[0];
Y_longitudinal = sensorEvent.values[1];
Z_vertical = sensorEvent.values[2];
Log.i(TAG,"\n heading "+X_lateral);
Log.i(TAG,"\n pitch "+Y_longitudinal);
Log.i(TAG,"\n roll "+Z_vertical);
}
}
//复写onAccuracyChanged方法
public void onAccuracyChanged(Sensor sensor , int accuracy){
Log.i(TAG, "onAccuracyChanged");
}
};
// 很关键的部分:注意,说明文档中提到,即使activity不可见的时候,感应器依然会继续的工作,测试的时候可以发现,没有正常的刷新频率
//也会非常高,所以一定要在onPause方法中关闭触发器,否则讲耗费用户大量电量,很不负责。
public void onPause(){
sm.unregisterListener(myAccelerometerListener);
super.onPause();
}
HandlerThread fuck=new HandlerThread(""){
public void run() {
// TODO Auto-generated method stub
while (flag>=0) {
flag++;
Message msg=new Message();//申明一个消息
int ss=(int)(X_lateral*100);
int y=(int)(Y_longitudinal*100);
int z=(int)(Z_vertical*100);
float sss=((float)ss)/100; a="x="+sss;
msg.obj=a;//将字符串a的值赋值给message的第三个参数obj
updateBar.sendMessage(msg);//将msg的数据发送
}
}
};
Handler updateBar = new Handler() { @Override
public void handleMessage(Message msg) {
String b=(String) msg.obj;
et.setText(b);//将接收到的数据显示到TextView中
}
};
}
请教各位高手( ⊙ o ⊙ )啊!
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货