2014-11-24 16 views
7

Tôi cần một cái gì đó rất đơn giản, nhưng tôi không thể tìm thấy một ví dụ phù hợp để học hỏi. Mục đích duy nhất của tôi là:Xoay và hiển thị ở độ


Khi thiết bị được đặt phẳng (trên lưng) trên bàn, nó sẽ hiển thị 0 (hoặc gần 0) cho trục X và Y. Khi tôi nhấc nó lên từ phần trên cùng (nơi có loa) và phần dưới (vị trí của micrô) được đặt xuống - nó sẽ cho tôi biết có bao nhiêu độ nghiêng điện thoại. Mô tả toán học - hiển thị theo độ góc giữa mặt sau của điện thoại và bảng, đối với một trong các trục. Khi tôi nhấc phần dưới lên (và phần trên vẫn nằm xuống) thì hiển thị độ âm.

Điều tương tự cũng xảy ra với trục kia - xoay điện thoại quanh các cạnh dài của nó.


Tôi đã thử lắp ráp một ứng dụng từ các ví dụ khác nhau, sử dụng con quay hồi chuyển hoặc cảm biến gia tốc quay hoặc xoay vector, nhưng không thể đi kèm với một thứ hoạt động đúng cách.

Ai đó có thể cho tôi một ví dụ về chức năng onSensorChanged (vì tất cả công việc đang diễn ra ở đây) và chỉ cho tôi biết cảm biến nào được sử dụng, vì vậy tôi biết phải đăng ký cái gì?

Trả lời

13

Có một vài ví dụ và hướng dẫn trên web, nhưng hãy cẩn thận. Sensor.TYPE_ORIENTATION không được chấp nhận. Bạn cần tính toán phép quay bằng cách nghe hai cảm biến này Sensor.TYPE_ACCELEROMETERSensor.TYPE_MAGNETIC_FIELD.

Phần khó khăn sau khi đăng ký để nhận thông báo từ các cảm biến này, là tìm ra cách xử lý dữ liệu nhận được từ chúng. Phần quan trọng là những điều sau đây:

public void onSensorChanged(SensorEvent event) { 
    if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) 
     mGravity = event.values; 

    if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) 
     mGeomagnetic = event.values; 

    if (mGravity != null && mGeomagnetic != null) { 
     float R[] = new float[9]; 
     float I[] = new float[9]; 

     boolean success = SensorManager.getRotationMatrix(R, I, mGravity, mGeomagnetic); 
     if (success) { 
      float orientation[] = new float[3]; 
      SensorManager.getOrientation(R, orientation); 
      azimut = orientation[0]; // orientation contains: azimut, pitch and roll 
      pitch = orientation[1]; 
      roll = orientation[2]; 
     } 
    } 
} 

Đây là cách bạn nên tính toán góc phương vị, sân, các giá trị cuộn của điện thoại trong onSensorChanged(SensorEvent event) gọi lại. Hãy nhớ rằng "Tất cả ba góc trên đều ở radian và dương theo hướng ngược chiều kim đồng hồ". Bạn chỉ có thể chuyển đổi chúng thành các độ có Math.toDegrees()

Như Louis CAD đã nêu trong các nhận xét, bạn nên di chuyển khởi tạo I, R và mảng định hướng ra khỏi cuộc gọi onSensorChanged, vì nó được gọi thường xuyên . Tạo và sau đó bỏ chúng lại cho GC là xấu cho hiệu suất ứng dụng của bạn. Tôi để nó ở đó vì mục đích đơn giản.

Dựa trên cách xoay thiết bị của bạn, bạn có thể cần phải remap tọa độ để có được kết quả mong muốn. Bạn có thể đọc thêm về remapCoordinateSystem và cũng về getRotationMatrixgetOrientation trong mã android documentation

Ví dụ: http://www.codingforandroid.com/2011/01/using-orientation-sensors-simple.html

+0

Hi Csaba, tôi theo gương của bạn và nó mang lại giá trị rất đáng tin cậy, nhưng tôi muốn có được những giá trị dương theo chiều kim đồng hồ là có thể? Tôi cần thay đổi gì đối với mã hiện tại của bạn? –

+0

@ParagKadam Tôi đoán bạn chỉ cần trừ độ ngược chiều kim đồng hồ từ 360 và bạn nhận được mức độ theo chiều kim đồng hồ như sau: 'float clockwise = 360 - counterClockwise;' Vì vậy, nếu giá trị ngược chiều kim đồng hồ là 15, thì theo chiều kim đồng hồ Giá trị là 345. –

+0

Vâng chính xác ... cảm ơn rất nhiều cho điều đó :) –

0

Tạo file layouts.xml trong các thư mục res/values-landres/values-port với nội dung sau:

res/values-land/layouts.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <bool name="is_landscape">true</bool> 
</resources> 

res/values-port/layouts.xml:

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <bool name="is_landscape">false</bool> 
</resources> 

Trong mã nguồn của bạn bây giờ bạn có thể truy cập các hướng hiện như sau:

context.getResources().getBoolean(R.bool.is_landscape) 
Các vấn đề liên quan