91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android怎么監聽屏幕旋轉

發布時間:2021-03-17 14:06:57 來源:億速云 閱讀:189 作者:小新 欄目:開發技術

這篇文章主要介紹Android怎么監聽屏幕旋轉,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

背景

關于個人,前段時間由于業務太忙,所以一直沒有來得及思考并且沉淀點東西;同時組內一個個都在業務上能有自己的思考和總結,在這樣的氛圍下,不由自主的驅使周末開始寫點東西,希望自己除了日常忙于業務,可以沉淀點東西,加上自己的成長..

關于切入點,最近在做應?內懸浮球功能時,需要監聽屏幕旋轉事件來對懸浮球的位置進?調整,發現有些情況下并不能收到系統回調,思考了?翻,做了?個屏幕旋轉的模擬監聽,基本上能達到?的。

問題

懸浮球在停?拖拽后,需要貼邊到?機屏幕的左右兩側。

在豎屏狀態下,x坐標為0即為左邊緣,x坐 標為屏幕寬度即為右邊緣。

但是在橫屏狀態下,情況就?較復雜了。現在?部分Android?機都是劉 海屏的設計,在全屏狀態下,懸浮球貼邊時不能收到劉海下?去,不然就點不到了。

所以此時需要算 出劉海的寬度,以此寬度作為懸浮球左邊的起始位置,這樣懸浮球貼邊的時候就不會躲到劉海下? 去。 如下圖所示

Android怎么監聽屏幕旋轉

但是在屏幕旋轉之后,劉海到了右邊,左邊就不應該以劉海的寬度作為懸浮球的起點了。 這樣的話就需要監聽屏幕的旋轉了,配合屏幕?向的?度,就能正確判斷。監聽屏幕的旋轉只需要重 寫Activity的onConfiguratuonChanged?命周期。

override fun onConfigurationChanged(newConfig: Configuration) {
 super.onConfigurationChanged(newConfig)
 Log.i(TAG, "on configuration changed")
}

在AndroidManifest中配置

android:configChanges="orientation|screenSize"

此時發現了?個問題,當把Activity的screenOrientation設置成sensorLandscape時,即使屏幕旋轉 也收不到這個回調(這個和之前的理解有點不?樣)。于是將screenOrientation設置成sensor,屏 幕旋轉就能正常回調到這?,多試?次發現,只有在橫屏和豎屏之間切換時才能收到回調,如果直接 將橫屏倒過來,就是橫屏狀態不變,?向調轉,此時也不會收到回調。

解決思路

既然onConfigurationChanged收不到回調,還有另外?個辦法,就是監聽屏幕?向度數,代碼如下

mOrientationEventListener = object : OrientationEventListener(this) {
 override fun onOrientationChanged(orientation: Int) {
 Log.i(TAG, "on orientation changed angle is $orientation")
 if (orientation > 340 || orientation < 20) {
 //0
 } else if (orientation in 71..109) {
 //90
 } else if (orientation in 161..199) {
 //180
 } else if (orientation in 251..289) {
 //270
 }
 }
}

通過度數來判斷劉海是在左邊還是在右邊,即270度時在左邊,90度時在右邊。這種?式看起來可以 解決問題,但是多旋轉?次就發現?有其他問題。按照正常思維,屏幕的顯示?向應該和這個度數? 致才對,即屏幕的顯示應該是?上?下的。但是下圖就不是這樣。

Android怎么監聽屏幕旋轉

此時度數為90,屏幕卻倒?著顯示的,并沒有旋轉成正?狀態,但是按照上?的代碼,會將90度判定 為正常90度正?顯示的狀態,此時去修改懸浮球的位置就是錯誤的。

那如果在收到onOrientationChanged這個回調時能判斷?下屏幕顯示的?向呢,就是在度數達到90 度范圍時,同時判斷屏幕的顯示?向,即兩個條件同時滿?才判定成屏幕旋轉了。

?下?的代碼判定屏幕顯示?向

