项目中实现摇一摇功能

安卓手机监听手机是否摇动的功能,也就是类似于微信摇一摇功能.一看好像感觉挺厉害挺难得一个功能一样,实则不然,我们知道每个安卓手机都有传感器在里面,可以监听到手机的状态.我们说的摇一摇监听,该功能就需要用到传感器.

用到比较核心的几个类:

SensorEventListener:传感器的监听器.

SensorManager:传感器的管理器.

Sensor:传感器.

我们都知道一般获取某个管理器都是contexnt.getSystemService()调用系统的服务的方法.所以我们获取传感器的管理器的方法就是

mSensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);

然后通过传感器管理者获取传感器对象.

mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);

然后把传感器管理者和传感器绑定在一起,也就是注册的意思.

mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);

该方法第一个参数就为SensorEventListener,第二个参数是传感器Sensor,第三个参数就是一个常量.

然后实现监听器中的抽象方法:

@Override
    public void onSensorChanged(SensorEvent Event) {
        //防止频繁调用
        if ((System.currentTimeMillis() - LastTime) < mInterval) {
            return;
        }
        LastTime = System.currentTimeMillis();
        //获取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) {
            //判断当前做了摇一摇的操作,做对应的逻辑处理
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }

在判断中作出对应的逻辑就行了.

贴上全部代码:

public class MainActivity extends AppCompatActivity implements SensorEventListener {
    //传感器管理者
    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;
    MyDialog myDialog;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mSensorManager = (SensorManager) this.getSystemService(Context.SENSOR_SERVICE);
        mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
        mSensorManager.registerListener(this, mSensor, SensorManager.SENSOR_DELAY_GAME);
        myDialog = new MyDialog(this);
    }

    @Override
    public void onSensorChanged(SensorEvent Event) {
        //防止频繁调用
        if ((System.currentTimeMillis() - LastTime) < mInterval) {
            return;
        }
        LastTime = System.currentTimeMillis();
        //获取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) {
            //判断当前做了摇一摇的操作,做对应的逻辑处理
            if (myDialog != null && !myDialog.isShowing()) {
                myDialog.show();
            }
        }
    }

    @Override
    public void onAccuracyChanged(Sensor sensor, int accuracy) {

    }
}

以上就是全部代码.我在摇动手机后弹出一个dialog.

猜你喜欢

转载自blog.csdn.net/qq77485042/article/details/88030659