此篇因是傳感器相關的功能,故無Gif效果 ;
效果完全沒有問題 搖一搖 - 震動 - 紅包音效 > < ~
目錄
- 準備工作
- 正文(全部代碼,可直接使用)
準備工作
震動功能
//震動服務對象
Vibrator vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
//200:搖晃了200毫秒之後,開始震動
//500:震動持續的時間,震動持續了500毫秒。
long[] pattern = {200, 2000};
vibrator.vibrate(pattern, -1);
搖動紅包的音效 : res - raw - red_packet
- raw 存放音頻的文件夾,如果當前項目沒有此文件夾的話,請直接創建 - -~
- red_packet 紅包音效
傳感器的使用 (用戶通過搖動手機,觸發手機傳感器,我們的邏輯操作一般在傳感器的內部監聽至上)
//獲取傳感器服務管理對象
SensorManager sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
assert sensorManager != null;
//獲取傳感器對象
Sensor accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//註冊傳感器監聽器
sensorManager.registerListener(sensorEventListener, accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL);
//傳感器的監聽
sensorEventListener = new SensorEventListener() {
@SuppressLint("MissingPermission")
@Override
public void onSensorChanged(SensorEvent event) {
int type = event.sensor.getType();
if (type == Sensor.TYPE_ACCELEROMETER) {
float[] values = event.values;
float x = values[0];
float y = values[1];
float z = values[2];
//作爲一個標準值 最小低於 10 &最大值不超過 20
int coll = 16;
if (Math.abs(x) > coll | Math.abs(y) > coll | Math.abs(z) > coll) {
Toast.makeText(MainActivity.this, "觸發傳感器,可以在此處震動 + 紅包音效", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
防止OOM
- onStart() 註冊傳感器、播放器
@Override
protected void onStart() {
super.onStart();
if (sensorManager != null) {
sensorManager.registerListener(sensorEventListener, accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
if (soundPool != null) {
soundPool.load(this, R.raw.red_packet, 1);
}
}
- onPause() 註銷傳感器、播放器
@Override
protected void onPause() {
super.onPause();
if (sensorManager != null) {
sensorManager.unregisterListener(sensorEventListener);
}
if (soundPool != null) {
soundPool.unload(soundId);
}
}
正文
MainActivity
package com.advance.yongliu.shakedemo;
import android.annotation.SuppressLint;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.os.Vibrator;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
/**
* @author Liu
* @date 2019/03/04
* @desc 搖一搖搶紅包
*/
public class MainActivity extends AppCompatActivity {
private SensorManager sensorManager;
private Vibrator vibrator;
private int soundId;
private SoundPool soundPool;
private Sensor accelerometerSensor;
private SensorEventListener sensorEventListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initSetting();
sensorShake();
}
/**
* 準備工作,獲取傳感器、震動服務、音頻播放
*/
private void initSetting() {
//獲取傳感器服務管理對象
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
assert sensorManager != null;
//獲取傳感器對象
accelerometerSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
//註冊傳感器監聽器
sensorManager.registerListener(sensorEventListener, accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL);
//震動服務對象
vibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
//音頻播放
soundPool = new SoundPool(1, AudioManager.STREAM_SYSTEM, 0);
soundId = soundPool.load(this, R.raw.red_packet, 1);
}
/**
* 傳感器震動、發聲
*/
private void sensorShake() {
//創建監聽器對象
//作爲一個標準值
//200:搖晃了200毫秒之後,開始震動
//500:震動持續的時間,震動持續了500毫秒。
sensorEventListener = new SensorEventListener() {
@SuppressLint("MissingPermission")
@Override
public void onSensorChanged(SensorEvent event) {
int type = event.sensor.getType();
if (type == Sensor.TYPE_ACCELEROMETER) {
float[] values = event.values;
float x = values[0];
float y = values[1];
float z = values[2];
//作爲一個標準值 最小低於 10 &最大值不超過 20
int coll = 16;
if (Math.abs(x) > coll | Math.abs(y) > coll | Math.abs(z) > coll) {
//200:搖晃了200毫秒之後,開始震動
//500:震動持續的時間,震動持續了500毫秒。
long[] pattern = {200, 2000};
vibrator.vibrate(pattern, -1);
//播放聲音
if (soundPool != null) {
soundPool.play(soundId, 1, 1, 1, 0, 1);
}
Toast.makeText(MainActivity.this, "搖一搖拆紅包", Toast.LENGTH_SHORT).show();
}
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
};
}
// 註冊傳感器監聽器
@Override
protected void onStart() {
super.onStart();
if (sensorManager != null) {
sensorManager.registerListener(sensorEventListener, accelerometerSensor, SensorManager.SENSOR_DELAY_NORMAL);
}
if (soundPool != null) {
soundPool.load(this, R.raw.red_packet, 1);
}
}
// 註銷傳感器監聽器
@Override
protected void onPause() {
super.onPause();
if (sensorManager != null) {
sensorManager.unregisterListener(sensorEventListener);
}
if (soundPool != null) {
soundPool.unload(soundId);
}
}
}