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

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

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

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

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

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

問題

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

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

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

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

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

但是在屏幕旋轉(zhuǎn)之后,劉海到了右邊,左邊就不應(yīng)該以劉海的寬度作為懸浮球的起點(diǎn)了。 這樣的話就需要監(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'

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

解決思路

既然onConfigurationChanged收不到回調(diào),還有另外⼀個(gè)辦法,就是監(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度時(shí)在左邊,90度時(shí)在右邊。這種⽅式看起來可以 解決問題,但是多旋轉(zhuǎn)⼏次就發(fā)現(xiàn)⼜有其他問題。按照正常思維,屏幕的顯示⽅向應(yīng)該和這個(gè)度數(shù)⼀ 致才對(duì),即屏幕的顯示應(yīng)該是⾃上⽽下的。但是下圖就不是這樣。

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

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

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

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

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

通過這樣的判斷基本上能將屏幕旋轉(zhuǎn)事件監(jiān)聽準(zhǔn)確了,onOrientationChanged這個(gè)回調(diào)很靈敏,⼿ 機(jī)屏幕稍微動(dòng)⼀下就會(huì)回調(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)時(shí),判定屏幕顯示⽅向是和 Surface.ROTATION_270⽐較的,⽽270范圍內(nèi)時(shí)是和Surface.ROTATION_90⽐較的。看得出來⻆度 是順時(shí)針遞增的,⽽屏幕⽅向是逆時(shí)針計(jì)算度數(shù)的。

其他問題

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

小結(jié)

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

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

標(biāo)簽: Android
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久国产影院| 国产香蕉精品| 樱桃视频成人在线观看| 国产成人精品一区二区三区视频 | av日韩中文| 国产欧美一区二区三区精品酒店| 热三久草你在线| 五月婷婷六月综合| 中文无码日韩欧| 亚州精品视频| 久久99视频| 久久免费黄色| 亚洲精品高潮| 国产乱码午夜在线视频| 伊人久久大香线蕉av超碰演员| 国产韩日影视精品| 日韩三级视频| 91亚洲国产高清| 狠狠爱成人网| 欧美一级二区| 午夜精品久久久久久久久久蜜桃| 久久久精品午夜少妇| 久久青草久久| 日韩亚洲一区在线| 国产一区二区三区黄网站| 吉吉日韩欧美| 久久九九国产| 亚洲欧美日本视频在线观看| 久久福利影视| 日本成人在线网站| 97se亚洲| 欧美日本不卡| 麻豆成人在线观看| 91九色精品| 亚洲精品乱码| 国产精品免费大片| 精品国产乱码久久久久久1区2匹| 精品网站999| 蜜桃av.网站在线观看| 久久视频一区| 喷白浆一区二区| 日韩视频一二区| 国产精品蜜月aⅴ在线| 国产精品高颜值在线观看| 久久婷婷一区| 妖精视频成人观看www| 日韩影院精彩在线| 欧美精品三级在线| 国产精品原创| 免费观看久久久4p| 国产精品视频3p| 日韩av在线中文字幕| 亚洲女同中文字幕| 亚洲91在线| 日本精品黄色| 丝袜美腿亚洲色图| 国产乱码精品一区二区三区亚洲人| 精品一区二区三区视频在线播放 | 亚洲欧美网站在线观看| 69堂免费精品视频在线播放| 精品一区av| 亚洲高清影视| 免费亚洲一区| 亚洲自拍另类| 精品中文字幕一区二区三区四区| 婷婷激情一区| 日本在线视频一区二区| 伊人久久av| 亚洲欧美在线综合| 国产精品99一区二区三| 一区二区亚洲精品| 日本成人精品| 国产在线观看91一区二区三区| 激情久久五月| 免费在线观看成人| 亚洲免费黄色| 国产69精品久久| 亚洲三级在线| 视频福利一区| 欧美aaaaaa午夜精品| 欧美成人综合| 久久精品亚洲| 亚洲制服一区| 天堂日韩电影| 欧美黄色精品| 中文字幕一区二区精品区| 国产高清视频一区二区| 亚洲一区二区三区四区五区午夜 | 日韩免费一区| 日本在线视频一区二区| 亚洲伦乱视频| 麻豆一区在线| 亚洲人成网77777色在线播放| bbw在线视频| 国产精品亚洲成在人线| 欧美精品一区二区三区精品| 精品国产18久久久久久二百| 亚洲最新av| 黄色成人精品网站| 在线手机中文字幕| 国产精品久久国产愉拍| 日韩区欧美区| 奶水喷射视频一区| 久久中文字幕av一区二区不卡| 国产伦一区二区三区| 国产精品毛片在线| 日韩精品一卡| 久久精品国产一区二区| 久久精品国内一区二区三区| 97久久精品| 国产亚洲毛片在线| 亚洲第一精品影视| 久久久精品日韩| 国产精品男女| 国产女优一区| 四虎国产精品免费久久| 国产一区91| 成人av二区| 红桃视频国产一区| av亚洲在线观看| 一区二区小说| 久久精品国产www456c0m| 亚洲日本网址| 日韩在线第七页| 亚洲综合电影| 成人午夜在线| 鲁鲁在线中文| 黑人精品一区| 99精品在线观看| 欧美在线观看视频一区| 欧美va天堂在线| 亚洲国产专区| 亚洲在线免费| 亚洲精选av| 青青草国产成人99久久| 青青草国产成人99久久| 国产一精品一av一免费爽爽| 国产欧美日韩一区二区三区在线| 日韩不卡一区二区三区| 国产乱子精品一区二区在线观看| 日本中文字幕一区二区| 美国欧美日韩国产在线播放| 亚洲综合精品| 美女久久99| 日本欧美不卡| 国产亚洲一级| **爰片久久毛片| 久久精品国产成人一区二区三区| 国内在线观看一区二区三区| 一区二区精品伦理...| 99精品综合| 蜜臀久久99精品久久久画质超高清| 一级欧美视频| 国产精品一站二站| 国产一区二区三区91| 91亚洲自偷观看高清| 久久精品av| 亚洲综合专区| 免费看一区二区三区| 日韩一区二区中文| 免费国产自线拍一欧美视频| 日韩国产在线观看| 四虎国产精品免费观看| 精品在线99| 日韩高清一区在线| 精品国产中文字幕第一页| 亚洲天堂免费电影| 亚洲婷婷在线| 精品日韩在线| 国产一区二区三区自拍| 老鸭窝毛片一区二区三区| 国产精品午夜av| 99久久视频| 日本国产欧美| 久久久久国产一区二区| 日韩中文字幕视频网| 国产成人1区| 在线亚洲自拍| 久久99蜜桃| 好吊日精品视频| 嫩呦国产一区二区三区av| 女人av一区| 国产精品一区免费在线| 色老板在线视频一区二区| 综合激情婷婷| 精品久久久久久久| 免费人成网站在线观看欧美高清| 久久精品资源| 在线 亚洲欧美在线综合一区| 欧美性www| 在线一区免费| 国产亚洲精品美女久久| 桃色一区二区| 国产精品99一区二区三区| 伊人精品久久| 99久久激情| 国产精品久久久久蜜臀| 日韩欧美三区| 在线综合欧美| 99久久精品网站|