日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

Android如何監(jiān)聽屏幕旋轉(zhuǎn)

瀏覽:48日期:2022-09-20 15:11:25
背景

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

關(guān)于切入點,最近在做應(yīng)⽤內(nèi)懸浮球功能時,需要監(jiān)聽屏幕旋轉(zhuǎn)事件來對懸浮球的位置進⾏調(diào)整,發(fā)現(xiàn)有些情況下并不能收到系統(tǒng)回調(diào),思考了⼀翻,做了⼀個屏幕旋轉(zhuǎn)的模擬監(jiān)聽,基本上能達到⽬的。

問題

懸浮球在停⽌拖拽后,需要貼邊到⼿機屏幕的左右兩側(cè)。

在豎屏狀態(tài)下,x坐標(biāo)為0即為左邊緣,x坐 標(biāo)為屏幕寬度即為右邊緣。

但是在橫屏狀態(tài)下,情況就⽐較復(fù)雜了。現(xiàn)在⼤部分Android⼿機都是劉 海屏的設(shè)計,在全屏狀態(tài)下,懸浮球貼邊時不能收到劉海下⾯去,不然就點不到了。

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

Android如何監(jiān)聽屏幕旋轉(zhuǎn)

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

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

在AndroidManifest中配置

android:configChanges='orientation|screenSize'

此時發(fā)現(xiàn)了⼀個問題,當(dāng)把Activity的screenOrientation設(shè)置成sensorLandscape時,即使屏幕旋轉(zhuǎn) 也收不到這個回調(diào)(這個和之前的理解有點不⼀樣)。于是將screenOrientation設(shè)置成sensor,屏 幕旋轉(zhuǎn)就能正常回調(diào)到這⾥,多試⼏次發(fā)現(xiàn),只有在橫屏和豎屏之間切換時才能收到回調(diào),如果直接 將橫屏倒過來,就是橫屏狀態(tài)不變,⽅向調(diào)轉(zhuǎn),此時也不會收到回調(diào)。

解決思路

既然onConfigurationChanged收不到回調(diào),還有另外⼀個辦法,就是監(jiān)聽屏幕⽅向度數(shù),代碼如下

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 } }}

通過度數(shù)來判斷劉海是在左邊還是在右邊,即270度時在左邊,90度時在右邊。這種⽅式看起來可以 解決問題,但是多旋轉(zhuǎn)⼏次就發(fā)現(xiàn)⼜有其他問題。按照正常思維,屏幕的顯示⽅向應(yīng)該和這個度數(shù)⼀ 致才對,即屏幕的顯示應(yīng)該是⾃上⽽下的。但是下圖就不是這樣。

Android如何監(jiān)聽屏幕旋轉(zhuǎn)

此時度數(shù)為90,屏幕卻倒⽴著顯示的,并沒有旋轉(zhuǎn)成正⽴狀態(tài),但是按照上⾯的代碼,會將90度判定 為正常90度正⽴顯示的狀態(tài),此時去修改懸浮球的位置就是錯誤的。

那如果在收到onOrientationChanged這個回調(diào)時能判斷⼀下屏幕顯示的⽅向呢,就是在度數(shù)達到90 度范圍時,同時判斷屏幕的顯示⽅向,即兩個條件同時滿⾜才判定成屏幕旋轉(zhuǎn)了。

⽤下⾯的代碼判定屏幕顯示⽅向

val windowManager = context.getSystemService(Context.WINDOW_SERVICE) asWindowManagerval rotation = windowManager.defaultDisplay?.rotation//rotation為常量0、1、2、3,分別表示屏幕的四個⽅向

通過這樣的判斷基本上能將屏幕旋轉(zhuǎn)事件監(jiān)聽準(zhǔn)確了,onOrientationChanged這個回調(diào)很靈敏,⼿ 機屏幕稍微動⼀下就會回調(diào)。那我希望模擬正常的屏幕旋轉(zhuǎn)事件來修改懸浮球的位置,總不能很頻繁 的刷新吧。這⾥做⼀下控制就好,全部代碼如下:

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 -> {} } }})

