之前項(xiàng)目里集成了flutter,由于我們的項(xiàng)目是單activity多fragment的結(jié)構(gòu)(似乎google最近也開始瘋狂推這個結(jié)構(gòu)),理所當(dāng)然的把flutterview嵌到一個fragment里。然后當(dāng)渲染這個fragment的時候出現(xiàn)黑屏閃爍,這是由于flutterview是繼承surfaceview的,surfaceview初次渲染的時候自然會產(chǎn)生黑屏。搜了一下解決方案可以通過setZOrderOnTop解決,然而當(dāng)設(shè)置了zorder之后如果在當(dāng)前fragment上再啟動別的fragment會出現(xiàn)無效的情況。最后跟進(jìn)surfaceview源碼,發(fā)現(xiàn)只要把flutterview設(shè)置一個背景透明色就可以完美的解決這個問題。當(dāng)然要配合 getWindow().setFormat(PixelFormat.TRANSLUCENT)。具體有機(jī)會后面再細(xì)說。
當(dāng)這個問題解決之后我又遇到一個新的問題,那就是當(dāng)我成功的從集成flutter頁面的fragment跳轉(zhuǎn)到原生的fragment后,再次跳轉(zhuǎn)到flutter的fragment出現(xiàn)的卻是上一次flutter頁面的ui。仔細(xì)分析,感覺是surfaceview疊加導(dǎo)致的,因?yàn)殡m然ui沒有刷新,但是點(diǎn)擊事件相關(guān)操作卻是正常的。迫于時間畢竟緊,我找出了一個臨時的work around方案,后續(xù)再繼續(xù)跟進(jìn)
override fun onResume() {
onResume()
placeHolderView.background = null
flutterView.visibility = View.VISIBLE
}
override fun onPause() {
onPause()
placeHolderView.background = BitmapDrawable(resources, flutterView.bitmap)
//這里post的原因是為了改善切換時候的閃爍
placeHolderView.post { flutterView.visibility = View.INVISIBLE }
}