Android屏幕旋转180°的实现

       这次分享一个实现屏幕只能在竖直方向上旋转的功能,开发相机的童鞋应该都会遇到屏幕旋转的问题,一般都是横竖屏的切换,布局变换,生命周期问题啥的,这些网上一搜一大堆的解决方案,什么监听onConfigurationChanged()方法然后判断当前属于横屏还是竖屏然后切换布局啥的,生命周期是在对应的Activity声明的时候添加android:configChanges="orientation|keyboardHidden|screenSize"。不过在网上看到一篇对横竖屏解析很好的文章分享出来https://blog.csdn.net/u010005281/article/details/79531474。这次遇到的需求是不经过横屏直接倒转屏幕的操作。从这篇博客中看到了SCREEN_ORIENTATION_SENSOR_PORTRAIT方法,亲测在手机端不适用,在pad端可以。在手机端可以实现始终横屏旋转的方法。开始我的表演

        根据产品的需求来做,我这边的需求是对所有的界面都实现始终竖屏切换,这就需要我们定义一个BaseActivity类,然后以后的Activity都继承于BaseActivity。OrientationEventListener可以实时的获取到手机旋转的角度,然后根据这个旋转的角度判断是横屏还是竖屏,再根据角度的范围判断是偏向于竖屏的正向还是倒向。是不是超简单。我代码中的方法startOrientation()方法主要是来判断用户有没有开启  “自动旋转的开关的方法” ,如果用户没有开启自动旋转的开关就不进行屏幕旋转的判断,开启以后在监听并旋转。我在这里又写了一遍onConfigurationChanged()方法并在里面调用了开启监听的方法主要是为了解决在App界面中下拉后开启开关后的旋转问题,好了,结束。整代码如下:

import android.content.pm.ActivityInfo
import android.content.res.Configuration
import android.hardware.SensorManager
import android.os.Bundle
import android.provider.Settings
import android.support.v4.app.FragmentActivity
import android.view.OrientationEventListener

class BaseActivity: FragmentActivity() {
    private lateinit var orientationEventListener: OrientationEventListener
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //实时监听屏幕的旋转
        orientationEventListener=object : OrientationEventListener(this, SensorManager.SENSOR_DELAY_NORMAL){
            override fun onOrientationChanged(orientation: Int) {
                requestedOrientation = if((orientation in 270..360)||(orientation in 0..90)){
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
                }else if((orientation in 90..180)||(orientation in 180..270)){
                    ActivityInfo.SCREEN_ORIENTATION_REVERSE_PORTRAIT
                }else{
                    ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
                }
            }

        }
    }

    override fun onResume() {
        super.onResume()
        startOrientation()
    }

    override fun onPause() {
        super.onPause()
        orientationEventListener.disable()
    }

    override fun onConfigurationChanged(newConfig: Configuration?) {
        super.onConfigurationChanged(newConfig)
        //解决屏幕下拉后开启屏幕旋转开关的问题
        startOrientation()
    }

    private fun startOrientation(){
        if(Settings.System.getInt(contentResolver, Settings.System.ACCELEROMETER_ROTATION)==0){
            orientationEventListener.disable()
        }else {
            orientationEventListener.enable()
        }
    }

}

你可能感兴趣的:(Android,kotlin)