• android音乐播放器开发 SweetMusicPlayer 摇一摇换歌


    上一篇写了怎样在线匹配歌词,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);
    	}
    	
    	
    	//重力感应到变化
    	@Override
    	public void onSensorChanged(SensorEvent event) {
    		// TODO Auto-generated method stub
    		long 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();
    		}
    	}
    
    	@Override
    	public 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;
    	@Override
    	public void onCreate() {
    		// TODO Auto-generated method stub
    		super.onCreate();
    		
    		vibrator=(Vibrator) getBaseContext().getSystemService(Context.VIBRATOR_SERVICE);
    		mShakeListener=new ShakeListener(getBaseContext());
    		mShakeListener.setOnShakeListener(new ShakeListener.OnShakeListener() {
    			
    			@Override
    			public 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();
    	}
    	
    	@Override
    	public IBinder onBind(Intent intent) {
    		// TODO Auto-generated method stub
    		return null;
    	}
    
    	@Override
    	public int onStartCommand(Intent intent, int flags, int startId) {
    		// TODO Auto-generated method stub
    		mShakeListener.start();
    		return super.onStartCommand(intent, flags, startId);
    	}
    
    	@Override
    	public void onDestroy() {
    		// TODO Auto-generated method stub
    		super.onDestroy();
    		mShakeListener.stop();
    	}
    
    	
    }
    


  • 相关阅读:
    反射前序------类加载器(ClsaaLoader)的简单讲述
    反射前序------简述类加载的过程
    反射前序------静态语言和动态语言简述以及java语言的特性
    AJAX的原生和JQuery的实现方式
    JQuery
    会话技术------服务器技术session
    冒泡排序
    Git(二)
    Git教程
    Re库使用(正则表达式)
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5403324.html
Copyright © 2020-2023  润新知