【问题标题】:Unwanted Warp effect drawing text on path android路径android上不需要的扭曲效果绘制文本
【发布时间】:2013-05-15 10:05:18
【问题描述】:

我对在路径上绘制文本进行了一些测试。我通过将位图设置到画布来制作背景图片。然后,我在画布路径上绘制文本,按矩阵旋转。我必须缩短代码,我只会发布重要的部分,因为它太长了。下面显示的这张图片是用 gimp 裁剪的,所以不要被不同的尺寸激怒。我的 Rect、Path 和 Matrix 对象:

    RectF drawTextOval;
    Path drawTextPath;
    Matrix mDrawnMatrix;

现在,这就是我在圆形路径上绘制文本的方法:

    drawTextOval.set(drawTextPosX - drawTextArc, drawTextPosY
                    - drawTextArc, drawTextPosX + drawTextArc, drawTextPosY
                    + drawTextArc);
            drawTextPath.addArc(drawTextOval, 0, 360);

            drawTextPath.computeBounds(drawTextOval, true);
            mDrawnMatrix.postRotate(drawTextArcStart,
                    (drawTextOval.right + drawTextOval.left) / 2,
                    (drawTextOval.bottom + drawTextOval.top) / 2);
            drawTextPath.transform(mDrawnMatrix);

            patternCanvas.drawTextOnPath(drawText, drawTextPath, 0, 0,
                    mFixedTextPaint); 

到目前为止,一切看起来都很好:

但在保存整个屏幕后,旋转的文本在保存的 .png 图像上看起来会变形。所有其他组件看起来都不错。我用文字、线性或角度画了一些其他的图,所有这些都有效。甚至一些绘制到画布和背景图像的 .png 位图……看起来都正常。但是在圆形路径上绘制的文字是这样的:

我不对位图进行任何缩放,只是将画布图像保存为:

    FileOutputStream fos = new FileOutputStream(saveFile);
        this.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
        Bitmap bitmap = this.getDrawingCache();


        bitmap.compress(CompressFormat.PNG, 100, fos);
        fos.flush();
        fos.close();

为什么文本看起来扭曲?有人看到我的错误吗?提前谢谢...

编辑

我尝试了一些东西,发现在 Manifest 中将任何密度设置为 false 或禁用硬件加速都会在保存前在运行时显示效果。这向我表明,当使用 getDrawingCache() 保存位图时,此时禁用缩放。但为什么呢?

我发现的最后一件事是,曲率越低,文本缩放就越低。如果文字稍微弯曲一点,看起来还不错。

【问题讨论】:

  • 不看代码我注意到保存的图像看起来是方形的,而源图像不是方形的。是这样吗?
  • 感谢您的回复。我只是用 Gimp 裁剪了这张照片,这不是原因。我对在同一画布上绘制的其他位图和笔直或有角度的文本进行了很多测试,一切看起来都不错。只有这个绘制的文本是扭曲的。
  • 你试过getDrawingCache(true)没有吗?
  • 是的,尝试过,但不起作用。看起来保存位图会导致在路径上绘制的文本元素上进行一些额外的缩放。
  • 我尝试创建一个新的位图,在其上创建一个 Canvas,并使用新的画布调用 onDraw(而不是使用 getDrawingCache()。效果仍然存在。我尝试禁用硬件加速,并且然后扭曲效果也在屏幕上可见。这表明使用opengl与实际屏幕的绘制路径不同,并且绘制到内存位图的路径不同。内存路径已损坏。找不到解决方法虽然它。

标签: android path draw geometry warp


【解决方案1】:

我会尝试设置

this.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);

在绘制到屏幕之前,因为较低的质量可能意味着更简单的文本转换。这当然只是猜测。目前,您在写入磁盘之前唯一设置高质量。或者干脆将其从写入磁盘方法中删除,以检查它是否会影响文本的绘制方式。

【讨论】:

    猜你喜欢
    • 2015-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    相关资源
    最近更新 更多