2011-01-19 12 views
9

Tôi muốn buộc các hướng màn hình để cảnh quan trên nút nhấp chuột bằng cách thiết lậphướng màn hình Android để cảm biến

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

Nó hoạt động tốt. Bây giờ tôi muốn ứng dụng theo dõi cảm biến để định hướng được đưa trở lại chân dung khi nghiêng trở lại chân dung. Tôi biết điều này là có thể bằng cách thiết lập setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); nhưng không biết nơi để thiết lập nó. Nếu hướng bị buộc phải nằm ngang, hướng sẽ vẫn ở trong cảnh quan bất kể bạn nghiêng theo bất kỳ hướng nào. Bất cứ ai có thể chỉ định làm thế nào để thiết lập lại cờ định hướng?

Trả lời

1

Tùy thuộc vào thời điểm bạn muốn cảm biến phát hiện xoay vòng một lần nữa.

Cá nhân trong một ứng dụng Tôi đang developping Tôi có một hoạt động cụ thể mà tôi cần phải được ở chế độ chân dung, vì vậy tôi sử dụng setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); trong onResume() của hoạt động này và setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); trong onPause() và nó hoạt động tốt, khi tôi nhập hoạt động nó đặt thành dọc nếu không và không cho phép thay đổi và khi thoát khỏi cảm biến hoạt động lại ...

Bạn đang cố gắng bật và tắt cảm biến ở đâu?

+0

Ứng dụng của tôi ở chế độ dọc theo mặc định. Người dùng có thể chuyển sang chế độ ngang bằng cách nhấp vào nút hoặc bằng cách nghiêng thiết bị. Nhưng ở chế độ ngang, không có cách nào để đưa hoạt động trở lại chế độ dọc. Nếu một nút khác phải được cung cấp để buộc hướng đến chân dung, thì đây sẽ là tùy chọn cuối cùng. Tôi muốn biết là nó có thể thiết lập để chế độ cảm biến sau khi buộc phải phong cảnh. Tôi đã thử tùy chọn của bạn t đặt ở chế độ cảm biến khi tạm dừng, nhưng nó sẽ hoàn nguyên về chế độ dọc khi tôi muốn buộc chế độ nằm ngang khi thiết bị đang ở chế độ dọc. – Kulai

4

Tôi nghĩ ở đây bạn nên sử dụng setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED)

7

Ứng dụng YouTube hiện tại thực hiện những gì bạn đang yêu cầu.
Tôi đã xử lý cùng một loại sự cố trong ứng dụng của mình để phát lại video.

Nếu lực lượng người dùng định hướng đến cảnh khi anh/cô ấy trong bức chân dung, khởi OrientationEventListener mà thông báo cho bạn về định hướng thiết bị từ SensorManager trong đó khoảng từ 0 đến 360.

Xem nếu thiết bị nghiêng tới phạm vi định hướng phong cảnh đó sẽ là khoảng (orientation >= 60 && orientation <= 120) || (orientation >= 240 && orientation <= 300) và lưu trạng thái này vào enum hoặc cờ và sau đó nếu thiết bị quay trở lại Phạm vi định hướng dọc (orientation <= 40 || orientation >= 320), hãy kiểm tra enum/flag và gọi setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);, đặt lại cờ/enum và tắt cảm biến cho đến khi định hướng lực lượng người dùng một lần nữa.

Đây là mã bản demo:

private enum SensorStateChangeActions { 
     WATCH_FOR_LANDSCAPE_CHANGES, SWITCH_FROM_LANDSCAPE_TO_STANDARD, WATCH_FOR_POTRAIT_CHANGES, SWITCH_FROM_POTRAIT_TO_STANDARD; 
} 

private SensorStateChangeActions mSensorStateChanges; 

public void goFullScreen() { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); 
     mSensorStateChanges = SensorStateChangeActions.WATCH_FOR_LANDSCAPE_CHANGES; 
     if (null == sensorEvent) 
      initialiseSensor(true); 
     else 
      sensorEvent.enable(); 
} 

public void shrinkToPotraitMode() { 
     setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
     mSensorStateChanges = SensorStateChangeActions.WATCH_FOR_POTRAIT_CHANGES; 
     if (null == sensorEvent) 
      initialiseSensor(true); 
     else 
      sensorEvent.enable(); 
} 
/** 
* Initialises system sensor to detect device orientation for player changes. 
* Don't enable sensor until playback starts on player 
* 
* @param enable if set, sensor will be enabled. 
*/ 
private void initialiseSensor(boolean enable) { 
    sensorEvent = new OrientationEventListener(this, 
      SensorManager.SENSOR_DELAY_NORMAL) { 

     @Override 
     public void onOrientationChanged(int orientation) { 
      /* 
      * This logic is useful when user explicitly changes orientation using player controls, in which case orientation changes gives no callbacks. 
      * we use sensor angle to anticipate orientation and make changes accordingly. 
      */ 
      if (null != mSensorStateChanges 
        && mSensorStateChanges == SensorStateChangeActions.WATCH_FOR_LANDSCAPE_CHANGES 
        && ((orientation >= 60 && orientation <= 120) || (orientation >= 240 && orientation <= 300))) { 
       mSensorStateChanges = SensorStateChangeActions.SWITCH_FROM_LANDSCAPE_TO_STANDARD; 
      } else if (null != mSensorStateChanges 
        && mSensorStateChanges == SensorStateChangeActions.SWITCH_FROM_LANDSCAPE_TO_STANDARD 
        && (orientation <= 40 || orientation >= 320)) { 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
       mSensorStateChanges = null; 
       sensorEvent.disable(); 
      } else if (null != mSensorStateChanges 
        && mSensorStateChanges == SensorStateChangeActions.WATCH_FOR_POTRAIT_CHANGES 
        && ((orientation >= 300 && orientation <= 359) || (orientation >= 0 && orientation <= 45))) { 
       mSensorStateChanges = SensorStateChangeActions.SWITCH_FROM_POTRAIT_TO_STANDARD; 
      } else if (null != mSensorStateChanges 
        && mSensorStateChanges == SensorStateChangeActions.SWITCH_FROM_POTRAIT_TO_STANDARD 
        && ((orientation <= 300 && orientation >= 240) || (orientation <= 130 && orientation >= 60))) { 
       setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED); 
       mSensorStateChanges = null; 
       sensorEvent.disable(); 
      } 
     } 
    }; 
    if (enable) 
     sensorEvent.enable(); 
} 

này làm việc tương tự như chức năng YouTube, hy vọng điều này sẽ giúp.

+0

Đây chính xác là những gì tôi đang tìm kiếm: một cách để mô phỏng ứng dụng YouTube đang làm gì! Cảm ơn :) – wblaschko

+0

công việc của nó hoàn hảo :) – Meenaxi