java仿微信搖一搖實(shí)現(xiàn)播放音樂(lè)
搖一搖功能是使用手機(jī)加速度傳感器來(lái)判斷是否處于搖一搖狀態(tài),從而進(jìn)行相應(yīng)的操作。
1、將音樂(lè)文件放在res/raw下,如果沒(méi)有raw,創(chuàng)建一個(gè)
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));
//實(shí)例化手機(jī)震動(dòng)的對(duì)象
vibrator = ((Vibrator) getSystemService(VIBRATOR_SERVICE));
//獲取加速度傳感器
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
/*實(shí)例化對(duì)象,參數(shù):同時(shí)播放的流的最大數(shù)量,即同時(shí)播放的音樂(lè)數(shù)的上限;
流的類(lèi)型,一般都是使用AudioManager.STREAM_MUSIC表示可以重復(fù)播放
采樣率轉(zhuǎn)化質(zhì)量,但是現(xiàn)在該功能還不能生效,建議用0
*/
// soundPool = new SoundPool(1, AudioManager.STREAM_MUSIC, 0);
//參數(shù)三沒(méi)有效果,建議用1
// loadId = soundPool.load(ShakeActivity.this, R.raw.three, 1);
player = MediaPlayer.create(this, R.raw.music);
initAnimation();
}
private void initAnimation() {
//上下兩張圖片的動(dòng)畫(huà)
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) {
//注冊(cè)監(jiān)聽(tīng)器,監(jiān)聽(tīng),傳感器,獲取傳感器的頻率
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_NORMAL);
}
}
@Override
protected void onPause() {
super.onPause();
if (sensorManager != null) {
//取消監(jiān)聽(tīng)器
sensorManager.unregisterListener(this);
//釋放音頻資源
// soundPool.unload(loadId);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
player.release();
}
@Override
public void onSensorChanged(SensorEvent event) {
//獲取傳感器信息改變時(shí)的數(shù)據(jù)
float[] values = event.values;
//x軸方向的重力加速度,向右為正
float x = values[0];
//y軸方向的重力加速度,向左為正
float y = values[1];
//z軸方向的重力加速度,向上為正
float z = values[2];
//一般在這三個(gè)方向的重力加速度達(dá)到40就達(dá)到了搖晃手機(jī)的狀態(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)先級(jí),值越大優(yōu)先級(jí)越高,
0:循環(huán)播放的次數(shù),0為播放一次,-1為無(wú)限循環(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) {
}
}
補(bǔ)充:Java代碼中出現(xiàn)的SoundPool來(lái)播放音效,它適合播放短促的音效,它最多只能申請(qǐng)1M的內(nèi)存空間,有些文件本身不大,但是解碼后會(huì)很大,所以一般不播放歌曲類(lèi)的文件。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- android重力感應(yīng)開(kāi)發(fā)之微信搖一搖功能
- Android編程使用加速度傳感器實(shí)現(xiàn)搖一搖功能及優(yōu)化的方法詳解
- Android實(shí)現(xiàn)iPhone晃動(dòng)撤銷(xiāo)輸入功能 Android仿微信搖一搖功能
- Android利用傳感器仿微信搖一搖功能
- Android實(shí)現(xiàn)搖一搖功能
- Android利用傳感器實(shí)現(xiàn)微信搖一搖功能
- Android 微信搖一搖功能實(shí)現(xiàn)詳細(xì)介紹
- android 類(lèi)似微信的搖一搖功能實(shí)現(xiàn)思路及代碼
相關(guān)文章
mybatis insert 返回自增主鍵的實(shí)現(xiàn)示例
mybatis 在新增之后怎么也獲取不到自增主鍵,本文主要介紹了mybatis insert 返回自增主鍵的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06
Java實(shí)現(xiàn)解析第三方接口返回的json
在實(shí)際開(kāi)發(fā)過(guò)程中,免不了和其他公司進(jìn)行聯(lián)調(diào),調(diào)用第三方接口,這個(gè)時(shí)候我們就需要根據(jù)對(duì)方返回的數(shù)據(jù)進(jìn)行解析,獲得我們想要的字段,下面我們就來(lái)看看具體有哪些方法吧2024-01-01
springboot集成測(cè)試最小化依賴(lài)實(shí)踐示例
這篇文章主要為大家介紹了springboot集成測(cè)試最小化依賴(lài)實(shí)踐示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06
mysql高版本(8.0+)group_by報(bào)錯(cuò)的處理方法
本文主要介紹了mysql高版本(8.0+)group_by報(bào)錯(cuò)的處理方法,這個(gè)錯(cuò)誤一般發(fā)生在mysql 5.7以及 5.7以上的版本中,本文就來(lái)介紹一下兩種解決方法,感興趣的可以了解一下2023-09-09
詳解Java中static關(guān)鍵字和內(nèi)部類(lèi)的使用
這篇文章主要為大家詳細(xì)介紹了Java中static關(guān)鍵字和內(nèi)部類(lèi)的使用,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-08-08
SpringBoot實(shí)現(xiàn)國(guó)際化的操作步驟
國(guó)際化(Internationalization) 是指為了適應(yīng)不同語(yǔ)言、文化和地區(qū)的用戶,使軟件能夠方便地進(jìn)行本地化修改的過(guò)程,本文介紹了SpringBoot 國(guó)際化功能的簡(jiǎn)單使用,感興趣的朋友可以參考下2024-02-02

