Có.
Sử dụng SensorEventListener.onSensorChanged(SensorEvent event)
bạn có thể xác định giá trị được cung cấp dọc theo trục X & Y. Bạn sẽ cần phải ghi lại các giá trị này và sau đó so sánh chúng với bất kỳ giá trị mới nào mà bạn nhận được trên các cuộc gọi tiếp theo theo phương thức onSensorChanged
để nhận giá trị delta. Nếu giá trị delta trên một trục là dương thì thiết bị đang di chuyển một chiều, nếu giá trị âm của nó di chuyển ngược lại.
Có thể bạn sẽ cần tinh chỉnh cả tốc độ mà tại đó bạn nhận được sự kiện gia tốc và ngưỡng mà bạn xem xét giá trị delta để biểu thị sự thay đổi hướng.
Dưới đây là một ví dụ mã nhanh chóng về những gì tôi đang nói về:.
public class AccelerometerExample extends Activity implements SensorEventListener {
TextView textView;
StringBuilder builder = new StringBuilder();
float [] history = new float[2];
String [] direction = {"NONE","NONE"};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
textView = new TextView(this);
setContentView(textView);
SensorManager manager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Sensor accelerometer = manager.getSensorList(Sensor.TYPE_ACCELEROMETER).get(0);
manager.registerListener(this, accelerometer, SensorManager.SENSOR_DELAY_GAME);
}
@Override
public void onSensorChanged(SensorEvent event) {
float xChange = history[0] - event.values[0];
float yChange = history[1] - event.values[1];
history[0] = event.values[0];
history[1] = event.values[1];
if (xChange > 2){
direction[0] = "LEFT";
}
else if (xChange < -2){
direction[0] = "RIGHT";
}
if (yChange > 2){
direction[1] = "DOWN";
}
else if (yChange < -2){
direction[1] = "UP";
}
builder.setLength(0);
builder.append("x: ");
builder.append(direction[0]);
builder.append(" y: ");
builder.append(direction[1]);
textView.setText(builder.toString());
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// nothing to do here
}
}
Mã này sẽ chỉ cung cấp cho bạn các hướng chung trên trục X và Y là điện thoại đã di chuyển trong Để cung cấp một xác định hướng tốt hơn (ví dụ như cố gắng bắt chước chuyển động của chuột máy tính), bạn có thể thấy rằng gia tốc của điện thoại không phù hợp với mục đích. Để thử điều này, trước tiên tôi sẽ đặt độ trễ của cảm biến thành SensorManager.SENSOR_DELAY_FAST
và tạo danh sách nhiều sự kiện lịch sử để tôi có thể phát hiện chuyển động theo thời gian và không bị ảnh hưởng bởi chuyển động nhỏ theo hướng ngược lại thường xảy ra khi dùng gia tốc kế phép đo ở mức phạt tiền như vậy. Bạn cũng sẽ cần phải đo lượng thời gian đã trôi qua để giúp tính toán số đo chính xác của chuyển động như được đề xuất trong nhận xét của bạn.
Một số bài đăng về gia tốc kế: http://www.anddev.org/advanced-tutorials-f21/accessing-the-accelerometer-t499.html#p1987 http://developer.android.com/reference/android/hardware /SensorEvent.html#values – Niko