val windowManager = context.getSystemService(Context.WINDOW_SERVICE) as
WindowManager
val rotation = windowManager.defaultDisplay?.rotation
//rotation為常量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? = null
 private var mScreenOrientationChangeListener:
   ScreenOrientationChangeListener? = null
 private var currentType = ORIENTATION_TYPE_0

 fun init(context: Context, listener: ScreenOrientationChangeListener) {
  mScreenOrientationChangeListener = listener
  mOrientationEventListener = object :
    OrientationEventListener(context) {
   override fun onOrientationChanged(orientation: Int) {
    if (mScreenOrientationChangeListener == null) {
     return
    }
    if (orientation > 340 || orientation < 20) {
     //0
     if (currentType == 0) {
      return
     }
     if (getScreenRotation(context) == Surface.ROTATION_0) {
      mScreenOrientationChangeListener!!.onChange(ORIENTATION_TYPE_0)
      currentType = ORIENTATION_TYPE_0
     }
    } else if (orientation in 71..109) {
     //90
     if (currentType == 90) {
      return
     }
     val angle = getScreenRotation(context)
     if (angle == Surface.ROTATION_270) {
      mScreenOrientationChangeListener!!.onChange(ORIENTATION_TYPE_90)
      currentType = ORIENTATION_TYPE_90
     }
    } else if (orientation in 161..199) {
     //180
     if (currentType == 180) {
      return
     }
     val angle = getScreenRotation(context)
     if (angle == Surface.ROTATION_180) {
      mScreenOrientationChangeListener!!.onChange(ORIENTATION_TYPE_180)
      currentType = ORIENTATION_TYPE_180
     }
    } else if (orientation in 251..289) {
     //270
     if (currentType == 270) {
      return
     }
     val angle = getScreenRotation(context)
     if (angle == Surface.ROTATION_90) {
      mScreenOrientationChangeListener!!.onChange(ORIENTATION_TYPE_270)
      currentType = ORIENTATION_TYPE_270
     }
    }
   }
  }
  register()
 }

 private fun getScreenRotation(context: Context): Int {
  val windowManager =
    context.getSystemService(Context.WINDOW_SERVICE) as WindowManager
  return windowManager.defaultDisplay?.rotation ?: 0
 }

 fun register() {
  if (mOrientationEventListener != null) {
   mOrientationEventListener!!.enable()
  }
 }

 fun unRegister() {
  if (mOrientationEventListener != null) {
   mOrientationEventListener!!.disable()
  }
 }

 interface ScreenOrientationChangeListener {
  /**
   *
   * @param orientation
   */
  fun onChange(orientation: Int)
 }
}

使?的話,直接這樣:

ScreenOrientationHelper.init(this, object :
ScreenOrientationHelper.ScreenOrientationChangeListener {
 override fun onChange(orientation: Int) {
  when(orientation) {
   ScreenOrientationHelper.ORIENTATION_TYPE_0 -> {}
   ScreenOrientationHelper.ORIENTATION_TYPE_90 -> {}
   ScreenOrientationHelper.ORIENTATION_TYPE_180 -> {}
   ScreenOrientationHelper.ORIENTATION_TYPE_270 -> {}
  }
 }
})

通過上?的代碼發現,在onOrientationChanged回調90度范圍內時,判定屏幕顯示?向是和 Surface.ROTATION_270?較的,?270范圍內時是和Surface.ROTATION_90?較的。看得出來?度 是順時針遞增的,?屏幕?向是逆時針計算度數的。

其他問題

在測試過程中,上?的?案還存在另外?個問題,雖然onOrientationChanged這個回調很靈敏,但 是也有度數不變?屏幕?向旋轉的情況發?,即保持屏幕?向不變,?是增加屏幕的坡度(將?機? 邊貼在桌?,慢慢?起來),在坡度達到?定時,屏幕會發?旋轉,此時onOrientationChanged是 不會回調的,因為沒有變化。這樣就收不到屏幕旋轉的回調了,但是在實際??機的場景中,這種情 況是?較少的,可以親身試試看。

以上是“Android怎么監聽屏幕旋轉”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

北海市| 扬州市| 康马县| 乐清市| 湘乡市| 蓬莱市| 宜都市| 文化| 汉阴县| 武城县| 杂多县| 茶陵县| 班玛县| 历史| 五寨县| 闽侯县| 嘉禾县| 汨罗市| 安化县| 银川市| 谢通门县| 都兰县| 瓮安县| 潼关县| 岱山县| 宿州市| 邢台县| 卓尼县| 四会市| 洞头县| 霍林郭勒市| 桦川县| 基隆市| 正阳县| 广平县| 西乡县| 蚌埠市| 黎平县| 兴隆县| 青阳县| 花垣县|