通過上⾯的代碼發(fā)現(xiàn),在onOrientationChanged回調(diào)90度范圍內(nèi)時,判定屏幕顯示⽅向是和 Surface.ROTATION_270⽐較的,⽽270范圍內(nèi)時是和Surface.ROTATION_90⽐較的。看得出來⻆度 是順時針遞增的,⽽屏幕⽅向是逆時針計算度數(shù)的。

其他問題

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

小結(jié)

在平時開發(fā)中,要區(qū)分是哪種狀態(tài)橫屏的場景⽐較少,否則我認為Android會給出準(zhǔn)確的回調(diào)的。 Android設(shè)備碎⽚化嚴(yán)重,除了劉海,在屏幕的下邊緣還有虛擬導(dǎo)航欄,在不同的系統(tǒng)設(shè)置下,這個 導(dǎo)航欄不顯示狀態(tài)會不⼀樣。那么這時候在懸浮球貼邊這個需求中就不僅僅要考慮劉海了,還得考慮 導(dǎo)航欄。更有甚者,在旋轉(zhuǎn)過程中,虛擬導(dǎo)航欄會⼀直保持在⼀個⽅向,和劉海疊加。那么要清楚的 算位置,第⼀步就是要監(jiān)聽屏幕的旋轉(zhuǎn)了。

