Android進階之路 - 搖一搖搶紅包(震動+音效)

此篇因是傳感器相關的功能,故無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);
        }
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章