电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Android如何監聽屏幕旋轉

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

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

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

問題

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

在豎屏狀態下,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) asWindowManagerval 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會給出準確的回調的。 Android設備碎⽚化嚴重,除了劉海,在屏幕的下邊緣還有虛擬導航欄,在不同的系統設置下,這個 導航欄不顯示狀態會不⼀樣。那么這時候在懸浮球貼邊這個需求中就不僅僅要考慮劉海了,還得考慮 導航欄。更有甚者,在旋轉過程中,虛擬導航欄會⼀直保持在⼀個⽅向,和劉海疊加。那么要清楚的 算位置,第⼀步就是要監聽屏幕的旋轉了。

以上就是如何監聽Android屏幕旋轉的詳細內容,更多關于監聽Android屏幕旋轉的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: EPK超声波测厚仪,德国EPK测厚仪维修-上海树信仪器仪表有限公司 | 洗瓶机厂家-酒瓶玻璃瓶冲瓶机-瓶子烘干机-封口旋盖压盖打塞机_青州惠联灌装机械 | 预制围墙_工程预制围墙_天津市瑞通建筑材料有限公司 | 隧道烘箱_隧道烘箱生产厂家-上海冠顶专业生产烘道设备 | 莱州网络公司|莱州网站建设|莱州网站优化|莱州阿里巴巴-莱州唯佳网络科技有限公司 | 滑板场地施工_极限运动场地设计_滑板公园建造_盐城天人极限运动场地建设有限公司 | 德国EA可编程直流电源_电子负载,中国台湾固纬直流电源_交流电源-苏州展文电子科技有限公司 | 钢格板|镀锌钢格板|热镀锌钢格板|格栅板|钢格板|钢格栅板|热浸锌钢格板|平台钢格板|镀锌钢格栅板|热镀锌钢格栅板|平台钢格栅板|不锈钢钢格栅板 - 专业钢格板厂家 | 进口试验机价格-进口生物材料试验机-西安卡夫曼测控技术有限公司 | PSI渗透压仪,TPS酸度计,美国CHAI PCR仪,渗透压仪厂家_价格,微生物快速检测仪-华泰和合(北京)商贸有限公司 | 首页_欧瑞传动官方网站--主营变频器、伺服系统、新能源、软起动器、PLC、HMI | 拼装地板,悬浮地板厂家,悬浮式拼装运动地板-石家庄博超地板科技有限公司 | 全自动面膜机_面膜折叠机价格_面膜灌装机定制_高速折棉机厂家-深圳市益豪科技有限公司 | 上海单片机培训|重庆曙海培训分支机构—CortexM3+uC/OS培训班,北京linux培训,Windows驱动开发培训|上海IC版图设计,西安linux培训,北京汽车电子EMC培训,ARM培训,MTK培训,Android培训 | 颗粒机,颗粒机组,木屑颗粒机-济南劲能机械有限公司 | 上海刑事律师|刑事辩护律师|专业刑事犯罪辩护律师免费咨询-[尤辰荣]金牌上海刑事律师团队 | 耐高温风管_耐高温软管_食品级软管_吸尘管_钢丝软管_卫生级软管_塑料波纹管-东莞市鑫翔宇软管有限公司 | 绿叶|绿叶投资|健康产业_绿叶投资集团有限公司 | 硫化罐-电加热蒸汽硫化罐生产厂家-山东鑫泰鑫智能装备有限公司 | 洁净棚-洁净工作棚-无菌室-净化工程公司_北京卫护科技有限公司 | 道康宁消泡剂-瓦克-大川进口消泡剂供应商 | 超声骨密度仪-骨密度检测仪-经颅多普勒-tcd仪_南京科进实业有限公司 | 根系分析仪,大米外观品质检测仪,考种仪,藻类鉴定计数仪,叶面积仪,菌落计数仪,抑菌圈测量仪,抗生素效价测定仪,植物表型仪,冠层分析仪-杭州万深检测仪器网 | 有声小说,听书,听小说资源库-听世界网 | 厂房出售_厂房仓库出租_写字楼招租_土地出售-中苣招商网-中苣招商网 | 制冷采购电子商务平台——制冷大市场 | 齿轮减速机_齿轮减速电机-VEMT蜗轮蜗杆减速机马达生产厂家瓦玛特传动瑞环机电 | 水冷式工业冷水机组_风冷式工业冷水机_水冷螺杆冷冻机组-深圳市普威机械设备有限公司 | 北京自然绿环境科技发展有限公司专业生产【洗车机_加油站洗车机-全自动洗车机】 | 污水处理设备维修_污水处理工程改造_机械格栅_过滤设备_气浮设备_刮吸泥机_污泥浓缩罐_污水处理设备_污水处理工程-北京龙泉新禹科技有限公司 | OLChemim试剂-ABsciex耗材-广州市自力色谱科仪有限公司 | MOOG伺服阀维修,ATOS比例流量阀维修,伺服阀维修-上海纽顿液压设备有限公司 | 钢制拖链生产厂家-全封闭钢制拖链-能源钢铝拖链-工程塑料拖链-河北汉洋机械制造有限公司 | 拉曼光谱仪_便携式|激光|显微共焦拉曼光谱仪-北京卓立汉光仪器有限公司 | 首页-瓜尔胶系列-化工单体系列-油田压裂助剂-瓜尔胶厂家-山东广浦生物科技有限公司 | 四合院设计_四合院装修_四合院会所设计-四合院古建设计与建造中心1 | 英思科GTD-3000EX(美国英思科气体检测仪MX4MX6)百科-北京嘉华众信科技有限公司 | 飞扬动力官网-广告公司管理软件,广告公司管理系统,喷绘写真条幅制作管理软件,广告公司ERP系统 | 承插管件_不锈钢承插管件_锻钢高压管件-温州科正阀门管件有限公司 | 艺术涂料|木纹漆施工|稻草漆厂家|马来漆|石桦奴|水泥漆|选加河南天工涂料 | 无硅导热垫片-碳纤维导热垫片-导热相变材料厂家-东莞市盛元新材料科技有限公司 |