我遇到了方向sensorPortrait
不起作用的问题,我尝试通过清单和活动本身启用
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT);
但是这似乎只是被锁定在正常的肖像模式中,但是如果我尝试`fullSensor'
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_FULL_SENSOR);
根据文档
方向由设备方向传感器确定4个方向中的任何一个。这类似于“传感器”,除了这允许4种可能的屏幕方向中的任何一种,无论设备通常会做什么(例如,某些设备通常不会使用反向纵向或反向横向,但这可以实现这些)。在API级别9中添加。
确实如此,所有4个方向都是可能的。如果我也试试
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
我能够实现反向肖像,这让我回到原来的问题,为什么sensorPortrait
不起作用?看起来它与来自`fullSensor'
无论设备通常会做什么(例如,某些设备通常不会使用反向纵向或反向横向,但这样可以实现这些功能)
那么我如何启用它,这是可能的,为什么fullSensor
似乎覆盖它而不是sensorPortrait
?我似乎无法提及如何这样做。这个question表明PhoneWindowManager
对此负责。
理想的解决方案是创建OrientationEventListener()
并手动调用setRequestedOrientation()
,具体取决于通过onOrientationChanged(int orientation)
返回的值?
答案 0 :(得分:3)
作为一种解决方法,我创建了SensorPortraitActivity
:
public class SensorPortraitActivity extends AppCompatActivity {
private static final int PORTRAIT = 0;
private static final int REVERSE_PORTRAIT = 180;
private static final int OFFSET = 45;
private static final int UNKNOWN = -1;
// account for 0 = 360 (eg. -1 = 359)
private static final int PORTRAIT_START = PORTRAIT - OFFSET + 360;
private static final int PORTRAIT_END = PORTRAIT + OFFSET;
private static final int REVERSE_PORTRAIT_START = REVERSE_PORTRAIT - OFFSET;
private static final int REVERSE_PORTRAIT_END = REVERSE_PORTRAIT + OFFSET;
private OrientationChangeListener mListener;
private OrientationEventListener mOrientationListener;
private CurrentOrientation mCurrentOrientation;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mOrientationListener = new OrientationEventListener(this) {
@Override
public void onOrientationChanged(int i) {
orientationChanged(i);
}
};
}
@Override
protected void onResume() {
super.onResume();
mOrientationListener.enable();
}
@Override
protected void onPause() {
super.onPause();
mOrientationListener.disable();
}
//optional
public void setOrientationChangeListener(OrientationChangeListener listener){
mListener = listener;
}
private void orientationChanged(int degrees) {
if (degrees != UNKNOWN){
if (degrees >= PORTRAIT_START || degrees <= PORTRAIT_END){
if (mCurrentOrientation != CurrentOrientation.PORTRAIT){
mCurrentOrientation = CurrentOrientation.PORTRAIT;
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
if (mListener != null){
mListener.onPortrait();
}
}
} else if (degrees >= REVERSE_PORTRAIT_START && degrees <= REVERSE_PORTRAIT_END){
if (mCurrentOrientation != CurrentOrientation.REVERSE_PORTRAIT){
mCurrentOrientation = CurrentOrientation.REVERSE_PORTRAIT;
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT);
if (mListener != null) {
mListener.onReversePortrait();
}
}
}
}
}
interface OrientationChangeListener {
void onPortrait();
void onReversePortrait();
}
enum CurrentOrientation {
PORTRAIT, REVERSE_PORTRAIT
}
}
虽然对于像这样简单的事情看起来似乎有些过分。
简单使用extend SensorPortraitActivity
public class ExampleActivity extends SensorPortraitActivity implements SensorPortraitView.OrientationChangeListener {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//set listener if you want callbacks
super.setOrientationChangeListener(this);
}
@Override
public void onPortrait() {
//portrait orientation
}
@Override
public void onReversePortrait() {
//reverse portrait orientation
}
}