加速度計
加速度センサーはGセンサーとも呼ばれ、x、y、z軸の加速度値を返します。
この値には重力の影響が含まれており、単位はm/s^2です。
携帯電話をテーブルの上に平らに置くと、X 軸のデフォルトは 0、Y 軸のデフォルトは 0、Z 軸のデフォルトは 9.81 になります (地球の固有の重力のため)。
電話機を裏向きにして、Z 軸が -9.81 のテーブルに置きます。
電話機を左に傾けると、X 軸が正になります。
電話機を右に傾けると、X 軸が負になります。
電話機を上に傾けると、Y 軸が負になります。
携帯電話を下に傾けると、Y 軸が正になります。
Android 加速度センサーのタイプは Sensor.TYPE_ACCELEROMETER です。
android.hardware.SensorEvent を通じて加速度センサーの値を返します。
加速度センサーは携帯電話で広く使われており、開発プロセスも非常に簡単です(値を取得するのは非常に簡単です。特定の機能を実現したい場合でも、追加する方法を考える必要があります)判定。)
栗を取る: 電話を振る機能:
これは比較的単純な判定です x,y,zの値を取得した後、この3つの値を判定します 携帯電話を振るとこれらの値は必ず変化します 閾値を設定します それらの値が判定されたとき数値の後に一定の Shake を超えると、コード実装で理解しやすくなります
携帯電話シェイク機能の実現
@Override
public void onSensorChanged(SensorEvent event) {
// 传感器返回的数据
float x=event.values[0];
float y=event.values[1];
float z=event.values[2];
StringBuffer buffer = new StringBuffer();
buffer.append("X方向的加速度为:").append(String.format("%.2f", x)).append("\n");
buffer.append("Y方向的加速度为:").append(String.format("%.2f", y)).append("\n");
buffer.append("Z方向的加速度为:").append(String.format("%.2f", z)).append("\n");
if (x>20||y>20||z>20){
Toast.makeText(AccelerometerActivity.this,"欢迎使用摇一摇",Toast.LENGTH_SHORT).show();
}
mTvAccelerometer.setText(buffer);
}
上記のコードからもわかるように、x、y、zの値を変えることで比較的簡単に携帯電話が振られたかどうかを判断することができます。携帯電話は振られていますが、1 つの点は無視されます。つまり、ユーザーは一方向に電話を振ってトリガーをトリガーすることもできます。最善のことは、zy のみを判断することであり、判断された xy は同時に 20 を超える必要があります震えていると識別される場合、以下は修正されたコードです
if (x>20&&y>20){
Toast.makeText(AccelerometerActivity.this,"欢迎使用摇一摇",Toast.LENGTH_SHORT).show();
}
手を上げて画面をオンにします
振るよりも複雑な機能もあります。手を上げると画面が明るくなります。これも xyz を判定するためなのでコードはここには載せません。簡単にアイデアについて話しましょう。電話を取ると、加速度センサーxyz 値は必ず変化しますので、その最終値を判断することができます。これは、携帯電話を顔に向けたときのセンサーの値(x:0、y:8、頭を下げたとき)です。携帯電話、z: 5)、この値を判断でき、携帯電話が 200 ミリ秒以内にこの値に達した場合、手を挙げて画面をオンにしたとみなされます。
コード部分
以下は加速度センサーの値を取得し、携帯電話を振るコードです。
public class AccelerometerActivity extends AppCompatActivity implements SensorEventListener {
private TextView mTvAccelerometer;
private SensorManager sensorManager;
private Sensor sensor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_accelerometer);
mTvAccelerometer = findViewById(R.id.tv_accelerometer);
// 获取传感器管理者对象
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// 获取加速度传感器对象
sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
}
@Override
protected void onResume() {
super.onResume();
if (sensorManager!=null){
// 添加监听器
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_UI);
}
}
@Override
protected void onPause() {
super.onPause();
if(sensorManager != null){
//解除注册
sensorManager.unregisterListener(this,sensor);
}
}
@Override
public void onSensorChanged(SensorEvent event) {
// 传感器返回的数据
float x=event.values[0];
float y=event.values[1];
float z=event.values[2];
StringBuffer buffer = new StringBuffer();
buffer.append("X方向的加速度为:").append(String.format("%.2f", x)).append("\n");
buffer.append("Y方向的加速度为:").append(String.format("%.2f", y)).append("\n");
buffer.append("Z方向的加速度为:").append(String.format("%.2f", z)).append("\n");
if (x>20&&y>20){
Toast.makeText(AccelerometerActivity.this,"欢迎",Toast.LENGTH_SHORT).show();
}
mTvAccelerometer.setText(buffer);
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
}
携帯電話センサーの使用方法の詳細については、「Android のセンサー (合計)」を参照してください。