[Android]View跟随屏幕旋转
2015-07-03 13:43
731 查看
Android手机旋转的时候(系统的旋转选项打开的情况下),Activity会进行重构(调用onDestory和onCreate),接着进行屏幕的切换(从横屏切换到竖屏或者相反)。
如果要做一个在屏幕旋转时屏幕上的View跟随其屏幕旋转,提供两种思路
在Android 3.2(API 13)上添加screenSize。
在<activity>中不能声明screenOrientation,否则屏幕不会进行横竖屏且切换。
第一个参数是上下文Context对象,第二个参数是回调频率的快慢,此处选择频率最低的SENSOR_DELAY_UI
一般会选择在Activity生命周期开始onStart方法内调用启动监听器,
结束onStop方法内注销监听器
接口回调的参数图解
逆时针旋转到90°
继续逆时针旋转到180°
继续逆时针旋转到270度
注意:从270到359度是需要小心的地方,因为处于0度的位置会经常在[350,10]之间摇晃。
如果要做一个在屏幕旋转时屏幕上的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度的位置是相反的,所以在代码中有所处理。
相关文章推荐
- 解决Android解析图片的OOM问题!!!(转)
- Android中如何判断是否联网
- android studio 问题总结
- android 系统日期时间的获取
- Android中如何判断内存卡是否存在
- Android的图片缓存ImageCache(转)
- Android源码编译--整理
- Android入门(4)——AutoComplete TextView实现动态自动匹配输入的内容
- Android 多个ImageView图片层叠透明区域点击事件穿透
- Android中获取手机屏幕各部分的尺寸
- Java, android Scanner 简单的使用
- Android入门(3)——使用TextView实现跑马灯效果
- Android Fragment 真正彻底的解决(下一个)
- Android中保存图片的两种方式
- Android ScrollView遇到的问题
- android TextView设置删除线,超链接,颜色和字体等说介绍,androidtextview
- android实现背景音乐播放
- android如何长时间音乐播放实现MediaPlayer
- Android4.4KK下遮盖p-sensor拨打电话无法自动灭屏的问题分析
- Android4.3 蓝牙BLE初步