手機搖一搖 功能
阿新 • • 發佈:2019-02-07
原理:手機系統有感測器,呼叫手機感測器,並讓手機振動
public abstract class ShakeListener implements SensorEventListener{ private int duration = 100;//取樣時間間隔 private long lastTime; private float lastPointX;//上一個點的x軸的加速度資訊 private float lastPointY; private float lastPointZ; private float shake;//單次增量 private float totalShake;//總增量 private float swithValue = 100;//判斷是否搖晃手機的最大值 public ShakeListener(){ init(); } private void init(){ lastTime = 0; lastPointX = 0; lastPointY = 0; lastPointZ = 0; shake = 0; totalShake = 0; } @Override public void onSensorChanged(SensorEvent event) { if(lastTime == 0){ lastTime= System.currentTimeMillis(); lastPointX = event.values[SensorManager.DATA_X]; lastPointY = event.values[SensorManager.DATA_Y]; lastPointZ = event.values[SensorManager.DATA_Z]; }else{ long currentTime = System.currentTimeMillis(); if(currentTime - lastTime > duration){ //第二個點float x = event.values[SensorManager.DATA_X]; float y = event.values[SensorManager.DATA_Y]; float z = event.values[SensorManager.DATA_Z]; //每次傳入的資料都存在微小的變動 float dx = Math.abs(x - lastPointX); float dy = Math.abs(y - lastPointY); float dz = Math.abs(z - lastPointZ); if(dx < 1){ dx = 0; } if(dy < 1){ dy = 0; } if(dz <1){ dz = 0; } shake = dx + dy + dz; if(shake == 0){ //處於靜止狀態 init(); } totalShake += shake; if(totalShake > swithValue){ //說明是在搖晃手機 //機選一注彩票,並且有震動 shakeCrateLottery(); init(); }else{ lastTime = System.currentTimeMillis(); lastPointX = event.values[SensorManager.DATA_X]; lastPointY = event.values[SensorManager.DATA_Y]; lastPointZ = event.values[SensorManager.DATA_Z]; } } } } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } public abstract void shakeCrateLottery(); }