Android视频播放手动切换和自动切换横竖屏冲突问题

朱典
2023-12-01

         在开发过程中,应该有很多小伙伴都遇到过视屏播放的时候,横竖屏切换问题。主要表现是:手动点击切换成横屏或者竖屏之后

手机屏幕便不再受重力感应的驱使了....即是你已经在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) {
		}
	}


 类似资料: