我要开始摇一摇了

来源:互联网 发布:有关数据库的参考文献 编辑:程序博客网 时间:2024/05/29 14:52

博客一:

package com.example.testcamera;


import Android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.SystemClock;


/**
 * @author Ranger
 * 摇动类
 *
 */
public class Shaker {

    /**
     * 传感器管理
     */
    private SensorManager mgr = null;
    
    /**
     *最后摇动的时间 
     */
    private long lastShakeTimestamp = 0;
    
    /**
     * 偏移量设置
     */
    private double threshold = 1.0d;
    
    /**
     * 摇动的时间间隔设置
     */
    private long gap = 0;
    
    /**
     * 回调
     */
    private Shaker.Callback cb = null;
    
    /**
     * 变量控制,防止多次启动
     */
    private boolean mPause = false;


    /**
     * 传感器类
     * @param ctxt 上下文
     * @param threshold 偏移量
     * @param gap 传感器的时间
     * @param cb 回调方法
     */
    public Shaker(Context ctxt, double threshold, long gap,
            Shaker.Callback cb) {
        this.threshold = threshold * threshold;
        this.threshold = this.threshold
                * SensorManager.GRAVITY_EARTH
                * SensorManager.GRAVITY_EARTH;
        this.gap = gap;
        this.cb = cb;
        //注册传感器
        mgr = (SensorManager) ctxt.getSystemService(Context.SENSOR_SERVICE);
        //注册传感器的监听事件
        mgr.registerListener(listener,
                mgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
                SensorManager.SENSOR_DELAY_UI);
    }


    public void close() {
        mgr.unregisterListener(listener);
    }


    private void isShaking() {
        long now = SystemClock.uptimeMillis();


        if (lastShakeTimestamp == 0) {
            lastShakeTimestamp = now;


            if (cb != null) {
                cb.shakingStarted();
            }
        }
        else {
            lastShakeTimestamp = now;
        }
    }


    private void isNotShaking() {
        long now = SystemClock.uptimeMillis();




        if (lastShakeTimestamp > 0) {
            if (now - lastShakeTimestamp > gap) {
                lastShakeTimestamp = 0;


                if (cb != null) {
                    cb.shakingStopped();
                }
            }
        }
    }


    public interface Callback {
        void shakingStarted();


        void shakingStopped();
    }


    private SensorEventListener listener = new SensorEventListener() {
        public void onSensorChanged(SensorEvent e) {
            if (e.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
                double netForce = e.values[0] * e.values[0];


                netForce += e.values[1] * e.values[1];
                netForce += e.values[2] * e.values[2];
                //偏移量,X^2 + Y^2 + Z^2 与最大的偏移量threshold相比,如果超过就作为在摇动
                if ((threshold < netForce) && !mPause) {
                    isShaking();
                }
                else {
                    isNotShaking();
                }
            }
        }


        public void onAccuracyChanged(Sensor sensor, int accuracy) {
            // unused
        }
    };


    public void resume() {
        mPause = false;


    }


    public void pause() {
        mPause = true;
    }

}



调用方式为:

//创建摇动对象
shaker = new Shaker(this, 1.25d, 500, this);

 

 @Override
 protected void onResume() {
  super.onResume();
  shaker.resume();
 }

 @Override
 public void shakingStarted() {
  Log.e("ShakerDemo", "Shaking started!");
  shaker.pause();
  Toast.makeText(getApplicationContext(), "正在启动相机,请稍候……",
    Toast.LENGTH_LONG).show();

 }


 

实例代码地址为:http://download.csdn.net/detail/ajun495175289/5654559

博客二:

  自从微信里的摇一摇功能为大家所熟知了以后,似乎摇一摇已经成了移动应用不可缺少的功能,不管什么类型的应用,只有加上了摇一摇才显得足够时尚。其实对于一款产品而言,我们真正应该关注的是用户需要什么,而不是很主观地去强迫用户适应这种看似很杀手级的功能。要知道,在用户的手机里,你只是众多应用中的一个而已,下一秒钟用户会选择谁,我们都不知道。好了,闲话少叙,我们都知道摇一摇是充分发挥了手机的硬件优势,即传感器。在安卓中和 Notofication类似,我们有SensorManager和Sensor两个类供我们使用。先来说一下,摇一摇的原理。摇一摇的原理是基于手机里的加速度传感器,当用户摇晃手机时,在X、Y、Z三个方向的加速度会发生变化。其中,X方向值的大小代表手机水平移动,Y方向值的大小代表手机垂直移动,Z方向值的大小代表手机的空间垂直方向,天空的方向为正,地球的方向为负,然后把相关的加速度值传输给操作系统,通过判断其大小变化,就能判断用户是否摇晃手机啦。对于Android而言,其本身就提供了很好的API接口,因设备而已,实际使用时,用户手机中可能并没有这样的传感器,所以对于 Android开发而言,绝对不能想当然地认为程序写对了就一定没什么问题啦(真心不想吐槽Android的屏幕、各种因为被阉割而形同虚设的API)。 Android中开发传感器相关的应用,必须实现SensorEventListener接口。下面我们以一个例子来展示这个接口的实现:

 package com.Android.Shake2Shake;            import android.content.Context;      import android.hardware.Sensor;      import android.hardware.SensorEvent;      import android.hardware.SensorEventListener;      import android.hardware.SensorManager;      import android.widget.Toast;                        public class ShakeHelper implements SensorEventListener      {         private Context mContext;         //传感器管理器         private SensorManager mSensorManager;         //传感器         private Sensor mSensor;         //速度阀值         private int mSpeed=3000;         //时间间隔         private int mInterval=50;         //上一次摇晃的时间         private long LastTime;         //上一次的x、y、z坐标         private float LastX,LastY,LastZ;         public ShakeHelper(Context mContext)         {             this.mContext=mContext;             Start();         }                  public void Start()         {             mSensorManager=(SensorManager)mContext.getSystemService(Context.SENSOR_SERVICE);             if(mSensorManager!=null)             {                 mSensor=mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);             }             if(mSensor!=null)             {                 mSensorManager.registerListener(this, mSensor,SensorManager.SENSOR_DELAY_GAME);             }         }               public void Stop()         {             mSensorManager.unregisterListener(this);         }                  @Override         public void onAccuracyChanged(Sensor arg0, int arg1)          {                    }               @Override         public void onSensorChanged(SensorEvent Event)          {            long NowTime=System.currentTimeMillis();            if((NowTime-LastTime)<mInterval)            return;            //将NowTime赋给LastTime            LastTime=NowTime;            //获取x,y,z            float NowX=Event.values[0];            float NowY=Event.values[1];            float NowZ=Event.values[2];            //计算x,y,z变化量            float DeltaX=NowX-LastX;            float DeltaY=NowY-LastY;            float DeltaZ=NowZ-LastZ;            //赋值            LastX=NowX;            LastY=NowY;            LastZ=NowZ;            //计算            double NowSpeed = Math.sqrt(DeltaX * DeltaX + DeltaY * DeltaY + DeltaZ * DeltaZ)/mInterval * 10000;            //判断            if(NowSpeed>=mSpeed)            {                Toast.makeText(mContext, "你摇晃了手机!", Toast.LENGTH_SHORT).show();            }         }      }  


0 0
原创粉丝点击