Android Fragment中使用SurfaceView切換時(shí)閃一下黑屏的解決辦法
重構(gòu)了下之前自己的一個(gè)新聞客戶端,全部使用了Fragment來(lái)進(jìn)行頁(yè)面切換,只有一個(gè)入口Activity作為程序的啟動(dòng)Activity,其中有一個(gè)界面需要調(diào)用攝像頭識(shí)別二維碼,于是就會(huì)用到SurfaceView進(jìn)行預(yù)覽,那么問(wèn)題來(lái)了,當(dāng)切換到對(duì)應(yīng)的Fragment時(shí),屏幕會(huì)黑一下,黑了1秒左右就顯示出正常的界面,而且這種現(xiàn)象只有第一次進(jìn)入該Fragment才會(huì)出現(xiàn),之后進(jìn)入都不會(huì)出現(xiàn),解決方法是無(wú)意在github上看到了,試了一下,可以行的通,下面貼出解決方法。
方法一、在Activity的onCreate中添加如下代碼
getWindow().setFormat(PixelFormat.TRANSLUCENT);
但是如果你在fragment里這么做貌似是行不通的。
方法二、在activity 的 root view 里面 加入一個(gè) 長(zhǎng)寬都是0px的并且不可見(jiàn)SurfaceView元素 。
原因:
SurfaceView因?yàn)椴煌谝话愕膙iew,它有自己良好的緩沖以及數(shù)據(jù)存取機(jī)制,系統(tǒng)對(duì)他有特殊處理。當(dāng)surfaceview第一次在當(dāng)前activity上添加的時(shí)候,系統(tǒng)會(huì)給WindowManager重新排布局,relayout,這樣就會(huì)黑一下,這個(gè)只會(huì)出現(xiàn)在第一次,以后再添加surfaceview時(shí)就不會(huì)黑屏了。
而自己項(xiàng)目中,由于全部使用fragment進(jìn)行切換頁(yè)面,只有一個(gè)activity聲明在清單文件中,但是代碼中是可以配置是否新開(kāi)activity作為fragment容器的,由于我不想再這個(gè)activity中增加代碼getWindow().setFormat(PixelFormat.TRANSLUCENT);,于是我使用了新開(kāi)activity作為這個(gè)fragment的容器,于是問(wèn)題也得以解決。
有閃屏的代碼是這樣的
private static final int REQUEST_CODE_SCAN = 1; openPageForResult("scan",null,CoreAnim.slide,REQUEST_CODE_SCAN);
但是這個(gè)函數(shù)有一個(gè)重載函數(shù)就是是否新開(kāi)activity,這里使用重載函數(shù)進(jìn)行解決
private static final int REQUEST_CODE_SCAN = 1; openPageForResult(true,"scan",null,CoreAnim.slide,REQUEST_CODE_SCAN);
函數(shù)原型
/** * 打開(kāi)fragment并請(qǐng)求獲得返回值,并設(shè)置是否在新activity中打開(kāi) * @param newActivity 是否新開(kāi)activity * @param pageName 頁(yè)面名 * @param bundle 參數(shù) * @param coreAnim 動(dòng)畫(huà) * @param requestCode 請(qǐng)求碼 * @return 打開(kāi)的fragment對(duì)象 */ public final Fragment openPageForResult(boolean newActivity, String pageName, Bundle bundle, CoreAnim coreAnim, int requestCode);
以上內(nèi)容就是本文給大家分享的Android Fragment中使用SurfaceView切換時(shí)閃一下黑屏的解決辦法,希望對(duì)大家有所幫助。
相關(guān)文章
Flutter實(shí)現(xiàn)頁(yè)面路由及404路由攔截
這篇文章介紹了Flutter實(shí)現(xiàn)頁(yè)面路由及404路由攔截的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-11-11Android 4.4以上"沉浸式"狀態(tài)欄效果的實(shí)現(xiàn)方法
Android與ios效果互仿早已不是什么稀奇的事,我猜大概這個(gè)效果來(lái)自ios吧,有爭(zhēng)議說(shuō)這種效果不能叫做沉浸式,叫透明狀態(tài)欄更合適,我也感覺(jué)這和沉浸式的含義不太一致。但是大家都這么叫了,那就這樣唄。下面來(lái)一起看看關(guān)于Android 4.4以上"沉浸式"效果的實(shí)現(xiàn)方法。2016-09-09Kotlin協(xié)程操作之創(chuàng)建啟動(dòng)掛起恢復(fù)詳解
本文的定位是協(xié)程的創(chuàng)建、啟動(dòng)、掛起、恢復(fù),也會(huì)示例一些簡(jiǎn)單的使用,這里不對(duì)suspend講解,,也不對(duì)協(xié)程的高級(jí)用法做闡述(熱數(shù)據(jù)通道Channel、冷數(shù)據(jù)流Flow...),本文主要講協(xié)程稍微深入的全面知識(shí)2022-08-08Android更多條目收縮展開(kāi)控件ExpandView的示例代碼
本篇文章主要介紹了Android更多條目收縮展開(kāi)控件ExpandView的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-01-01Flutter實(shí)現(xiàn)固定header底部滑動(dòng)頁(yè)效果示例
這篇文章主要為大家介紹了Flutter實(shí)現(xiàn)固定header底部滑動(dòng)頁(yè)效果示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12