Android进阶之路 - 摇一摇抢红包(震动+音效)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_20451879/article/details/88124192