原帖地址:http://www.androidegg.com/portal.php?mod=view&aid=641
1.4.4 加速度传感器运用实例
在这里,我们对Low-Pass Filter和High-pass filter实例进行说明。在实际的运用中在什么样的场合下如何使用这两个过滤器,通过例程我们进行很好的理解。程序列表1-6,列表1-7是摇晃手机表示图片的应用程序的代码(运行结果如图1-6)。在这个例程中作成ShakeActivity类和管理抽样数据的ValueHolder类。ShakeActivity类和ValueHolder类的关系如图1-7所示。
图1-6 摇动手机并表示图片的例程
列表1-6 摇动手机并表示图片的例程1
package com.mamezou.android.shake;
import java.util.Arrays;
public class ValueHolder { //..................①
private static final float BLANK = -999;
private int size;
private float[] values;
private int position = 0;
public ValueHolder(int size) {
this.size = size;
values = new float[size];
clear();
}
private void clear() {
Arrays.fill(values, BLANK);
}
public boolean add(float value) {
values[position] = value;
if(size -1 == position) {
position = 0;
return true;
}
position ++;
return false;
}
// 取得中间值的方法
public float getMedian() { //..................②
float[] tmp = values.clone();
Arrays.sort(tmp);
int len = tmp.length;
int first = 0;
for (int i = 0; i < len; i++) {
first = i;
if(tmp[i] != BLANK) break;
}
return tmp[(len - first) / 2 + first];
}
}
要点如下所示
①ValueHolder类管理用size指定的抽样数据
②返回保存的抽样数据的中间值。
列表1-6 摇动手机并表示图片的例程2 package com.mamezou.android.shake; import android.app.Activity; import android.content.Context; import android.graphics.drawable.BitmapDrawable; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.view.View; public class ShakeActivity extends Activity implements SensorEventListener { private SensorManager sensorManager; private ValueHolder x; private ValueHolder y; private ValueHolder z; private View layout; // Android君的画像 private BitmapDrawable andy; private static final int ELEMENT_COUNT = 30; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); layout = (View) findViewById(R.id.layout); andy = (BitmapDrawable) getResources().getDrawable(R.drawable.andy); } @Override protected void onResume() { super.onResume(); sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_FASTEST); x = new ValueHolder(ELEMENT_COUNT); y = new ValueHolder(ELEMENT_COUNT); z = new ValueHolder(ELEMENT_COUNT); } @Override protected void onStop() { sensorManager.unregisterListener(this); super.onStop(); } public void onAccuracyChanged(Sensor sensor, int accuracy) { } public void onSensorChanged(SensorEvent e) { float sensorValueX = e.values[SensorManager.DATA_X]; float sensorValueY = e.values[SensorManager.DATA_Y]; float sensorValueZ = e.values[SensorManager.DATA_Z]; x.add(sensorValueX); y.add(sensorValueY); z.add(sensorValueZ); float valueX = sensorValueX - x.getMedian(); float valueY = sensorValueX - x.getMedian(); float valueZ = sensorValueX - x.getMedian(); andy.setAlpha(15 * (int)(Math.abs(valueX) + Math.abs(valueY) + Math.abs(valueZ))); //..................① layout.setBackgroundDrawable(andy); } } 要点如下所示 ①对3个轴的High-pass filter的值,画像的阿尔法值进行操作。按照这样做,手机强烈摇动的时候Android画像被表示。High-pass filter处理对只是对手机倾斜,画面不被表示。只对手机进行摇动的时候画像才表示。 全部源码下载
|
例程名称
|
Android 加速度传感器运用实例 代码下载
|
大小
| 35.2 KB |
下载
| Shake.zip | |