今天不经意间看了之前项目的代码,发现了之前做的模仿微信的摇一摇功能。然后看了下顺便把这部分代码整理成了一个demo,有需要的同学可以去下载看看。
1、根据手机加速传感器获取手机x,y,z轴坐标的变化来执行动画操作。
2、执行动画的时候加载声音
mSoundPool = new SoundPool(4, AudioManager.STREAM_MUSIC, 100);
/*加载声音*/
mSoundId = mSoundPool.load(this, R.raw.shake, 1);
/*传感器管理类*/
sensorMgr = (SensorManager) this.getSystemService(android.content.Context.SENSOR_SERVICE);
sensor = sensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
/*用来监听手机传感器的变化*/
lsn = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
float x = event.values[0];
float y = event.values[1];
float z = event.values[2];
int ox = (int) Math.abs(x - mPreSensorX);
int oy = (int) Math.abs(y - mPreSensorY);
int oz = (int) Math.abs(z - mPreSensorZ);
long currTime = System.currentTimeMillis();
if (mLastTime == 0) {
mLastTime = currTime;
}
mTotalShake += ox;
mTotalShake += oy;
mTotalShake += oz;
if (currTime - mLastTime > mInterval) {
if (mTimerFlag == false) {
if (mTotalShake >= 80) {
//执行动画
shakeUpdate();
}
} else {
mTimerFlag = false;
mInterval = 100;
}
mLastTime = 0;
mTotalShake = 0;
}
mPreSensorX = x;
mPreSensorY = y;
mPreSensorZ = z;
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
};
/**
* 摇摇操作
*/
private void shakeUpdate() {
mTimerFlag = true;
mInterval = 1000;
if (!loadingFlag) {
loadingFlag = true;
if (soundOpenFlag) {
if(mSoundPool != null)
{
//播放声音
mSoundPool.play(mSoundId, 0.5f, 0.5f, 1, 0, 1f);
}
}
mTopFrame.startAnimation(topAnimation);
mBottonFrame.startAnimation(bottomAnimation);
new Thread(new Runnable() {
public void run() {
// TODO Auto-generated method stub
try {
//过一秒后执行结束动画
Thread.sleep(1000);
handler.sendEmptyMessage(MESSAGE_ANIMATION);
//动画结束后执行的操作(加载数据等操作)
Thread.sleep(500);
handler.sendEmptyMessage(MESSAGE_END_ANIMATION);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}).start();
}
}
1、通过android.media.SoundPool.SoundPool类加载声音,声音文件放在res的raw目录下
2、获取手机传感器管理类:android.hardware.SensorManager
实现传感器监听:android.hardware.SensorEventListener,在回调函数onSensorChanged中根据X、Y、Z轴坐标的变化来判断是否执行摇一摇动画,这里的实现方式是判断X、Y、Z轴坐标变化的相对值相加超过一定值时执行摇一摇操作,经过测试这里设置的是80。(因为手机硬件的不同这里的值可以取个适中的范围)。
3、当值大于等于我们设置的数值时,先是判断声音要不要打开,如果标示为true则播放。并执行移动动画,使得上下两部分执行移动动画。过一秒后再执行移动动画使得上下两部分回到起始位置。
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
if (sensorMgr != null) {
//注册感应监听器
sensorMgr.registerListener(lsn, sensor,
SensorManager.SENSOR_DELAY_FASTEST);
}
}
@Override
protected void onStop() {
// TODO Auto-generated method stub
super.onPause();
if (sensorMgr != null) {
//取消注册监听
sensorMgr.unregisterListener(lsn);
}
mTopFrame.clearAnimation();
mBottonFrame.clearAnimation();
}
在onResume方法中注册感应监听器,在onStop方法中取消注册监听并清除动画。
1、Android传感器
有11中传感器可供使用
Sensor.TYPE_ACCELEROMETER 加速度
Sensor.SENSOR_TYPE_MAGNETIC_FIELD 磁场传感器
Sensor.SENSOR_TYPE_ORIENTATION 方向传感器
Sensor.SENSOR_TYPE_GYROSCOPE 回转仪传感器
Sensor.SENSOR_TYPE_LIGHT 光线传感器
Sensor.SENSOR_TYPE_PRESSURE 光线传感器
Sensor.SENSOR_TYPE_TEMPERATURE 温度传感器
Sensor.SENSOR_TYPE_PROXIMITY 距离传感器
Sensor.SENSOR_TYPE_GRAVITY 重力传感器
Sensor.SENSOR_TYPE_LINEAR_ACCELERATION 线性加速度传感器
Sensor.SENSOR_TYPE_ROTATION_VECTOR 旋转矢量
在这里使用的是Sensor.TYPE_ACCELEROMETER 加速度传感器
2、SoundPool
Android中播放声音的两种方法。
MediaPlayer
MediaPlayer在创建和销毁时都会耗费大量的系统资源,且创建和销毁时间较长,不支持同时播放很多声音。
SoundPool
适合播放时间较短且反复播放的声音,支持同时播放多种声音
因为这里播放时间较短所有使用SoundPool
源码下载: http://download.csdn.net/detail/yangdaolong19881214/9347505