Acelerômetro
O sensor de aceleração também é chamado de sensor G, que retorna os valores de aceleração dos eixos x, y e z.
Este valor inclui a influência da gravidade e a unidade é m/s^2.
Coloque o telefone sobre a mesa, o padrão do eixo x é 0, o padrão do eixo y é 0 e o padrão do eixo z é 9,81 (devido à gravidade inerente da Terra).
Coloque o telefone voltado para baixo em uma mesa com eixo z de -9,81.
Incline o telefone para a esquerda e o eixo x será positivo.
Incline o telefone para a direita e o eixo x será negativo.
Incline o telefone para cima e o eixo y será negativo.
Incline o telefone para baixo e o eixo y será positivo.
O tipo de acelerômetro Android é Sensor.TYPE_ACCELEROMETER
Retorne o valor do sensor de aceleração por meio de android.hardware.SensorEvent.
O sensor de aceleração é amplamente utilizado em telefones celulares e também é muito simples no processo de desenvolvimento (é realmente muito simples obter o valor. Se você deseja realizar uma determinada função, ainda precisa pensar em como adicionar julgamento.)
Pegue uma castanha: a função de sacudir o telefone:
Este é um julgamento relativamente simples. Depois de obter os valores de x, y e z, julgue esses três valores. Se você agitar o telefone, esses valores definitivamente mudarão. Definimos um limite. Quando seus valores exceder um determinado Shake após um número, é mais fácil de entender com a implementação do código
Realização da função de vibração do telefone móvel
@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);
}
Como pode ser visto no código acima, é relativamente simples avaliar se o celular foi sacudido ou não alterando os valores de x, y e z. Não importa qual valor exceda 20, considera-se que o O telefone foi sacudido, mas um ponto é ignorado, ou seja, o usuário também pode acionar o gatilho agitando o telefone em uma direção. O melhor é julgar apenas zy, e o xy julgado deve ultrapassar ao mesmo tempo 20 pode ser identificado como tremor, o seguinte é o código modificado
if (x>20&&y>20){
Toast.makeText(AccelerometerActivity.this,"欢迎使用摇一摇",Toast.LENGTH_SHORT).show();
}
Levante a mão para ligar a tela
Há também uma função mais complicada do que sacudi-la: levante a mão para iluminar a tela. Isso também é para julgar xyz, então não vou colocar o código aqui. Vamos falar brevemente sobre a ideia. Quando atendermos o telefone, o sensor de aceleração xyz O valor definitivamente mudará, e podemos julgar seu valor final, que é qual é o valor do sensor quando o celular está voltado para o nosso rosto (x:0, y:8, quando abaixo minha cabeça para o celular, z: 5), podemos julgar esse valor, e se o celular atingir esse valor em 200ms, será considerado que levantou a mão para ligar a tela
parte do código
A seguir está o código para obter o valor do sensor de aceleração e agitar o telefone
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) {
}
}
Para obter mais uso de sensores de telefones celulares, consulte Sensores no Android (total)