在这里,我们对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 下载