以上就是如何監(jiān)聽Android屏幕旋轉(zhuǎn)的詳細內(nèi)容,更多關(guān)于監(jiān)聽Android屏幕旋轉(zhuǎn)的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
婷婷久久免费视频| 成人av二区| 日本午夜精品久久久久| 欧美日韩精品一区二区三区视频| 婷婷精品在线| 久久99青青| 久久99国产精品视频| 国精品产品一区| 精品免费av在线| 夜夜嗨一区二区| 国产日韩一区二区三免费高清| 久久在线91| 欧美在线网站| 国产毛片一区二区三区| 福利在线一区| 丝袜美腿亚洲色图| 国产精品亚洲人成在99www| 国产一区二区精品福利地址| 五月精品视频| 国产毛片一区二区三区| 人人精品亚洲| 日韩区欧美区| 神马久久午夜| 日韩精品一区二区三区中文 | 日本电影久久久| zzzwww在线看片免费| 日韩中文字幕麻豆| 麻豆成人91精品二区三区| 一区福利视频| 黑森林国产精品av| 日韩精品免费观看视频| 91精品国产自产在线观看永久∴| 亚洲久久在线| 日韩中文影院| 日本色综合中文字幕| 亚洲va中文在线播放免费| 日韩精彩视频在线观看| 欧美日韩国产欧| 国产66精品| 欧美激情在线精品一区二区三区| 另类亚洲自拍| 亚洲免费高清| 国产在线欧美| 日韩啪啪电影网| 精品国产一区二区三区av片| 日本高清久久| 日韩欧美精品一区二区综合视频| 亚洲深夜影院| aⅴ色国产欧美| 国产视频一区三区| 欧美一区二区三区高清视频| 四虎8848精品成人免费网站| 久久不见久久见中文字幕免费| 日韩精品福利一区二区三区| 亚洲精品大全| 日韩一区二区三免费高清在线观看 | 国产一级一区二区| 狠狠操综合网| 欧美一区二区三区高清视频| 欧美.日韩.国产.一区.二区| 伊人精品一区| 国产亚洲精品久久久久婷婷瑜伽| 国产亚洲一区在线| 亚洲精品乱码| 麻豆国产精品视频| 国产乱码午夜在线视频| 激情综合在线| 视频一区日韩| 精品一区二区三区中文字幕视频| 福利在线免费视频| 婷婷综合在线| 欧美日韩一区二区三区不卡视频| 国产精品一线| 成人亚洲精品| 亚洲综合欧美| 国产精品密蕾丝视频下载| 久久av网站| 精品五月天堂| 久久久久九九精品影院| 视频在线观看91| 国产劲爆久久| 久久精品不卡| 欧美精品影院| 91精品一区国产高清在线gif| 在线免费观看亚洲| 久久av免费| 国产精品www994| 激情欧美一区二区三区| 日韩中文字幕不卡| 精品美女视频 | 国产一区二区三区四区二区| 欧美va天堂在线| 国产欧美一区二区精品久久久| 日本在线高清| 国产探花一区| 一区久久精品| 久久精品天堂| 99精品99| 国产99精品一区| 精品三级av| 日韩国产在线一| 美女尤物久久精品| 久久久影院免费| 成人亚洲精品| 久久久久亚洲精品中文字幕| 日欧美一区二区| 91久久国产| 久久久水蜜桃av免费网站| 国产精品视频3p| 综合国产在线| 噜噜噜久久亚洲精品国产品小说| 欧美成人精品三级网站| 国产欧美三级| 日韩激情av在线| 日韩区欧美区| 亚洲欧洲av| 日韩在线成人| 婷婷精品在线| 亚洲精品一二| 日韩欧美四区| 欧美日韩99| 国产精品亚洲欧美一级在线| 日韩va欧美va亚洲va久久| 亚洲精品三级| 欧美影院视频| 国产精品欧美日韩一区| 日本欧美大码aⅴ在线播放| 视频一区二区不卡| 亚洲五月婷婷| 女同性一区二区三区人了人一| 国产综合精品| 久久亚洲色图| 日韩高清不卡在线| 精品国产午夜肉伦伦影院| 色偷偷色偷偷色偷偷在线视频| 亚洲四虎影院| 国产亚洲亚洲| 97se亚洲| av日韩中文| 亚洲精品va| 欧美日韩夜夜| 中文在线免费视频| 久久久久久久久丰满| 国产精品美女久久久| 日韩久久一区| 日韩av有码| 欧美午夜不卡| 国产亚洲高清在线观看| 福利一区二区三区视频在线观看| 亚洲高清久久| 欧美在线日韩| av资源新版天堂在线| 亚洲永久精品唐人导航网址| 日本欧美一区| 欧美成人国产| 奇米狠狠一区二区三区| www.51av欧美视频| 美美哒免费高清在线观看视频一区二区| 国产精品久久乐| 日韩制服丝袜av| 日韩欧美另类一区二区| 日本不卡一二三区黄网| 欧洲av一区二区| 国产精品99精品一区二区三区∴| 蜜臀av免费一区二区三区| 欧美日韩精品一区二区三区在线观看| 久久精品123| 精品国产亚洲一区二区在线观看| 国产农村妇女精品一二区| 精品国产一区二区三区噜噜噜| 一二三区精品| 九九久久婷婷| 美女性感视频久久| 免费在线观看视频一区| 日韩美女一区二区三区在线观看| 日本在线不卡视频一二三区| 久久久久久久久久久9不雅视频| 国产精品成人一区二区网站软件| 蜜桃视频免费观看一区| 宅男噜噜噜66国产日韩在线观看| 午夜欧美巨大性欧美巨大| 麻豆免费精品视频| 日本一区二区中文字幕| 亚洲欧美日韩专区| 欧美福利在线| 亚洲高清av| 亚洲欧美久久久| 韩国精品主播一区二区在线观看 | 国产精品日本| 亚洲自拍另类| 视频一区国产视频| 蜜桃av一区二区| 日本亚洲欧洲无免费码在线| 日韩精品一级| 国产色噜噜噜91在线精品| 欧美性www| 欧美片第1页| 狠狠爱成人网| 婷婷综合国产| 欧美激情在线精品一区二区三区|