5

Mô tảhướng màn hình Android khác nhau giữa các thiết bị

Tôi có một hoạt động mà hiển thị xem trước camera trên một cái nhìn bề mặt. Tôi không muốn nó được khởi động lại trên các thay đổi định hướng (vì nó liên tục quét mã QR), do đó hướng được khóa theo chiều dọc.

Sự cố tôi gặp phải là tôi cần hiển thị hướng dẫn trên màn hình cho người dùng ở cuối màn hình. Do màn hình bị khóa theo một hướng, tôi không được thông báo về hướng mới khi hoạt động không được vẽ lại. Do đó, các hướng dẫn được hiển thị ở cùng một vị trí bất kể điện thoại ở chân dung, quay ngược chân dung, phong cảnh hay cảnh quan được tôn kính.

Để giải quyết vấn đề này, tôi đã kết nối với trình quản lý cảm biến để đọc theo hướng trong thời gian thực. (Xem mã bên dưới) Sau khi đọc nó, tôi tự định hướng và di chuyển các hướng dẫn của mình theo yêu cầu khi mỗi bản cập nhật được gửi cho tôi. Điều này đã làm việc cho tôi cho đến thời gian gần đây. Khi thử nghiệm trên máy tính bảng Asus Transformer Prime và Xoom. Máy tính bảng sẽ trả về hướng "90" cho ảnh chân dung, thay vì "0" như 2 điện thoại khác của tôi. Vì vậy, như bạn có thể thấy trong đoạn code dưới đây, tôi kiểm tra cho máy tính bảng (màn hình lớn) và trừ đi thêm 90 độ.

Vấn đề

Vấn đề là mới Nexus 7 tablet không có thiên vị thêm này. Trong bức chân dung nó trả về "0", nhưng tôi phát hiện nó như một máy tính bảng, do đó, trừ 90 độ do đó kết quả là 270 và nó đặt hướng dẫn của tôi như thể máy tính bảng đang ở chế độ phong cảnh. Tôi cho rằng lý do đằng sau điều này là Xoom/Transformer được thiết kế để sử dụng trong cảnh quan và Nexus ở chế độ chân dung, nhưng trừ khi tôi biết về tất cả các thiết bị bị ảnh hưởng thì điều này không có tác dụng.

Câu hỏi

Có một cách đáng tin cậy để phát hiện các định hướng trên tất cả các thiết bị và trả lại kết quả trong "thời gian thực", như trong đoạn code dưới đây, nhưng có tính đến accoutn định hướng mặc định của thiết bị (ví dụ: Điện thoại + Nexus 7 là chân dung, nhưng hầu hết các máy tính bảng đều nằm ngang)?

Mã hiện tại

boolean large = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == Configuration.SCREENLAYOUT_SIZE_LARGE); 
    boolean xlarge = ((getBaseContext().getResources().getConfiguration().screenLayout & Configuration.SCREENLAYOUT_SIZE_MASK) == 4);  
    isTablet = large || xlarge; 
    myOrientationEventListener = new OrientationEventListener(getBaseContext(), SensorManager.SENSOR_DELAY_NORMAL) 
    { 

     @Override 
     public void onOrientationChanged(int orientation) 
     { 
      if (orientation == -1) 
      { 
       return; 
      } 

      if (isTablet) 
      { 
       orientation += -90; 
       if (orientation < 0) // keep the result between 0-360 
       { 
        orientation += 360; 
       } 
      } 

      // Work out the orientation 

      if (orientation >= 60 && orientation <= 140) 
      { 
       screenOrientation = ScreenOrientation.Landscape_Reversed; 
      } 
      else if (orientation >= 140 && orientation <= 220) 
      { 
       screenOrientation = ScreenOrientation.Portrait_Reversed; 
      } 
      else if (orientation >= 220 && orientation <= 300) 
      { 
       screenOrientation = ScreenOrientation.Landscape; 
      } 
      else 
      { 
       screenOrientation = ScreenOrientation.Portrait; 
      } 

      //... Do stuff with new orientation here 
     } 
    }; 

Trả lời

5

cố định nó

thay thế mã

 if (isTablet) 
     { 
      orientation += -90; 
      if (orientation < 0) // keep the result between 0-360 
      { 
       orientation += 360; 
      } 
     } 

Với sự sau

  //Check "normal" screen orientation and adjust accordingly 
      int naturalOrientation = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay().getRotation(); 
      if (naturalOrientation == Surface.ROTATION_0) 
      { 
       Logging.d(TAG, "Rotation ROTATION_0"); 
      } 
      else if (naturalOrientation == Surface.ROTATION_90) 
      { 
       Logging.d(TAG, "Rotation ROTATION_90"); 
       orientation += 90; 
      } 
      else if (naturalOrientation == Surface.ROTATION_180) 
      { 
       Logging.d(TAG, "Rotation ROTATION_180"); 
       orientation += 180; 
      } 
      else if (naturalOrientation == Surface.ROTATION_270) 
      { 
       Logging.d(TAG, "Rotation ROTATION_270"); 
       orientation += 270; 
      } 

      if (orientation > 360) // Check if we have gone too far forward with rotation adjustment, keep the result between 0-360 
      { 
       orientation -= 360; 
      } 
+1

[Đây Developer Điều] (http://android-developers.blogspot.com/2010/09/one-screen-turn-deserves-another.html) chứa một số thông tin tốt về chủ đề này. – FoamyGuy

+0

Cảm ơn FoamyGuy. Tôi chưa bao giờ đọc blog, chỉ hướng dẫn dành cho nhà phát triển – JonWillis

Các vấn đề liên quan