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

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

作者: Imjeef | 来源:发表于2019-02-21 15:10 被阅读0次

    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 更新

    相关文章

      网友评论

          本文标题:Crosswalk 首次启动闪烁一下的处理办法(Xamarin.

          本文链接:https://www.haomeiwen.com/subject/sqiryqtx.html