Android实现屏幕旋转⽅法总结aureal
本⽂实例总结了Android实现屏幕旋转⽅法。分享给⼤家供⼤家参考。具体如下:
在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制:
默认情况下,当⽤户⼿机的重⼒感应器打开后,旋转屏幕⽅向,会导致当前activity发⽣onDestroy-> onCreate,这样会重新构造当前activity 和界⾯布局,如果在Camera界⾯,则表现为卡顿或者⿊屏⼀段时间。如果是在横竖屏UI设计⽅⾯,那么想很好地⽀持屏幕旋转,则建议在res中建⽴layout-land和layout-port两个⽂件夹,把横屏和竖屏的布局⽂件分别放⼊对应的layout⽂件夹中。
了解了这些以后,我们对android的屏幕旋转⽅法进⾏如下总结:
1. l设置
如果单单想设置横屏或者竖屏,那么只需要添加横竖屏代码:
android:screenOrientation="landscape"横屏设置;
android:screenOrientation="portrait"竖屏设置;
这种⽅法的优点:即使屏幕旋转,Activity也不会重新onCreate。
缺点:屏幕只有⼀个⽅向。
2. 代码动态设置
如果你需要动态改变横竖屏设置,那么,只需要在代码中调⽤tRequestedOrientation()函数:
英语四级成绩多少分过tRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏设置
tRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏设置
tRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);//默认设置
这种⽅法优点:可以随意动态设置,满⾜我们⼈为改变横竖屏的要求,同时满⾜横竖屏UI不同的设计需求;
缺点:如果改变设置,那么,Activity会被销毁,重新构建,即重新onCreate;
3. 重写onConfigurationChanged
成人英文培训班
如果你不希望旋转屏幕的时候Activity被不断的onCreate(这种情况往往会造成屏幕切换时的卡顿),那么,可以使⽤此⽅法:
⾸先,在l中添加configChanges:
⾸先
<activityandroid:name=".Test"
android:configChanges="orientation|keyboard">
</activity>
注意,keyboardHidden表⽰键盘辅助功能隐藏,如果你的开发API等级等于或⾼于13,还需要设置screenSize,因为screenSize会在屏幕旋转时改变;
android:configChanges="keyboardHidden|orientation|screenSize"
然后,在Activity中重写onConfigurationChanged⽅法,这个⽅法将会在屏幕旋转变化时,进⾏监听处理:
然后
publicvoidonConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated ConfigurationChanged(newConfig);
本科肄业
ientation==Configuration.ORIENTATION_LANDSCAPE){
// Nothing need to be done here
} el{
// Nothing need to be done here
}
}
这个⽅法的优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;
缺点:它只能⼀次旋转90度,如果⼀下⼦旋转180度,onConfigurationChanged函数不会被调⽤。
4. 结合OrientationEventListener,⾃定义旋转监听设置
如果你想更加完美,更加完全的掌控监听屏幕旋转变化,⽐如,转屏时不想重新onCreate,尤其是在Camera界⾯,不想出现旋转preview时屏幕的卡顿、⿊屏等问题,那么,可以尝试:
package com.i61.ailesson.managers
import android.app.Activity
t.ContentResolver
tunes怎么读
t.pm.ActivityInfo
t.res.Configuration
import android.provider.Settings
import android.util.Log
import android.view.OrientationEventListener
class CourVideoActivityRotationController(activity: Activity?) : OrientationEventListener(activity) {
复活节private var systemRotation: Int =0
private var activityRotation: Boolean =fal
rhodesiaprivate var activityOrientation: Int = Configuration.ORIENTATION_LANDSCAPE
private val mActivity: Activity? = activity
init {
activityOrientation = activity?.resources?.configuration?.orientation
: Configuration.ORIENTATION_LANDSCAPE
try {
activity?.let {
systemRotation = tResolver)
}
}catch (e: Settings.SettingNotFoundException) {
systemRotation = -1
中考成绩查询2011}
}
/**
* 打开Activity旋转。
* 如果打开了屏幕旋转,Activity将接收屏幕旋转事件并执⾏onConfigurationChanged⽅法。 */
fun openActivityRotation() {
activityRotation =true
}
/**
* 关闭Activity旋转。
* ⽆论是否打开屏幕旋转,Activity都不能接收到屏幕旋转事件。
*/
fun cloActivityRotation() {
等等用英语怎么说
activityRotation =fal
}
/**
* 检查Activity能否旋转
*/
fun isActivityRotationEnabled(): Boolean {try to do
return activityRotation
}
/**
* 获取Activity当前⽅向。
* 注意,Activity⽅向不是屏幕⽅向。只有打开Activity旋转,Activity⽅向才和屏幕⽅向保持⼀致。 */
fun getActivityOrientation() =activityOrientation
private fun tScreenRotation(cr: ContentResolver?, rotation: Int) {
Settings.System.putInt(cr, Settings.System.ACCELEROMETER_ROTATION,
rotation)
}
private fun getScreenRotation(cr: ContentResolver): Int {
return Int(cr,
Settings.System.ACCELEROMETER_ROTATION)
}
/**
* 打开对屏幕旋转的监听,并设置屏幕为可旋转。
*/
override fun enable() {
openActivityRotation()
//tScreenRotation(mActivity?.contentResolver, 0)
}
/**
* 关闭对屏幕旋转的监听,并恢复到系统之前旋转设定。
*/
override fun disable() {
super.disable()
if (systemRotation == -1) {
return
}
//tScreenRotation(mActivity?.contentResolver, systemRotation)
}
override fun onOrientationChanged(orientation: Int) {
//Log.d("ActivityRotationController", "------orientation = $orientation")
if (orientation <0) {
return
}
val newOrientation =when (orientation) {
/*in 0..60 -> {
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}*/
in 61..119 -> {
ActivityInfo.SCREEN_ORIENTATION_REVERSE_LANDSCAPE
}
/*in 120..240 -> {
ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT
}*/
in 241..299 -> {
ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE
}
/*in 300..360 -> {
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
}*/
el -> {
return
}
}
//Log.d("ActivityRotationController", "activityOrientation = $activityOrientation") if ((newOrientation != orientation) &&activityRotation) {
mActivity?.requestedOrientation = newOrientation;
activityOrientation = newOrientation