揺れと言えば、WeChatの揺れ機能を思い浮かべるかもしれません。その後、多くのアプリもShakeの関連機能に従いました。ここでは、シェイクでそれを行う方法を紹介します。
ステップ1:SensorManagerオブジェクトを宣言する
ステップ2:ActivityのonResumeメソッドを書き直し、このメソッドにセンサー監視イベントを登録し、監視するセンサーのタイプを指定します。
ステップ3:ActivityのonPauseメソッドを書き直し、このメソッドでセンサーイベントをログアウトします
手順4:SensorEventListenerを継承し、onSensorChangedメソッドとonAccuracyChangedメソッドを実装する必要があるセンサーイベントリスナーを作成します。その中で、前者の方法はセンシング情報が変化したときにトリガーされ、ビジネスロジックはここで処理されます。後者の方法は経度が変化したときにトリガーされ、通常は処理する必要はありません。
コード例
権限を追加する
<uses-permission android:name="android.permission.VIBRATE"/>
MainActivity.java
public class MainActivity extends BaseActivity implements SensorEventListener {
private TextView tv_sensor;
private SensorManager mSensorMgr;//声明一个传感管理器对象
private Vibrator mVibrator;//声明一个震动器对象
@Override
protected MvcBaseModel getModelImp() {
return null;
}
@Override
protected int getContentLayoutId() {
return R.layout.activity_main;
}
@Override
protected void initWidget() {
tv_sensor = findViewById(R.id.tv_sensor);
//从系统服务中获取传感管理器对象
mSensorMgr = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
//从系统服务中获取振动器对象
mVibrator = (Vibrator) getSystemService(Context.VIBRATOR_SERVICE);
}
@Override
protected void onPause() {
super.onPause();
mSensorMgr.unregisterListener(this);
}
@Override
protected void onResume() {
super.onResume();
mSensorMgr.registerListener(this
,mSensorMgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER)
,SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){//加速度变更事件
//value[0]:X轴,value[1]:Y轴,values[2]:Z轴
float[] values = event.values;
if ((Math.abs(values[0])>15) || Math.abs(values[1])>15 || Math.abs(values[2])>15){
tv_sensor.setText("恭喜您摇一摇了"+System.currentTimeMillis());
//系统检测摇一摇事件后,震动手机提示用户
mVibrator.vibrate(500);
}
}
}
//当传感器精度改变时回调该方法,一般无需处理
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
実際の使用では、システムを振った後、システムに複数のコールバックの問題があることがわかりました。ここでロックして、応答後に応答しなくなります。3秒後に応答を続けます。これにより、関連する操作を1回だけ実行するという目的を達成できます。