zoukankan      html  css  js  c++  java
  • View优化

    前面写了个View画圆弧,为了让他和底层图片效果融合,采用先把圆弧画到和图片一样大小的画布上,然后用canvas的变换位图方法映射过去。

            bitmapWithReflection = Bitmap.createBitmap(swidth, sheight, Config.ARGB_8888);
            canvas_bm = new Canvas(bitmapWithReflection);
            canvas_bm.drawArc(oval, -90, ((float) progress / maxProgress) * 360, false, deafaultPaint); // 绘制进度圆弧,这里是蓝色
            canvas.drawBitmap(bitmapWithReflection, new Rect(0, 0, swidth, sheight), rect, null);

    可是通过traceView分析到,ViewRootImpl.onDraw函数平均时间为72.808那是远大于16,卡是必然的,我们发现里面的自定义view的onDraw函数时间就达24ms之多,主要是在createBitmap和gc上耗时较大。

    跟踪ImageView的fill_center模式,发现他并没有耗时这么长,原来它直接用matrix对canvas进行变换,省去了上述两个最耗时的操作。

            canvas.save();
            matrix = new Matrix();
            matrix.setRectToRect(oval_src, rect, ScaleToFit.CENTER);
            canvas.concat(matrix);
            canvas.drawArc(oval, -90, ((float) progress / maxProgress) * 360, false, deafaultPaint); // 绘制进度圆弧,这里是蓝色
            canvas.restore();

    这里的自定义view ondraw函数时间不到1ms减小了很多,目前RootView时间为48ms,还是卡,有待进一步优化。

    后续:

    整了一下午,写了个测试程序,使用的属性动画,底层可以看到是调用openGL的交换缓冲区实现,onDraw控制在14毫秒左右;

    可我自己的程序删减得代码都一样了,底层始终在调imageView的draw bitmap,它的时间就在30秒以上,那个伤心呀。

    后面准备把测试程序的activity弄过来一步一步加看到底怎么回事,弄过来才发现,好好的代码时间也在30毫秒以上了。

    看AndroidManifest.xml发现一个是sdk 11一个是14,修改过来,现在的时间在21毫秒了,效果还是有提过的,离16毫秒越来越近了。

  • 相关阅读:
    python处理yml
    awk命令笔记
    微信小程序wxml的数据传给js 点击事件 js获取view中的内容
    微信小程序js 字符串截取
    微信小程序 wx:if 多条件判断
    微信小程序 --- toast消息提示框
    微信小程序 点击事件获取到的 event.currentTarget.dataset.id 是空的 解决办法
    微信小程序页面跳转传参数
    微信小程序开发框架
    微信小程序获取当前时间
  • 原文地址:https://www.cnblogs.com/Empenguin/p/3713602.html
Copyright © 2011-2022 走看看