[Android]View跟随屏幕旋转

Android手机旋转的时候(系统的旋转选项打开的情况下),Activity会进行重构(调用onDestory和onCreate),接着进行屏幕的切换(从横屏切换到竖屏或者相反)。


如果要做一个在屏幕旋转时屏幕上的View跟随其屏幕旋转,提供两种思路


思路1


强制屏幕旋转的时候,让Activity不调用其onDestory和onCreate方法,而调用其onConfigurationChanged方法,根据屏幕方向进行不同的处理

步骤一

在AndroidManifest.xml的标签中配置

android:configChanges="orientation|keyboardHidden"

在Android 3.2(API 13)上添加screenSize。

步骤二

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		super.onConfigurationChanged(newConfig);
		if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
			// do something when portrait
		} else {
			// do something when landscape
		}
	}

中不能声明screenOrientation,否则屏幕不会进行横竖屏且切换。

缺点:横屏和竖屏必须有不同的布局,否则会布局错乱。

思路2

注册Sensor监听器,这样手机旋转的时候会回调其旋转的角度,再对角度进行处理

步骤1

为Activity注册方向监听器

OrientationEventListener mOrientationListener = new OrientationEventListener(Context,SensorManager.SENSOR_DELAY_UI)
 第一个参数是上下文Context对象,第二个参数是回调频率的快慢,此处选择频率最低的SENSOR_DELAY_UI 
  

步骤2

启动监听器

一般会选择在Activity生命周期开始onStart方法内调用启动监听器,

	@Override
	protected void onStart() {
		super.onStart();
		if (mOrientationListener != null) {
			mOrientationListener.enable();
		}

	}

结束onStop方法内注销监听器

@Override
	protected void onStop() {
		if (mOrientationListener != null) {
			mOrientationListener.disable();
		}
		super.onStop();
	}

步骤3

覆盖监听方法

		@Override
			public void onOrientationChanged(int orientation) {
				// 接口回调参数下方是0度,左边是270度
				// 动画接口下方是0度,左边是90度,而且360在0偏 右边
				if (orientation == OrientationEventListener.ORIENTATION_UNKNOWN) {
					return; // 手机平放时,检测不到有效的角度
				}
				// 只检测是否有四个角度的改变
				if (orientation < 60 && orientation > 30) { // 动画0度与接口360度相反,增加下限抵消0度影响
					orientation = 360;
				} else if (orientation > 70 && orientation < 110) { // 动画90度与接口270度相反
					orientation = 270;
				} else if (orientation > 160 && orientation < 200) { // 180度
					orientation = 180;
				} else if (orientation > 240 && orientation < 300) {
					orientation = 90;
				} else if (orientation > 320 && orientation < 340) {// 减少上限减少360度的影响
					orientation = 0;
				} else {
					return;
				}

				if (mOldOriental != orientation) {
					ObjectAnimator
							.ofFloat(mTest, "Rotation", mOldOriental,
									orientation).setDuration(700).start();
					mOldOriental = orientation;
				}
			}

接口回调的参数图解

[Android]View跟随屏幕旋转_第1张图片

逆时针旋转到90°

[Android]View跟随屏幕旋转_第2张图片

继续逆时针旋转到180°

[Android]View跟随屏幕旋转_第3张图片

继续逆时针旋转到270度

[Android]View跟随屏幕旋转_第4张图片

注意:从270到359度是需要小心的地方,因为处于0度的位置会经常在[350,10]之间摇晃。


而旋转动画的角度是略有不同的,90度和270度的位置是相反的,所以在代码中有所处理。




你可能感兴趣的:(Android)