Crosswalk继承好了Webview之后,出现了一个奇怪现象。首次启动会短暂的黑屏闪烁。
进过查阅发现Xwalk控件Webview内部使用的是surfaceview。
而安卓surfaceview是特殊的控件,它独特缓存和处理机制,默认颜色为黑色#000。系统在第一次添加surfaceview时,会重新activity计算布局,从而导致了画面闪烁。
解决方法:
1、添加一个特别的surfaceview,布局高度和宽度都为0,让系统初始化一次。
activity:
<SurfaceView
android:layout_width="0dp"
android:layout_height="0dp" />
代码:
var surfaceView = new SurfaceView(this);
surfaceView.Layout(0, 0, 0, 0);
this.AddContentView(surfaceView, new ViewGroup.LayoutParams(0, 0));
2、对surfaceview设置默认颜色透明
surfaceView.SetBackgroundColor(Android.Graphics.Color.White);
surfaceView.Holder.SetFormat(Android.Graphics.Format.Transparent);
实际的应用中并不是很理想,调试模式下可能是运行缓慢的原因感觉上效果比较好。
经查看CrossWalk的源代码,发现在XWalkView中使用了surfaceview。
我们可以在构造完成这个对象后(显示前设置surfaceview)
以上分为两步
1、在构造对象是实例化了SurfaceView
2、在postXWalkViewInternalContextConstructor
(reflectionInit方法内触发,应该时需要初始化crosswalk内核时调用)。这是侯进行对象的移除。
图中的 removeViewAt(0);
在Create XWalkView的时候
var xWalkView = this.findViewById(xxx);
val b = xWalkView.getChildAt(0) as XWalkViewBridge
surfaceView = (b.getChildAt(0) as ViewGroup).getChildAt(0) as SurfaceView
//设置SurfaceView样式
surfaceView.SetBackgroundColor(Android.Graphics.Color.White);
surfaceView.Holder.SetFormat(Android.Graphics.Format.Translucent);
按照这样的设置应该会稍好一些。
注意:以上代码是Xamarin.Android,java的小伙伴请注意做一下转换。
2019-12-17 23:18 更新
网友评论