標籤:android 安卓 播放器 介面設計 音樂
上一篇寫了如何線上匹配歌詞,http://blog.csdn.net/huweigoodboy/article/details/39878063,現在來講講搖一搖功能開發。
同樣用了一個Service去實現搖一搖。
ShakeListener繼承自SensorEventListener,當加速度感應器感受到重力變化,就去通知onShakeListener調用onShake(),
在震動的同時隨機一首歌。
一,加速度感應器
在這裡需要設定一個速度閾值和時間間隔,控制一定的時間間隔才能觸發第二次震動,還有感受速度太小也不去onShake()。
1)得到sensorManager。
sensorManager=(SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
2)得到sensor
sensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
3)註冊感應監聽
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
package com.huwei.sweetmusicplayer.ui.listeners;import android.content.Context;import android.hardware.Sensor;import android.hardware.SensorEvent;import android.hardware.SensorEventListener;import android.hardware.SensorManager; public class ShakeListener implements SensorEventListener {//速度閾值private static final int SPEED_SHAKEHOLD=3000;//檢測時間間隔private static final int UPTATE_INTERVAL_TIME = 70;//感應器管理器private SensorManager sensorManager;//感應器 private Sensor sensor;//重力感應監聽器private OnShakeListener onShakeListener;// 上下文private Context mContext;// 手機上一個位置時重力感應座標private float lastX;private float lastY;private float lastZ;// 上次檢測時間private long lastUpdateTime;public ShakeListener(Context mContext) {super();this.mContext = mContext;start();}public void start(){sensorManager=(SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);if(sensorManager!=null){//獲得加速度感應器sensor=sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);}if(sensor!=null){//註冊加速器,並且設定速率sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);}}// 設定重力感應監聽器public void setOnShakeListener(OnShakeListener listener) {onShakeListener = listener;}public void stop(){sensorManager.unregisterListener(this);}//重力感應到變化@Overridepublic void onSensorChanged(SensorEvent event) {// TODO Auto-generated method stublong currentUpdateTime=System.currentTimeMillis();long timeInterval=currentUpdateTime-lastUpdateTime;if(timeInterval<UPTATE_INTERVAL_TIME){return;}lastUpdateTime=currentUpdateTime;float x=event.values[0];float y=event.values[1];float z=event.values[2];float deltaX=x-lastX;float deltaY=y-lastY;float deltaZ=z-lastZ;lastX=x;lastY=y;lastZ=z;double speed=Math.sqrt(deltaX*deltaX+deltaY*deltaY*deltaZ*deltaZ)/timeInterval*10000;if(speed>SPEED_SHAKEHOLD){onShakeListener.onShake();}}@Overridepublic void onAccuracyChanged(Sensor sensor, int accuracy) {// TODO Auto-generated method stub}// 搖晃監聽介面public interface OnShakeListener {public void onShake();}}
二,控制震動
得到Vibrator對象
vibrator=(Vibrator) getBaseContext().getSystemService(Context.VIBRATOR_SERVICE);
震動方法有兩種
vibrator.vibrate(500);震動多少毫秒
或者設定一個震動周期的數組
vibrator.vibrate(new long[]{100,200,100,200}, -1); //停止,震動,停止,震動
-1表示重複次數為不重複
package com.huwei.sweetmusicplayer.services;import com.huwei.sweetmusicplayer.datamanager.MusicManager;import com.huwei.sweetmusicplayer.ui.listeners.ShakeListener; import android.app.Service;import android.content.Context;import android.content.Intent;import android.os.IBinder;import android.os.Vibrator;import android.util.Log;public class ShakeService extends Service {private static final String TAG="ShakeService";private ShakeListener mShakeListener;private Vibrator vibrator;@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();vibrator=(Vibrator) getBaseContext().getSystemService(Context.VIBRATOR_SERVICE);mShakeListener=new ShakeListener(getBaseContext());mShakeListener.setOnShakeListener(new ShakeListener.OnShakeListener() {@Overridepublic void onShake() {// TODO Auto-generated method stub mShakeListener.stop(); startVibrator(); //vibrator.cancel(); mShakeListener.start();}} );}//震動函數void startVibrator(){Log.i(TAG,"shake");vibrator.vibrate(500);MusicManager.getInstance().random_a_song();}@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubreturn null;}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {// TODO Auto-generated method stubmShakeListener.start();return super.onStartCommand(intent, flags, startId);}@Overridepublic void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();mShakeListener.stop();}}
android音樂播放器開發 SweetMusicPlayer 搖一搖換歌