版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_20451879/article/details/88124192
此篇因是传感器相关的功能,故无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);
}
}
}