溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

解決SurfaceView調(diào)用setZOrderOnTop(true)遮擋其他控件的問題

發(fā)布時(shí)間:2020-07-22 20:48:03 來源:網(wǎng)絡(luò) 閱讀:33440 作者:辰月之征 欄目:開發(fā)技術(shù)
  1. SurfaceView遮擋其他控件的項(xiàng)目背景:

    最近在做播放器項(xiàng)目,由于底層實(shí)現(xiàn)是用Surface和OpenGL切換渲染,所以在布局里面同時(shí)使用了GLSurfaceView和SurfaceView,同時(shí)播放控制按鈕是自定義的,也沒有使用Android自己提供的MediaCtroller控件。在這種背景下,問題出現(xiàn)了,如果有相關(guān)開發(fā)基礎(chǔ)的同學(xué)應(yīng)該知道,當(dāng)SurfaceView和GLSurfaceView同時(shí)在一個(gè)布局里面,如果想讓SurfaveView顯示圖片或者視頻必須要調(diào)用SurfaceView.setZOrderOnTop(true),也就是說必須把SurfaceView置于Activity顯示窗口的最頂層才能正常顯示,然后調(diào)用了SurfaceView.setZOrderOnTop(true)又導(dǎo)致了其他控件比如播放、快進(jìn)等按鈕被遮擋。網(wǎng)上有很多解決方案,比如解決SurfaceView設(shè)置透明造成遮蓋其他組件的替代方案,對(duì)于視頻播放的頁(yè)面都不夠完美,因?yàn)樗侵苯釉赟urfaceView上面繪制相關(guān)的控件,試想一下如果在SurfaceView的某些區(qū)域繪制了一些按鈕,勢(shì)必會(huì)擋住一部分視頻畫面,這樣對(duì)于用戶來說是很難接受的。

  2. 從SurfaceView源碼中尋找解決方案:

    由于在網(wǎng)上找的解決方案都不能滿足要求,沒辦法有折回來查看了下SurfaceView的源碼,在查看源碼的時(shí)候看到這個(gè)方法setZOrderMediaOverlay(boolean isMediaOverlay),下來我們來看看源碼中對(duì)這個(gè)方法的描述:

    Control whether the surface view's surface is placed on top of another regular surface view in the window (but still behind the window itself).This is typically used to place overlays on top of an underlying media surface view.

  

  Note that this must be set before the surface view's containing window is attached to     the window manager.


  Calling this overrides any previous call to {@link #setZOrderOnTop}.

  大概的意思就是說控制窗口中表面的視圖層是否放置在常規(guī)視圖層的頂部。


  最終,我在調(diào)用setZOrderOnTop(true)之后調(diào)用了setZOrderMediaOverlay(true),OK,遮擋問題完美解決!

  

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI