您好,登錄后才能下訂單哦!
搖一搖功能是使用手機加速度傳感器來判斷是否處于搖一搖狀態,從而進行相應的操作。
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的內存空間,有些文件本身不大,但是解碼后會很大,所以一般不播放歌曲類的文件。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。