<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
Android 無障礙的全域性懸浮窗可以在螢幕上新增 UI 供使用者進行快捷操作,可以展示在所有應用程式之上長期展示。另一方面,在一些自動化場景下,可以用來遮蔽使用者行為,防止使用者手動操作打斷自動化流程。
無障礙服務新增 UI 十分簡單,使用 LayoutInflater 在 AccessibilityService 的 onServiceConnected
新增一個 UI:
// in AccessibilityService, service 代表 AccessibilityService 的子類範例 private fun initView() { // 在螢幕頂部新增一個 View val wm = service.getSystemService(AccessibilityService.WINDOW_SERVICE) as? WindowManager val lp = WindowManager.LayoutParams().apply { type = TYPE_ACCESSIBILITY_OVERLAY // 因為此許可權才能展示處理 layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES format = PixelFormat.TRANSLUCENT flags = flags or FLAG_LAYOUT_NO_LIMITS or FLAG_NOT_TOUCHABLE or // 透傳觸控事件 FLAG_NOT_FOCUSABLE or // 透傳輸入事件 FLAG_LAYOUT_IN_SCREEN width = MATCH_PARENT height = MATCH_PARENT } // 通過 LayoutInflater 建立 View val rootView = LayoutInflater.from(service).inflate(R.layout.float_layer, null) wm?.addView(rootView, lp) }
然後在自定義的無障礙服務中去呼叫這個方法:
class MyAccessibilityService: AccessibilityService() { override fun onServiceConnected() { super.onServiceConnected() initView() } // ... }
需要注意的是,這裡不能將 initView
新增到 onCreate
生命週期中,官方檔案也有一些放在 onCreate 中的操作,但實際上都會導致 crash 。
java.lang.RuntimeException: Unable to create service com.chunyu.accessibilitydemo.service.AccessibilityDemoService: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not valid; is your activity running?
無障礙服務所有的初始化工作,都要放在 onServiceConnected
中執行。這樣就可以將自定義的 UI 展示到螢幕上了。
關於無障礙服務的設定,可以參考官方 API 。
從使用上來看,無障礙蒙層是通過 WindowManager 新增到螢幕上的。而關鍵的一些資訊在 WindowManager.LayoutParams 設定的資料中。
Window 有一個關鍵的屬性 type ,它被定義在 WindowManager 的內部類 LayoutParams 中,它可以控制 Window 的顯示次序。主要分為三種:
從三種視窗的值也可推斷出,type 的值越大,Window 就越靠近使用者。
在上面的使用中,我們將 type 設定為 TYPE_ACCESSIBILITY_OVERLAY
,它的值是 2032 ,是一個系統視窗,所以可以展示在應用程式之上。 TYPE_ACCESSIBILITY_OVERLAY
,是無障礙服務用來展示 UI 專用的 視窗型別 。使用它可以在所有的應用程式上展示蒙層。
flag 中包含了兩個關鍵的值 FLAG_NOT_TOUCHABLE
和 FLAG_NOT_FOCUSABLE
,和一些其他的 flag 。設定這兩個內容,蒙層將不會影響任何使用者操作。
FLAG_NOT_TOUCHABLE
:可以將 Window 設定為永不接收觸控事件,從而能夠將觸控事件透傳給蒙層遮蓋住的區域,不阻塞使用者操作。
FLAG_NOT_FOCUSABLE
:可以將 Window 設定為永不獲取按鍵輸入焦點,使用者無法向這個 Window 傳送按鍵或其他的按鈕時間,而被它覆蓋的內容可以接收並響應事件。
FLAG_LAYOUT_NO_LIMITS
:允許視窗延伸到螢幕之外。
FLAG_LAYOUT_IN_SCREEN
:將視窗放置在整個螢幕中,忽略來自父視窗的任何約束。
這個屬性可以用來控制 Window 在劉海屏的佈局方式。
LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
:僅當劉海屏完全包含在系統欄中時,才允許視窗擴充套件到劉海區域。 否則,視窗的佈局使其不與劉海區域重疊。LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
:允許 Window 延伸到短的一側邊緣的劉海區域。LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER
:Window 不允許延伸到劉海屏區域。LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS
:允許 Window 延伸到所有的螢幕邊緣劉海區域。到此這篇關於Android 無障礙全域性懸浮窗實現範例的文章就介紹到這了,更多相關Android 無障礙全域性懸浮窗內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45