Android10模擬器上調(diào)試雙屏異顯

??????Android SDK 提供了Display類咪奖,實現(xiàn)在主屏幕之外的擴展屏幕上顯示不同于主屏幕的UI,而擴展屏幕上的UI顯示笛厦,實質(zhì)上是顯示了一個系統(tǒng)級別的Dialog餐茵,我們可以將自已的View加入到此Dialog中進行顯示。
??????擴展屏可以有一個或超過一個辆苔,實際的應用中需要底層驅(qū)動的支持算灸。在官方的模擬器中我們可以模擬出一個副屏,進行調(diào)試(當然除了模擬器驻啤,我們的手機也可以進行模擬)
??????以Android10官方模擬器為例菲驴,來說明如何進行雙屏異顯的調(diào)試。
一骑冗、設置Simulate secondary displays
??????模擬器中打開"設置-開發(fā)者選項"界面赊瞬,在列表中找到"Simulate secondary displays"條目。
點擊后贼涩,在彈出的對話框中選擇副屏的分辨率:



??????比如我們選中720p巧涧,模擬器屏幕的左上角上會立即呈現(xiàn)出副屏的窗口,其顯示內(nèi)容默認為與主屏顯示一致:



??????副屏窗口就是一個Dialog遥倦,可以拖動谤绳,讓其顯示在合適的位置。
二袒哥、實現(xiàn)副屏異顯
??????因為副屏默認顯示與主屏一致缩筛,如果要實現(xiàn)雙屏異顯,我們需要在APP中進行開發(fā)堡称,將自定義布局加入到副屏中進行顯示瞎抛。
1、申請權(quán)限
AndroidManifest.xml中添加兩個權(quán)限:
<uses-permission android:name= "android.permission.SYSTEM_ALERT_WINDOW" />
<uses-permission android:name= "android.permission.SYSTEM_OVERLAY_WINDOW"/>

因為android 6.0及之后 android.permission.SYSTEM_OVERLAY_WINDOW需要系統(tǒng)動態(tài)授權(quán)才能啟用却紧,所以在APP啟動時加入如下代碼進行動態(tài)授權(quán):

if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
    //啟動Activity讓用戶授權(quán)
    if (!Settings.canDrawOverlays(this)) {
        val intent: Intent = Intent(
              Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse( "package:$packageName"))
              startActivityForResult(intent, 1010)
    }
}

系統(tǒng)會彈出授權(quán)窗口桐臊,開啟即可:



2、獲取副屏的Display對象

//獲取顯示管理服務代理對象
 val displayManger = activity.getSystemService(Context.DISPLAY_SERVICE) as DisplayManager?

//當前副屏的Display
 private var currentDisplay: Display? = null
 displayManger?.run {
     //取所有副屏對應的Display列表
     val displays = getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION)
     if (!displays.isEmpty()){
           val display = displays.find { it.isValid } //取第一個有效的Display
           //無副屏到接入新的副屏
           if (currentDisplay == null) {
                 //保存副屏的Display
                 currentDisplay = display
           }
     }
 }

第一步"設置Simulate secondary displays"中我們已經(jīng)設置過副屏了晓殊,所以currentDisplay不會為空断凶。
3、初始化Context與WindowManager

//副屏Context
private var presentationContext: Context? = null 
//副屏窗口管理器
private var presentationWindowManager:WindowManager? = null
val displayContext: Context =  activity.createDisplayContext(display)
val wm = displayContext.getSystemService(WINDOW_SERVICE) as WindowManager

presentationContext = object :ContextThemeWrapper(displayContext, android.R.style.Theme){
    override fun getSystemService(name: String): Any {
        if (WINDOW_SERVICE == name) {
            return(wm)
        }

        return super.getSystemService(name)
    }
}
presentationWindowManager = 
(presentationContext as ContextThemeWrapper).getSystemService(Context.WINDOW_SERVICE) as WindowManager

4挺物、向副屏添加View
實現(xiàn)一個只顯示純藍色背景的布局:default.xml

<?xml version="1.0" encoding="utf-8"?>
<View xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@android:color/holo_blue_dark"/>

以下是向副屏窗口加入View的參考代碼:

//通過布局id生成View
val inflater = LayoutInflater.from(presentationContext!!)
val view = inflater.inflate(R.layout.default, null)
//最終副屏會顯示default.xml的內(nèi)容
presentationWindowManager?.addView(view,buildLayoutParams())

buildLayoutParams函數(shù):

@SuppressLint("InlinedApi")
private fun buildLayoutParams():WindowManager.LayoutParams {
    if(Build.VERSION.SDK_INT >= 26){
       return WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            0,
            0,
            TYPE_APPLICATION_OVERLAY,  //FIRST_SYSTEM_WINDOW + 38
            0, PixelFormat.TRANSPARENT
        )
    } else {
        return WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.MATCH_PARENT,
            0,
            0,
            WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
            0, PixelFormat.TRANSPARENT
        )
    }
 }

說明一下:
Android8.0及以后只能使用TYPE_APPLICATION_OVERLAY窗口類型來創(chuàng)建懸浮窗懒浮。(其它窗口類型在8.0已經(jīng)被廢棄掉)
看一下最終的效果:


副屏還可以顯示其它更復雜的布局飘弧,也可以顯示圖片與播放視頻识藤,如下是播放視頻的截圖:

最后的問題:
副屏是否支持觸摸砚著?
目前我了解所知,原生并不支持副屏觸摸動作痴昧,但是修改源碼是可以達到的(主要是修改觸控事件的向上分發(fā)邏輯稽穆,因為分發(fā)時只有一個主屏)。
可以參考:http://www.reibang.com/p/572eaa37ddd3

另外Android自帶一個系統(tǒng)組件Presentation赶撰,可以簡化多屏異顯舌镶,其實質(zhì)也是封裝了上面的過程。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末豪娜,一起剝皮案震驚了整個濱河市餐胀,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瘤载,老刑警劉巖否灾,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸣奔,居然都是意外死亡墨技,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門挎狸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扣汪,“玉大人,你說我怎么就攤上這事锨匆≌副穑” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵恐锣,是天一觀的道長紊遵。 經(jīng)常有香客問我,道長侥蒙,這世上最難降的妖魔是什么暗膜? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮鞭衩,結(jié)果婚禮上学搜,老公的妹妹穿的比我還像新娘。我一直安慰自己论衍,他們只是感情好瑞佩,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坯台,像睡著了一般炬丸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天稠炬,我揣著相機與錄音焕阿,去河邊找鬼。 笑死首启,一個胖子當著我的面吹牛暮屡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播毅桃,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼褒纲,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钥飞?” 一聲冷哼從身側(cè)響起莺掠,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎读宙,沒想到半個月后汁蝶,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡论悴,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年掖棉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片膀估。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡幔亥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出察纯,到底是詐尸還是另有隱情帕棉,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布饼记,位于F島的核電站香伴,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏具则。R本人自食惡果不足惜即纲,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望博肋。 院中可真熱鬧低斋,春花似錦、人聲如沸匪凡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽病游。三九已至唇跨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背买猖。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工改橘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人政勃。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓唧龄,卻偏偏與公主長得像兼砖,于是被迫代替她去往敵國和親奸远。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容