Android实现摇一摇功能

都是一些简单的代码

布局:

<?xml version="1.0" encoding="utf-8"?>


    

代码:

package main.beini.com.shakeapp;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
   private ShakeListener mShakeListener = null;

   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);
      mShakeListener = new ShakeListener(this);
      mShakeListener.setOnShakeListener(new shakeLitener());
   }

   @Override
   protected void onDestroy() {
      super.onDestroy();
      mShakeListener.stop();
   }

   private class shakeLitener implements ShakeListener.OnShakeListener {

      @Override
      public void onShake() {
//       Animation.startAnim(GamesActivity.this, findViewById(R.id.game_bg_2), findViewById(R.id.game_bg_3));
         Toast.makeText(MainActivity.this, "摇一摇", Toast.LENGTH_SHORT).show();
      }
   }
}


package main.beini.com.shakeapp;

import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;

public class ShakeListener implements SensorEventListener {
    String TAG = "ShakeListener";
    // 速度阈值,当摇晃速度达到这值后产生作用  
    private static final int SPEED_SHRESHOLD = 5000;
    // 两次检测的时间间隔  
    private static final int UPTATE_INTERVAL_TIME = 70; 
    // 传感器管理器  
    private SensorManager sensorManager;
    // 传感器  
    private Sensor sensor;
    // 重力感应监听器  
    private OnShakeListener onShakeListener; 
    // 上下文  
    private Context mContext;
    // 手机上一个位置时重力感应坐标  
    private float lastX; 
    private float lastY; 
    private float lastZ; 
    // 上次检测时间  
    private long lastUpdateTime; 
    // 构造器  
    public ShakeListener(Context c) {
     // 获得监听对象  
     mContext = c; 
     start(); 
    } 
    // 开始  
    public void start() { 
     // 获得传感器管理器  
     sensorManager = (SensorManager) mContext.getSystemService(Context.SENSOR_SERVICE);
     if (sensorManager != null) { 
      // 获得重力传感器  
      sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
     } 
     // 注册  
     if (sensor != null) { 
      sensorManager.registerListener(this, sensor, 
      SensorManager.SENSOR_DELAY_GAME);
     } 
    } 
    // 停止检测  
    public void stop() { 
     sensorManager.unregisterListener(this); 
    } 
    // 设置重力感应监听器  
    public void setOnShakeListener(OnShakeListener listener) { 
     onShakeListener = listener; 
    } 
    // 重力感应器感应获得变化数据  
    public void onSensorChanged(SensorEvent event) {
        // 现在检测时间  
        long currentUpdateTime = System.currentTimeMillis();
        // 两次检测的时间间隔  
        long timeInterval = currentUpdateTime - lastUpdateTime; 
        // 判断是否达到了检测时间间隔  
        if (timeInterval < UPTATE_INTERVAL_TIME) 
         return; 
        // 现在的时间变成last时间  
        lastUpdateTime = currentUpdateTime; 
        // 获得x,y,z坐标  
        float x = event.values[0]; 
        float y = event.values[1]; 
        float z = event.values[2]; 
        // 获得x,y,z的变化值  
        float deltaX = x - lastX; 
        float deltaY = y - lastY; 
        float deltaZ = z - lastZ; 
        // 将现在的坐标变成last坐标  
        lastX = x; 
        lastY = y; 
        lastZ = z; 
        double speed = Math.sqrt(deltaX * deltaX + deltaY * deltaY + deltaZ
        * deltaZ) / timeInterval * 10000;


           // 达到速度阀值,发出提示  
           if (speed >= SPEED_SHRESHOLD) { 
            onShakeListener.onShake(); 
           } 
    } 
       
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    } 
    // 摇晃监听接口  
    public interface OnShakeListener { 
     public void onShake(); 
    } 

}
展开阅读全文

页面更新:2024-04-18

标签:阈值   监听器   感应器   上下文   重力   管理器   坐标   间隔   传感器   感应   布局   接口   速度   代码   功能   时间   数码

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top