android音乐播放器开发 SweetMusicPlayer 摇一摇换歌[通俗易懂]

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();
	}

	
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115290.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • c语言线程间传递消息,线程间通信[通俗易懂]

    c语言线程间传递消息,线程间通信[通俗易懂]线程间通信前面一章讲了线程间同步,提到了信号量、互斥量、事件集等概念;本章接着上一章的内容,讲解线程间通信。在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取,根据读取到的全局变量值执行相应的动作,达到通信协作的目的。RT-Thread中则提供了更多的工具帮助在不同的线程中间传递信息,本章会详细介绍这些工具。学习完本章,…

    2022年10月7日
    2
  • startActivityForResult无法回调

    startActivityForResult无法回调Android中常常需要用到startActivityForResult()方法来获得Activity回执信息的场景。但有时不注意就会导致onActivityResult()不被调用,或者调用时机错误。以下总结开发中遇到过的两种情况:Fragment在fragment作为调用者使用时需要注意,Fragment有自己的一套API而不是通过其父类API进行调用的,因此调用自己的API时需要重写自己…

    2022年7月11日
    20
  • goland 2021.9 激活码【最新永久激活】

    (goland 2021.9 激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/ide…

    2022年3月26日
    85
  • 我的python之路6(基础练习)

    我的python之路6(基础练习)恢复内容开始1、执行Python脚本的两种方式打开Windows命令提示符二、使用其它集成开发工具进行PYTHON程序的开发,如Eclips\Pycharm等,使用这种集成开发工具开发时,那都

    2022年7月5日
    18
  • css 100% 和 100vh区别

    css 100% 和 100vh区别100%是相对于父元素100vh是相对于window

    2022年6月6日
    150
  • Mac使用秘钥登录Linux服务器「建议收藏」

    Mac使用秘钥登录Linux服务器

    2022年2月10日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号