zoukankan      html  css  js  c++  java
  • android 摇一摇功能的实现

    将这个功能封装成了一个类,这样今后方便调用

    package com.bobo.myyaoyiyaotest;
    
    import android.R.bool;
    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 UPTATE_INTERVAL_TIME = 300;
        // 传感器管理器
        private SensorManager sensorManager;
        // 传感器
        private Sensor sensor;
        // 重力感应监听器
        private OnShakeListener onShakeListener;
        // 上下文
        private Context mContext;
        // 手机上一个位置时重力感应坐标
        private float[] lastValues = { 0, 0, 0 };
        private float[] curValues = { 0, 0, 0 };
    
        // 上次检测时间
        private long lastUpdateTime;
        private long curUpdateTime;
    
        // 构造器
        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;
        }
    
        private boolean isShake = false;
    
        // 重力感应器感应获得变化数据
        public void onSensorChanged(SensorEvent event) {
            // 现在检测时间
            curUpdateTime = System.currentTimeMillis();
            curValues = event.values;
            // 两次检测的时间间隔
            long timeInterval = curUpdateTime - lastUpdateTime;
            // 判断是否达到了检测时间间隔
            if (timeInterval < UPTATE_INTERVAL_TIME)
                return;
            isShake = false;
            lastUpdateTime = curUpdateTime;
            // 现在的时间变成last时间
            if (!isShake && (curValues[0] - lastValues[1] > 20)) {
                isShake = true;
                onShakeListener.onShake();
            }
            lastValues = curValues;
        }
    
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    
        // 摇晃监听接口
        public interface OnShakeListener {
            public void onShake();
        }
    }

    注意这里面定义了一个OnShakeListener的接口,可以在调用的方法中,实现该接口,利用setOShakeListener方法赋予其即可。

    package com.bobo.myyaoyiyaotest;
    
    import com.bobo.myyaoyiyaotest.ShakeListener.OnShakeListener;
    
    import android.os.Bundle;
    import android.os.Vibrator;
    import android.app.Activity;
    import android.view.Menu;
    
    public class MainActivity extends Activity {
        private Vibrator mVibrator = null;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Vibrator vibrator=(Vibrator)getSystemService(VIBRATOR_SERVICE);
            ShakeListener listener=new ShakeListener(this);
            listener.setOnShakeListener(new OnShakeListener() {
                
                @Override
                public void onShake() {
                        //这里仅仅需要执行摇一摇之后的操作即可。
                    mVibrator.vibrate(new long[]{10,1000}, -1);
                }
            });
            
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.activity_main, menu);
            return true;
        }
    
    }

    这种耦合,以及回调的思想可谓极好
  • 相关阅读:
    职场篇:聚焦与复盘
    职场篇:直面情绪杀手【已补更】
    .NetCore实践篇:成功解决分布式监控ZipKin聚合依赖问题(三)
    职场篇:为何我们需要思想大洗礼?
    职场篇:从温水煮青蛙说起
    .NetCore实践篇:分布式监控系统zipkin踩坑之路(二)
    postman application/json;
    yapi 个人空间 这个分组的问题
    yapi 的分组的理解!
    yapi的安装
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/3419561.html
Copyright © 2011-2022 走看看