Android怎么监听屏幕旋转

  介绍

这篇文章主要介绍Android怎么监听屏幕旋转,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

背景

关于个人,前段时间由于业务太忙,所以一直没有来得及思考并且沉淀点东西;同时组内一个个都在业务上能有自己的思考和总结,在这样的氛围下,不由自主的驱使周末开始写点东西,希望自己除了日常忙于业务,可以沉淀点东西,加上自己的成长. .

关于切入点,最近在做应?内悬浮球功能时,需要监听屏幕旋转事件来对悬浮球的位置进?调整,发现有些情况下并不能收到系统回调,思考了吗?翻,做了?个屏幕旋转的模拟监听,基本上能达到?的。

问题

悬浮球在停?拖拽后,需要贴边到?机屏幕的左右两侧。

在竖屏状态下,x坐标为0即为左边缘,x坐标为屏幕宽度即为右边缘。

但是在横屏状态下,情况就?较复杂了。现在?部分安卓吗?机都是刘海屏的设计,在全屏状态下,悬浮球贴边时不能收到刘海下吗?去,不然就点不到了。

所以此时需要算出刘海的宽度,以此宽度作为悬浮球左边的起始位置,这样悬浮球贴边的时候就不会躲到刘海下吗?去。如下图所示

 Android怎么监听屏幕旋转

但是在屏幕旋转之后,刘海到了右边,左边就不应该以刘海的宽度作为悬浮球的起点了。这样的话就需要监听屏幕的旋转了,配合屏幕?向的吗?度,就能正确判断。监听屏幕的旋转只需要重写活动的onConfiguratuonChanged吗?命周期。

override  fun  onConfigurationChanged (newConfig:配置),{   ,super.onConfigurationChanged (newConfig)   ,Log.i(标签,“提醒configuration  changed")   }

在AndroidManifest中配置

android: configChanges=叭∠騶 screenSize"

此时发现了吗?个问题,当把活动的screenOrientation设置成sensorLandscape时,即使屏幕旋转也收不到这个回调(这个和之前的理解有点不?样)。于是将screenOrientation设置成传感器、屏幕旋转就能正常回调到这?,多试吗?次发现,只有在横屏和竖屏之间切换时才能收到回调,如果直接将横屏倒过来,就是横屏状态不变,?向调转,此时也不会收到回调。

解决思路

既然onConfigurationChanged收不到回调,还有另外?个办法,就是监听屏幕?向度数,代码如下

mOrientationEventListener =, object :, OrientationEventListener(这),{   ,override  fun  onOrientationChanged(方向:Int), {   ,Log.i(标签,“提醒orientation  changed  angle  is  orientation"美元)   ,if  (orientation 祝辞,340,| |,orientation  & lt;, 20), {//0   ,}else  if  (orientation 拷贝71 . . 109),{//90   ,}else  if  (orientation 拷贝161 . . 199),{//180   ,}else  if  (orientation 拷贝251 . . 289),{//270   ,}   ,}   }

通过度数来判断刘海是在左边还是在右边,即270度时在左边,90度时在右边。这种吗?式看起来可以解决问题,但是多旋转?次就发现?有其他问题。按照正常思维,屏幕的显示?向应该和这个度数?致才对,即屏幕的显示应该是吗?上?下的。但是下图就不是这样。

 Android怎么监听屏幕旋转

此时度数为90,屏幕却倒?着显示的,并没有旋转成正?状态,但是按照上吗?的代码,会将90度判定为正常90度正?显示的状态,此时去修改悬浮球的位置就是错误的。

那如果在收到onOrientationChanged这个回调时能判断?下屏幕显示的吗?向呢,就是在度数达到90度范围时,同时判断屏幕的显示?向,即两个条件同时满?才判定成屏幕旋转了。

?下?的代码判定屏幕显示?向

val  windowManager =, context.getSystemService (Context.WINDOW_SERVICE),   WindowManager   val  rotation =windowManager.defaultDisplay ?然后//旋转为常量0,1,2,3,分别表示屏幕的四个?向

通过这样的判断基本上能将屏幕旋转事件监听准确了,onOrientationChanged这个回调很灵敏,?机屏幕稍微动吗?下就会回调。那我希望模拟正常的屏幕旋转事件来修改悬浮球的位置,总不能很频繁的刷新吧。这?做什么?下控制就好,全部代码如下:

object  ScreenOrientationHelper  {   ,val  ORIENTATION_TYPE_0 =0   ,val  ORIENTATION_TYPE_90 =90   ,val  ORIENTATION_TYPE_180 =180   ,val  ORIENTATION_TYPE_270 =270   ,private  var  mOrientationEventListener: OrientationEventListener ?=,空   ,private  var  mScreenOrientationChangeListener:   ,,ScreenOrientationChangeListener ?=,空   ,private  var  currentType =ORIENTATION_TYPE_0      ,fun  init(背景:,上下文,,侦听器:,ScreenOrientationChangeListener), {   mScreenOrientationChangeListener 才能=,侦听器   时间=mOrientationEventListener 才能;object :   ,,,OrientationEventListener(上下文),{   ,,override  fun  onOrientationChanged(方向:Int), {   ,,,if  (mScreenOrientationChangeListener ==, null), {   ,,,,回来   ,,,}   ,,,if  (orientation 祝辞,340,| |,orientation  & lt;, 20), {   ,,,,//0   ,,,,if  (currentType ==, 0), {   ,,,,,回来   ,,,,}   ,,,,if  (getScreenRotation(上下文),==,Surface.ROTATION_0), {   ,,,,,mScreenOrientationChangeListener ! ! .onChange (ORIENTATION_TYPE_0)   ,,,,,currentType =ORIENTATION_TYPE_0   ,,,,}   ,,,},else  if  (orientation 拷贝71 . . 109),{   ,,,,//90   ,,,,if  (currentType ==, 90), {   ,,,,,回来   ,,,,}   ,,,,val  angle =, getScreenRotation(上下文)   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Android怎么监听屏幕旋转