美文网首页
Android实现屏幕旋转方法总结

Android实现屏幕旋转方法总结

作者: 程序员大耳 | 来源:发表于2021-03-01 17:03 被阅读0次

本文实例总结了Android实现屏幕旋转方法。分享给大家供大家参考。具体如下:

在介绍之前,我们需要先了解默认情况下android屏幕旋转的机制:

默认情况下,当用户手机的重力感应器打开后,旋转屏幕方向,会导致当前activity发生onDestroy-> onCreate,这样会重新构造当前activity和界面布局,如果在Camera界面,则表现为卡顿或者黑屏一段时间。如果是在横竖屏UI设计方面,那么想很好地支持屏幕旋转,则建议在res中建立layout-land和layout-port两个文件夹,把横屏和竖屏的布局文件分别放入对应的layout文件夹中。

了解了这些以后,我们对android的屏幕旋转方法进行如下总结:

1. AndroidManifest.xml设置

如果单单想设置横屏或者竖屏,那么只需要添加横竖屏代码:

android:screenOrientation="landscape"横屏设置;

android:screenOrientation="portrait"竖屏设置;

这种方法的优点:即使屏幕旋转,Activity也不会重新onCreate。

缺点:屏幕只有一个方向。

2. 代码动态设置

如果你需要动态改变横竖屏设置,那么,只需要在代码中调用setRequestedOrientation()函数:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏设置

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏设置

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED);//默认设置

这种方法优点:可以随意动态设置,满足我们人为改变横竖屏的要求,同时满足横竖屏UI不同的设计需求;

缺点:如果改变设置,那么,Activity会被销毁,重新构建,即重新onCreate;

3. 重写onConfigurationChanged

如果你不希望旋转屏幕的时候Activity被不断的onCreate(这种情况往往会造成屏幕切换时的卡顿),那么,可以使用此方法:

首先,在AndroidMainfest.xml中添加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 method stubsuper.onConfigurationChanged(newConfig);

if(newConfig.orientation==Configuration.ORIENTATION_LANDSCAPE){

// Nothing need to be done here

} else{

// Nothing need to be done here

 }

}

这个方法的优点:我们可以随时监听屏幕旋转变化,并对应做出相应的操作;

缺点:它只能一次旋转90度,如果一下子旋转180度,onConfigurationChanged函数不会被调用。

4. 结合OrientationEventListener,自定义旋转监听设置

如果你想更加完美,更加完全的掌控监听屏幕旋转变化,比如,转屏时不想重新onCreate,尤其是在Camera界面,不想出现旋转preview时屏幕的卡顿、黑屏等问题,那么,可以尝试:

package com.i61.ailesson.managers

import android.app.Activity

import android.content.ContentResolver

import android.content.pm.ActivityInfo

import android.content.res.Configuration

import android.provider.Settings

import android.util.Log

import android.view.OrientationEventListener

class CourseVideoActivityRotationController(activity: Activity?) : OrientationEventListener(activity) {

private var systemRotation: Int =0

    private var activityRotation: Boolean =false

    private var activityOrientation: Int = Configuration.ORIENTATION_LANDSCAPE

    private val mActivity: Activity? = activity

init {

activityOrientation = activity?.resources?.configuration?.orientation

                ?: Configuration.ORIENTATION_LANDSCAPE

        try {

activity?.let {

                systemRotation = getScreenRotation(it.contentResolver)

}

        }catch (e: Settings.SettingNotFoundException) {

systemRotation = -1

        }

}

/**

    * 打开Activity旋转。

    * 如果打开了屏幕旋转,Activity将接收屏幕旋转事件并执行onConfigurationChanged方法。

    */

    fun openActivityRotation() {

activityRotation =true

    }

/**

    * 关闭Activity旋转。

    * 无论是否打开屏幕旋转,Activity都不能接收到屏幕旋转事件。

    */

    fun closeActivityRotation() {

activityRotation =false

    }

/**

    * 检查Activity能否旋转

    */

