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

	
}

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • datetime 和 smalldatetime[通俗易懂]

    datetime 和 smalldatetime[通俗易懂]datetime和smalldatetime用于表示某天的日期和时间的数据类型。datetime和smalldatetime表示某天的日期和时间。 数据类型 范围 精确度 datetime 1753年1月1日到9999年12月31日 3.33毫秒 smalld…

  • Jmm模型_fgls模型

    Jmm模型_fgls模型一、什么是JMM模型Java内存模型(即JavaMemoryModel,简称JMM)本身是一种抽象的概念,并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),用于存储线程私有的数据,而Java内存模型中规定所有变…

  • 三大(Chrome、Firefox、IE)webdriver下载地址

    三大(Chrome、Firefox、IE)webdriver下载地址目录三大浏览器webDriver下载地址三大浏览器webDriver下载地址webDriver下载地址。谷歌chromedriver下载地址:https://code.google.com/p/chromedriver/downloads/list火狐geckodriver下载地址:https://github.com/mozilla/geckodriver/releases/IEdriver下载地址:http://www.nuget.org/pa

  • 云服务器搭建java服务器运行环境

    云服务器搭建java服务器运行环境文章目录安装jdk解压jdk配置环境变量安装tomcattomcat开机自启安装MySQL安装MySQL开机启动启动mysql服务配置mysql如果运行上面的命令中途发生错误:`ERROR1558(HY000):Columncountofmysql.useriswrong.Expected43,found39.`进入mysql安装jdk先下载jdklinux版本,点…

  • 结对编程1

    结对编程1

  • IDEA继承父类后重写方法快捷键

    IDEA继承父类后重写方法快捷键eg:我们的MyServlet继承了HttpServlet,我们想要重写里面的doGet()方法和doPost()方法,如何做到呢?publicclassMyServletextendsHttpServlet{}1)ctrl+o,注意光标在继承的父类名后2)弹出下图后3)我们想要选定连续的方法怎么做?按住shift键,默认开始为当前位置,结束位置为你下次的鼠标单击位置4)我们只是想选择不连续的两个方法,比如说上文的doGet()和doPost(),如何做.

    2022年10月31日

发表回复

您的电子邮箱地址不会被公开。

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