Android摇一摇功能实现

今天不经意间看了之前项目的代码,发现了之前做的模仿微信的摇一摇功能。然后看了下顺便把这部分代码整理成了一个demo,有需要的同学可以去下载看看。

效果图

Android摇一摇功能实现_第1张图片 Android摇一摇功能实现_第2张图片

功能实现

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

你可能感兴趣的:(摇一摇功能-播放声音)