1. 程式人生 > >手機搖一搖 功能

手機搖一搖 功能

原理:手機系統有感測器,呼叫手機感測器,並讓手機振動

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(); }