    fun isActivityRotationEnabled(): Boolean {

return activityRotation

    }

/**

    * 获取Activity当前方向。

    * 注意,Activity方向不是屏幕方向。只有打开Activity旋转,Activity方向才和屏幕方向保持一致。

    */

    fun getActivityOrientation() =activityOrientation

    private fun setScreenRotation(cr: ContentResolver?, rotation: Int) {

Settings.System.putInt(cr, Settings.System.ACCELEROMETER_ROTATION,

                rotation)

}

private fun getScreenRotation(cr: ContentResolver): Int {

return Settings.System.getInt(cr,

                Settings.System.ACCELEROMETER_ROTATION)

}

/**

    * 打开对屏幕旋转的监听,并设置屏幕为可旋转。

    */

    override fun enable() {

super.enable()

openActivityRotation()

//setScreenRotation(mActivity?.contentResolver, 0)

    }

/**

    * 关闭对屏幕旋转的监听,并恢复到系统之前旋转设定。

    */

    override fun disable() {

super.disable()

if (systemRotation == -1) {

return

        }

//setScreenRotation(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

}*/

            else -> {

return

            }

}

//Log.d("ActivityRotationController", "activityOrientation = $activityOrientation")

        if ((newOrientation != orientation) &&activityRotation) {

mActivity?.requestedOrientation = newOrientation;

            activityOrientation = newOrientation

}

//Log.d("ActivityRotationController", "------newOrientation = $newOrientation")

    }

}

最后在onCreate()中调用:

activityRotationController =new CourseVideoActivityRotationController(this);

activityRotationController.enable();

如何解决屏幕反拿导致页面正反多旋转一次?

通过Application拿一次(结合OrientationEventListener,自定义旋转监听设置)的手机方向PhoneRotation

代码动态设置当前手机横屏方向 setRequestedOrientation(PhoneRotation);

代码动态设置重力旋转 setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE);//重力旋转

删除AndroidManifest.xml设置 android:screenOrientation="xxx"

相关文章

  • Android实现屏幕旋转方法总结

    本文实例总结了Android实现屏幕旋转方法。分享给大家供大家参考。具体如下: 在介绍之前,我们需要先了解默认情况...

  • Android 屏幕旋转切换总结

    android:screenOrientation属性说明: unspecified,默认值,由系统决定,不同手机...

  • 屏幕旋转

    屏幕旋转 推荐文档 了解UIWindow——UIWindow实践 iOS屏幕旋转问题总结 IOS:屏幕旋转与变换 ...

  • iOS 屏幕旋转

    屏幕旋转 认知 期望达到的目的 如何让App支持屏幕旋转 如何让App屏幕旋转 如何保证屏幕旋转后布局不会乱 总结...

  • Android实现屏幕自动旋转功能

    最近在做一个视频客户端项目,有一个功能是,视频要实现自动旋转功能,在这里做一简单的总结。实现起来很简单,几行代码就...

  • SwiftUI 屏幕旋转监听实现

    swiftUI我好像没有找到屏幕旋转的方法,于是利用EnvironmentObject来实现了一个旋转 *mode...

  • ios实现屏幕旋转的方法

    1、屏蔽AppDelegate下面的屏幕旋转方法 (BOOL)shouldAutorotate {//是否允许转屏...

  • [Android][旋转屏幕]

    1.落笔缘由 最近在研究旋转屏幕,网上可以找到资料,发现他们基本都是在Activity的基础上进行旋转。自己也想研...

  • Android屏幕旋转

    很久没有写文章了,找个时间整理下Android简单的屏幕旋转的生命周期和正确的竖屏锁定设置 生命周期启动Activ...

  • Android 屏幕旋转

    当手机屏幕旋转时我们应当怎么去处理,首先了解下默认情况下Android进行屏幕旋转的原理,当手机进行旋转时重力感应...

网友评论

      本文标题:Android实现屏幕旋转方法总结

      本文链接:https://www.haomeiwen.com/subject/kfvafltx.html