溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java仿微信搖一搖實現(xiàn)播放音樂

發(fā)布時間:2020-09-11 02:45:16 來源:腳本之家 閱讀:241 作者:ami_daqi 欄目:編程語言

搖一搖功能是使用手機加速度傳感器來判斷是否處于搖一搖狀態(tài),從而進行相應的操作。

1、將音樂文件放在res/raw下,如果沒有raw,創(chuàng)建一個

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);
    /*實例化對象,參數(shù):同時播放的流的最大數(shù)量,即同時播放的音樂數(shù)的上限;
      流的類型,一般都是使用AudioManager.STREAM_MUSIC表示可以重復播放
      采樣率轉化質量,但是現(xiàn)在該功能還不能生效,建議用0
    */
//    soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
    //參數(shù)三沒有效果,建議用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) {
    //注冊監(jiān)聽器,監(jiān)聽,傳感器,獲取傳感器的頻率
    sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
    }

  }

  @Override
  protected void onPause() {
    super.onPause();
    if (sensorManager != null) {
      //取消監(jiān)聽器
      sensorManager.unregisterListener(this);
      //釋放音頻資源
//    soundPool.unload(loadId);
    }
  }

  @Override
  protected void onDestroy() {
    super.onDestroy();
    player.release();

  }

  @Override
  public void onSensorChanged(SensorEvent event) {
    //獲取傳感器信息改變時的數(shù)據(jù)
    float[] values = event.values;
    //x軸方向的重力加速度,向右為正
    float x = values[0];
    //y軸方向的重力加速度,向左為正
    float y = values[1];
    //z軸方向的重力加速度,向上為正
    float z = values[2];
    //一般在這三個方向的重力加速度達到40就達到了搖晃手機的狀態(tài)
    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:音頻的優(yōu)先級,值越大優(yōu)先級越高,
      0:循環(huán)播放的次數(shù),0為播放一次,-1為無限循環(huán),其他值為loop+1次數(shù)
      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代碼中出現(xiàn)的SoundPool來播放音效,它適合播放短促的音效,它最多只能申請1M的內(nèi)存空間,有些文件本身不大,但是解碼后會很大,所以一般不播放歌曲類的文件。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI