您的位置:首页 > 移动开发 > Android开发

[Android]View跟随屏幕旋转

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

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

思路1

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

步骤一

在AndroidManifest.xml的<application>标签中配置

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
		}
	}


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

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

思路2

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

步骤1

为Activity注册方向监听器

<pre name="code" class="java">OrientationEventListener <span style="font-family: Arial, Helvetica, sans-serif;">mOrientationListener = new OrientationEventListener(Context,SensorManager.SENSOR_DELAY_UI)</span>



第一个参数是上下文Context对象,第二个参数是回调频率的快慢,此处选择频率最低的SENSOR_DELAY_UI

步骤2

启动监听器

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

<span style="white-space:pre">	</span>@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;
				}
			}




接口回调的参数图解



逆时针旋转到90°



继续逆时针旋转到180°



继续逆时针旋转到270度



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

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



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: