android crosswalk闪退,Crosswalk 首次启动闪烁一下的处理办法(Xamarin.Android)

Crosswalk继承好了Webview之后,出现了一个奇怪现象。首次启动会短暂的黑屏闪烁。

进过查阅发现Xwalk控件Webview内部使用的是surfaceview。

而安卓surfaceview是特殊的控件,它独特缓存和处理机制,默认颜色为黑色#000。系统在第一次添加surfaceview时,会重新activity计算布局,从而导致了画面闪烁。

解决方法:

1、添加一个特别的surfaceview,布局高度和宽度都为0,让系统初始化一次。

activity:

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)

-

c639edc03542?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值