java仿微信搖一搖實現(xiàn)播放音樂
搖一搖功能是使用手機加速度傳感器來判斷是否處于搖一搖狀態(tài),從而進行相應(yīng)的操作。
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表示可以重復(fù)播放
采樣率轉(zhuǎn)化質(zhì)量,但是現(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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
macOS下Spring Boot開發(fā)環(huán)境搭建教程
這篇文章主要為大家詳細(xì)介紹了macOS下Spring Boot開發(fā)環(huán)境搭建教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01
Java實現(xiàn)調(diào)用第三方相關(guān)接口
最近在做一個項目,需要調(diào)用第三方接口,本文主要介紹了Java實現(xiàn)調(diào)用第三方相關(guān)接口,具有一定的參考價值,感興趣的可以了解一下2023-09-09
Java過濾器與監(jiān)聽器間區(qū)別與聯(lián)系
監(jiān)聽器是一個接口內(nèi)容由我們實現(xiàn),會在特定時間被調(diào)用,監(jiān)聽器用于監(jiān)聽web應(yīng)用中三大域?qū)ο?request,session,application),信息的創(chuàng)建,銷毀,增加,修改,刪除等動作的發(fā)生,然后做出相應(yīng)的響應(yīng)處理2023-01-01
如何使用Java給您的圖片瘦身之Thumbnailator技術(shù)
在java日常開發(fā)中經(jīng)常遇到對圖片資源的操作需求,如壓縮、縮放、旋轉(zhuǎn),下面這篇文章主要給大家介紹了關(guān)于如何使用Java給您的圖片瘦身之Thumbnailator技術(shù)的相關(guān)資料,需要的朋友可以參考下2022-10-10
關(guān)于Feign調(diào)用服務(wù)Headers傳參問題
這篇文章主要介紹了關(guān)于Feign調(diào)用服務(wù)Headers傳參問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03
MyBatis使用嵌套查詢collection和association的實現(xiàn)
本文詳細(xì)介紹了使用MyBatis框架進行數(shù)據(jù)庫操作時,如何利用collection標(biāo)簽實現(xiàn)一對多的嵌套查詢和使用association標(biāo)簽實現(xiàn)一對一的嵌套查詢,感興趣的可以了解一下2024-09-09

