java仿微信摇一摇实现播放音乐
摇一摇功能是使用手机加速度传感器来判断是否处于摇一摇状态,从而进行相应的操作。
1、将音乐文件放在res/raw下,如果没有raw,创建一个
2、布局文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_shake" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.sq.dissertation.activity.ShakeActivity" android:background="#1d1d1d"> <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" android:src="@mipmap/shakehideimg_man2"/> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center" android:orientation="vertical"> <ImageView android:id="@+id/hand_up" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/shake_logo_up"/> <ImageView android:id="@+id/hand_down" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@mipmap/shake_logo_down"/> </LinearLayout> </RelativeLayout>
3、Java代码
public class ShakeActivity extends AppCompatActivity implements SensorEventListener { private ImageView ivUp; private ImageView ivDown; private SensorManager sensorManager; private Vibrator vibrator; private Sensor sensor; private MediaPlayer player; private ObjectAnimator upAnimator; private ObjectAnimator downAnimator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shake); ivUp = ((ImageView) findViewById(R.id.hand_up)); ivDown = ((ImageView) findViewById(R.id.hand_down)); //获取传感器管理者 sensorManager = ((SensorManager) getSystemService(SENSOR_SERVICE)); //实例化手机震动的对象 vibrator = ((Vibrator) getSystemService(VIBRATOR_SERVICE)); //获取加速度传感器 sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); /*实例化对象,参数:同时播放的流的最大数量,即同时播放的音乐数的上限; 流的类型,一般都是使用AudioManager.STREAM_MUSIC表示可以重复播放 采样率转化质量,但是现在该功能还不能生效,建议用0 */ // soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); //参数三没有效果,建议用1 // loadId = soundPool.load(ShakeActivity.this, R.raw.three, 1); player = MediaPlayer.create(this, R.raw.music); initAnimation(); } private void initAnimation() { //上下两张图片的动画 upAnimator = ObjectAnimator.ofFloat(ivUp, "translationY", 0, -200, 0); upAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); upAnimator.setDuration(2000); downAnimator = ObjectAnimator.ofFloat(ivDown, "translationY", 0, 200, 0); downAnimator.setInterpolator(new AccelerateDecelerateInterpolator()); downAnimator.setDuration(2000); } @Override protected void onResume() { super.onResume(); if (sensorManager != null) { //注册监听器,监听,传感器,获取传感器的频率 sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL); } } @Override protected void onPause() { super.onPause(); if (sensorManager != null) { //取消监听器 sensorManager.unregisterListener(this); //释放音频资源 // soundPool.unload(loadId); } } @Override protected void onDestroy() { super.onDestroy(); player.release(); } @Override public void onSensorChanged(SensorEvent event) { //获取传感器信息改变时的数据 float[] values = event.values; //x轴方向的重力加速度,向右为正 float x = values[0]; //y轴方向的重力加速度,向左为正 float y = values[1]; //z轴方向的重力加速度,向上为正 float z = values[2]; //一般在这三个方向的重力加速度达到40就达到了摇晃手机的状态 int value = 18; if (Math.abs(x) > value || Math.abs(y) > value || Math.abs(z) > 19) { long patter[] = {200, 1000}; vibrator.vibrate(patter,1); upAnimator.start(); downAnimator.start(); /* 1f:左声道音量 1f:右声道音量 1:音频的优先级,值越大优先级越高, 0:循环播放的次数,0为播放一次,-1为无限循环,其他值为loop+1次数 1f:播放速率,范围0.5-2.0(1为正常速率) */ // soundPool.play(loadId, 1f, 1f, 1, 0, 1f); if (player.isPlaying()) { player.seekTo(0); }else{ player.start(); } } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }
补充:Java代码中出现的SoundPool来播放音效,它适合播放短促的音效,它最多只能申请1M的内存空间,有些文件本身不大,但是解码后会很大,所以一般不播放歌曲类的文件。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
赞 (0)