前面写了个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毫秒越来越近了。
时间: 2024-10-29 19:07:09