画布绘图缓存位图稍微模糊或具有抗锯齿

画布绘图缓存位图稍微模糊或具有抗锯齿,第1张

概述在我的应用程序中,我已经滚动了自己的SVG转换器,该转换器将原始SVGXML文件转换为一系列图形矢量对象(绘画,路径等),然后将其应用于Canvas.SVG数据首先与路径列表等一起转换为一种字节码格式,这意味着初始XML解析仅进行一次,然后此后,每次重新绘制SVG图形都可以相当快地进行.SVG

在我的应用程序中,我已经滚动了自己的SVG转换器,该转换器将原始SVG XML文件转换为一系列图形矢量对象(绘画,路径等),然后将其应用于Canvas. SVG数据首先与路径列表等一起转换为一种字节码格式,这意味着初始XML解析仅进行一次,然后此后,每次重新绘制SVG图形都可以相当快地进行. SVG转换是在运行时完成的,这使我能够对各种图形元素执行一些程序 *** 作.例如,我可以在Inkscape中绘制一个图形化的温度表,并且在运行时,代码可以 *** 纵温度表的刻度并移动指针.这就是为什么我需要使用矢量 *** 作绘制静态背景图形以及移动图形的原因,而不是编译静态位图.无论如何,这是我正在做的事情的一些背景信息.我将继续讨论实际问题.

假设一个典型的仪表小部件由两个重叠的视图组成.背景视图包含使用“路径”绘制的静态图形(仪表的圆形表面,数字图例,刻度线).前景视图包含需要经常重绘的指针图形.每个窗口小部件可能都应使用relativeLayout包含这些子视图.

我意识到,只要为前景指针VIEw调用onDraw(),就将为位于其后面的Backgound VIEw调用onDraw.因此,为了优化窗口小部件的重绘时间,我尝试将Canvas的图形缓存用于背景VIEw.我所做的工作确实可以正常工作,并且可以大大提高重绘速度,但是问题是,我保存然后稍后重绘到Canvas的缓存位图从来没有像使用“路径”最初绘制的那样锐利.

我在onDraw()方法中使用的基本VIEw背景代码是:

Bitmap bm = null;onDraw(Canvas canvas){    if(bm!=null){        Paint bitmapPaint = new Paint();        bitmapPaint.setAntiAlias(false);        bitmapPaint.setFilterBitmap(false);        bitmapPaint.setDither(false);        canvas.drawBitmap(bm, 0, 0, bitmapPaint);        return;                 }    ... Vector drawing to the Canvas using Path objects happens here,        performed by the SVG converter object ...     setDrawingCacheEnabled(true);       setDrawingCacheQuality(DRAWING_CACHE_QUAliTY_HIGH);    bm = Bitmap.createBitmap(getDrawingCache());}

为了尝试获得尽可能高的位图质量,我做了以下事情:

>确保高速缓存绘图质量高.
>在绘制位图时,使用了禁用了抗锯齿,抖动等的Paint对象(bitmapPaint).
>知道位图的任何缩放都会立即影响其质量,我(希望)确保无需执行位图的缩放.我已经将VIEw的大小设置为与原始SVG图像完全相同,这意味着我的SVG转换器代码未对Canvas进行缩放.始终由SVG转换器执行scale()调用,但是在当前情况下,它是使用参数canvas.scale(1,1)进行的.如果我有意更改VIEw的宽度/高度以使其与原始SVG图像的宽度/高度不匹配,则Canvas缩放不再是1,1,然后位图的质量进一步下降是非常明显的.

所以我的主要问题是,上面使用图形缓存位图使用的代码是否有问题?我感觉到我不知道的位图发生某种密度/比例变化,即使它在屏幕上显示的尺寸与我绘制的原始图形完全相同.

此外(可能超出了主要问题的范围),在存在前景移动图形时,是否可以使用其他任何方法来避免重绘背景矢量图形?据我所知,到目前为止,使用位图缓存是我所知的唯一方法.

提前致谢;任何建议将不胜感激.

特雷夫

解决方法:

我很高兴地说这个问题现在已经解决.我意识到,首先传递给onDraw()的Canvas已经应用了一些缩放比例.这种缩放存在的事实正在降低位图的质量.但是我不明白为什么画布应该已经有一定的缩放比例.

我在这里发布了另一个问题:In the onDraw() method, why does the supplied Canvas already have scale?.那里被接受的答案表明我可能未指定androID:minSdkVersion.确实,我没有那么愚蠢.一旦指定了minSdkVersion,现在缓存位图就会绘制精美.令人惊讶的是,直到现在我才意识到我所绘制的图像与手机的屏幕分辨率不符.由于缺少minSdkVersion,它们都被缩放.

归功于adamp!

总结

以上是内存溢出为你收集整理的画布绘图缓存位图稍微模糊或具有抗锯齿全部内容,希望文章能够帮你解决画布绘图缓存位图稍微模糊或具有抗锯齿所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1070835.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存