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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • python hashlib安装_Hashlib加密,内置函数,安装操作数据库「建议收藏」

    python hashlib安装_Hashlib加密,内置函数,安装操作数据库「建议收藏」hashlib模块的md5加密:md5同样的内容加密后是一样的md5加密后是不可逆的。即能加密,没办法解密。撞库:只是针对简单的,因为同样的内容加密后是一样的,难一点就不行了。登录密码:注册时候加密了保存,在登录时再加密,对比加密后内容一致即符合条件登录加盐:目的是增加复杂性。在该加密的内容上,再加上定好的一段儿内容,一同加密。在加上的这段内容,就是1importhashlib2#impor…

    2022年5月31日
    303
  • pycharm单行和多行注释快捷键_java怎么取消注释

    pycharm单行和多行注释快捷键_java怎么取消注释—默认快捷键—:Ctrl+/(如果是多行批量注释/取消注释,需先选中多行,再使用该快捷键)。除了上述默认快捷键之外,如果选择的Keymap不同,可能还有变动。如Keymap选择Emacs后,注释快捷键变为:Alt+;(Alt+分号)。注意:经过测试,无论Keymap选哪种,块注释的选项CommentwithBlockComment及其快捷键Ctrl+Shift+/均无法使用,原因暂不明确。Keymap的选择情况可以在设置(Settings)–>Keymap中查看和修改,其中打开Setti

    2022年8月29日
    0
  • ios长按不能粘贴_ios14长按不能复制

    ios长按不能粘贴_ios14长按不能复制/*设置IOS页面长按不可复制粘贴,但是IOS上出现input、textarea不能输入,因此将使用-webkit-user-select:auto;*/*{-webkit-touch-callout:none;/*系统默认菜单被禁用*/-webkit-user-select:none;/*webkit浏览器*/-khtml-user-select:none;…

    2022年9月29日
    0
  • Oracle中的wm_concat函数用法

    Oracle中的wm_concat函数用法 &nbsp;&nbsp;&nbsp;在日常的数据查询过程中,经常遇到一条信息分多条记录存储,并以同一个ID关联的情况,比如常见的房产证权利人信息,因为共有权人可能有很多,不可能把所有的权利人都放到权利人表的权利人字段,把所有权利人的证件号都放到权利人证件号字段,所以在数据库设计时候,会采用一个权利人一条记录,并以权利ID关联的方式存…

    2022年5月26日
    91
  • ubuntu系统查看gcc版本及版本切换[通俗易懂]

    ubuntu系统查看gcc版本及版本切换[通俗易懂]写在前面:自己的测试环境是Ubuntu16.04,安装了gcc-5、gcc-7,通过下面的方式从实现默认的gcc-5切换到gcc-7,亲测有效~~1.查看自己当前的gcc版本gcc-v通过下图的最后一行可以得到,这里电脑当前gcc的版本是5.42.安装另一个版本gcc我这里安装的是gcc-7sudoadd-apt-repositoryppa:ubuntu-toolch…

    2022年6月26日
    156
  • MySQL中特别实用的几种SQL语句送给大家[通俗易懂]

    MySQL中特别实用的几种SQL语句送给大家[通俗易懂]在写SQL时,经常灵活运用一些SQL语句编写的技巧,可以大大简化程序逻辑。减少程序与数据库的交互次数,有利于数据库高可用性,同时也能显得你的SQL很牛B,让同事们眼前一亮。目录实用的SQL1.插入或替换2.插入或更新3.插入或忽略4.SQL中的if-else判断语句5.指定数据快照或备份6.写入查询结果集7.强制使用指定索引心得体会:高能预警,这是一篇干货满满的MySQL技术文章,总有一天,你必然会用到,记得收藏!–来自一位被技术经理毒打多年的程序员的忠.

    2022年5月1日
    42

发表回复

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

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