在开发过程中,应该有很多小伙伴都遇到过视屏播放的时候,横竖屏切换问题。主要表现是:手动点击切换成横屏或者竖屏之后
手机屏幕便不再受重力感应的驱使了....即是你已经在Manifest.xml中设置了android:screenOrientation="sensor"也是不行。
那么问题来了,这是为什么呢?那就是问题出在了感应器Sensor上面,当你点击了切换屏幕时,都是主动把屏幕调整成了横屏,手机处于横屏的时候,此时的感重力命令是一直让手机处于横屏的,虽然你有通过点击按钮切换屏幕方向的命令。但是,感重力命令一直在执行并掩盖了按钮的命令。使的按钮的操作没什么用了。
那现在我们就要通过Handle通知手机目前屏幕所处的状态,然后决定屏幕的方向。具体做法如下:
private Handler rotateHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case 10001:
if ((msg.arg1 > 45 && msg.arg1 <= 135) || (msg.arg1 > 225 && msg.arg1 <= 315)) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR);
} else {
if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
}
}
break;
default:
break;
}
}
};
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
}
@Override
public void onSensorChanged(SensorEvent event) {
float[] values = event.values;
int orientation = 0;
float X = -values[SensorManager.DATA_X];
float Y = -values[SensorManager.DATA_Y];
float Z = -values[SensorManager.DATA_Z];
float magnitude = X * X + Y * Y;
// Don't trust the angle if the magnitude is small compared to the y
// value
if (magnitude * 4 >= Z * Z) {
float OneEightyOverPi = 57.29577957855f;
float angle = (float) Math.atan2(-Y, X) * OneEightyOverPi;
orientation = 90 - (int) Math.round(angle);
// normalize to 0 - 359 range
if (orientation >= 360) {
orientation -= 360;
}
if (orientation < 0) {
orientation += 360;
}
}
if (isClickFullScreenButton) {
// 竖屏
if (isLandscape
&& (((orientation > 315 && orientation <= 360) || (orientation >= 0 && orientation <= 45)) || (orientation > 135 && orientation <= 225))) {
isLandscape = false;
isClickFullScreenButton = false;
isSennor = true;
}
// 横屏
if (!isLandscape
&& ((orientation > 45 && orientation <= 135) || (orientation > 225 && orientation <= 315))) {
isLandscape = true;
isClickFullScreenButton = false;
isSennor = true;
}
}
if (!isSennor) {// 判断是否要进行中断信息传递
return;
}
if (rotateHandler != null) {//发送消息
rotateHandler.obtainMessage(10001, orientation, 0).sendToTarget();
}
}
/** 点击屏幕切换按钮的时候 同时调用该方法 : 中断Handler信息传递 */
public void setIsSennor() {
isSennor = false;
}
/** 点击屏幕切换按钮的时候 同时调用该方法 : 确认此时屏幕的方向 */
public void setIsLandscape(boolean bool) {
isLandscape = bool;
}
/** 点击屏幕切换按钮的时候 同时调用该方法 :设置按钮是否已被点击 */
public void setButtonFullScreenClicked() {
isClickFullScreenButton = true;
}
// 控制横竖屏幕
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {
// 检测屏幕的方向:纵向或横向
} else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {
}
}