甩歌这个有趣的功能是基本每个音乐播放器都有的,那么今天我们来说一下如何实现重力甩歌功能。
在我的播放器里我实现了两种甩歌方式,一个是甩歌控制暂停播放,一个是甩歌控制切歌。并且这两个功能可以在设置里进行切换和关闭。
话不多说,上代码:
//重力感应代码 private static final int SHAKE_THRESHOLD = 4000;//这个控制精度,越小表示反应越灵敏 private long lastUpdate=0; private double last_x=0; private double last_y= 4.50; private double last_z=9.50; public void onAccuracyChanged(Sensor sensor, int accuracy) { // TODO Auto-generated method stub //处理精准度改变 } public void onSensorChanged(SensorEvent event) { // TODO Auto-generated method stub if(event.sensor.getType()==Sensor.TYPE_ACCELEROMETER){ long curTime = System.currentTimeMillis(); // 每100毫秒检测一次 if ((curTime - lastUpdate) > 100) { long diffTime = (curTime - lastUpdate); lastUpdate = curTime; double x=event.values[SensorManager.DATA_X]; double y=event.values[SensorManager.DATA_Y]; double z=event.values[SensorManager.DATA_Z]; float speed = (float) (Math.abs(x+y+z - last_x - last_y - last_z) / diffTime * 10000); if (speed > SHAKE_THRESHOLD) { //检测到摇晃后执行的代码 if(isplay==1){ if(Shake_pause==20&&Shake_next!=20) { pause(); } if(Shake_next==20&&Shake_pause!=20) playNext(); isplay=0; }else { if(Shake_pause==20) rePlay(); isplay=1; } if(Shake_pause==20&&Shake_next==20) { Toast.makeText(MusicPlayActivity.this, "不好意思,甩动切歌和甩动暂停只能开启一个!", Toast.LENGTH_SHORT).show(); } } last_x = x; last_y = y; last_z = z; } } }
注意:Shake_pause为20说明甩歌暂停功能开启,为10说明功能关闭。Shake_next同理。