Crosswalk 首次启动闪烁一下的处理办法(Xamarin.

2019-02-21  本文已影响0人  Imjeef

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

以上分为两步
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 更新

上一篇下一篇

猜你喜欢

热点阅读