【问题标题】:emojis not rotating with canvas表情符号不随画布旋转
【发布时间】:2016-04-01 22:24:58
【问题描述】:

我创建了一个允许用户使用文本(包括表情符号)进行绘画的应用程序。用户可以根据自己的喜好旋转和调整文本大小。当用户旋转包含表情符号的文本时会出现此问题。

如您所见,存在不必要的重叠。我推断这是因为我绘制了两次文本以实现边框效果。有趣的是,如果文本大小超过一定数量,问题就会自行解决。这可以在最底部的测试中看到。

这是绘制上图的代码:

    public void draw(Canvas c, int x, int y) {

    Rect re = new Rect();
    Paint p = new Paint();
    p.setColor(this.color);
    p.setTextSize(this.GetSize());
    p.getTextBounds(text, 0, text.length(), re);
    p.setAntiAlias(true);

    c.save();
    c.rotate(rotation_deg, x, y);

    c.drawText(text, x - re.width() / 2, y + ((re.height() - re.bottom) - re.height() / 2), p);

    p.setStyle(Paint.Style.STROKE);
    p.setColor(color2);
    c.drawText(text, x - re.width() / 2, y + ((re.height() - re.bottom) - re.height() / 2), p);

    c.restore();
}

删除第一个绘图命令修复了表情符号问题,但我只得到了文字笔划。

如何旋转包含表情符号的文本?

一种可能的解决方案是先绘制位图,然后旋转位图,但此过程会浪费内存和时间。

【问题讨论】:

    标签: java android drawing android-canvas


    【解决方案1】:

    既然您知道如何解决问题,我将使用Paint.setShadowLayer(float radius, float dx, float dy, int shadowColor) 进行调查,而不是两次绘制文本。

    public void setShadowLayer (float radius, float dx, float dy, int shadowColor)

    这会在主层下方绘制一个阴影层,具有指定的偏移量和颜色以及模糊半径。如果radius为0,则阴影层被移除。

    可用于在文本下方创建模糊阴影。与其他绘图操作一起使用的支持受限于软件渲染管道。

    如果阴影颜色不透明,则阴影的 alpha 将是油漆的 alpha,否则,阴影颜色的 alpha 将是阴影颜色。

    public void draw(Canvas c, int x, int y) {
    
        Rect re = new Rect();
        Paint p = new Paint();
        p.setColor(this.color);
        p.setTextSize(this.GetSize());
        p.getTextBounds(text, 0, text.length(), re);
        p.setAntiAlias(true);
        p. setShadowLayer (2.0f, 2.0f, -2.0f, this.color);
    
        c.save();
        c.rotate(rotation_deg, x, y);
    
        p.setStyle(Paint.Style.FILL_AND_STROKE);
        //p.setStyle(Paint.Style.FILL);
    
        p.setColor(color2);
        c.drawText(text, x - re.width() / 2, y + ((re.height() - re.bottom) - re.height() / 2), p);
    
        c.restore();
    }
    

    【讨论】:

    • 我不知道如何在不浪费内存的情况下解决问题。我正在尝试在像 stackoverflow.com/questions/9132781/… 这样的画布上以一定角度绘制带有边框的文本。问题是,当我旋转文本时,表情符号不会旋转。我尝试实现您建议的阴影层,但它也没有工作......表情符号仍然不随文本旋转。虽然阴影效果很酷! :)
    • @Fence_rider 很奇怪。在您最初的问题中,您提到如果您删除了第一个绘图命令,问题就解决了。所以你是说你这样做并添加了 setShadowLayer 调用,问题又回来了?
    • 不完全...当我删除第一个绘图命令时,表情符号与文本对齐,但文本没有填充,只有一个边框。所以我尝试设置阴影并删除导致表情符号对齐的第一个绘制命令,但仍然没有填充。也许我把阴影设置错了,它只是导致文本周围有一团黑云
    • 是的,p.setStyle(Paint.Style.STROKE) 只给你边框。尝试设置阴影并注释掉第一个绘制命令和p.setStyle(Paint.Style.STROKE) 行。
    • @Fence_rider 或者不要评论它尝试将其更改为 Paint.Style.FILL_AND_STROKEPaint.Style.FILL
    【解决方案2】:

    将图层类型设置为软件。 问题会解决的

     textView.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
    

    【讨论】:

      猜你喜欢
      • 2015-10-01
      • 2014-02-01
      • 2020-02-27
      • 2022-10-23
      • 2016-07-29
      • 1970-01-01
      • 1970-01-01
      • 2017-08-06
      • 2013-04-06
      相关资源
      最近更新 更多