Ứ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.
Ứ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