当前位置: 首页 > 知识库问答 >
问题:

使用Unicode值在Android画布上绘制表情符号

宗政燕七
2023-03-14

我正在尝试为我的android应用程序创建自定义视图。在OnDraw函数中,我试图使用其Unicode值绘制表情符号,但这似乎不起作用。以下是代码:

public class Scale extends View {
    private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private final static int LINE_WIDTH = 10;
    ...
    ...
    @Override
    protected void onDraw(final Canvas canvas) {
        super.onDraw(canvas);
        mPaint.setStyle(Paint.Style.STROKE);
        mPaint.setStrokeWidth(LINE_WIDTH);
        mPaint.setColor(Color.BLUE);
        ...
        ...
        //This works
        canvas.drawText("My text", 0.05f*width, 0.80f*height, mPaint);
        //But this does NOT draw a doughnut!!
        String s = new String(Character.toChars(0x1F369)); //Doughnut
        canvas.drawText(s, 0.75f*width, 0.50f*height, mPaint);
    }
}

有人知道这附近有没有工作吗?还是我做错了什么?

编辑[第二个问题]:通过我在下面提交的hack,我看到Emojis正在Canvas上绘制的TextView内渲染,但与在正常TextView上设置的Emojis相比,它们显着变钝,如下所示:

你知道我错过了什么吗?

共有2个答案

谢承
2023-03-14

问题是您的表情符号字符在0000-FFFF范围之外,因此它不能表示为单个Unicode字符。

如果您为表情符号正确编码“unicode代理项对”,这可能是可能的。

有一个计算器可以在以下位置确定多字节unicode的正确代理项对:http://www.russellcottrell.com/greek/utilities/surrogatepaircalculator.htm

卓新知
2023-03-14

无论如何,我已经找到了一种破解方法,我自己也不太喜欢!在这里,我创建了一个布局(例如线性布局),并添加了一个包含表情符号的文本视图,然后在画布上绘制布局。

public class Scale extends View {
    private final Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    private final LinearLayout layout;
    ...
    ...
    public Scale(final Context context, ...) {
        super(context);
        ...
        ...
        //Initialise the layout & add a TextView with the emoji in it
        layout = new LinearLayout(context);
        final TextView tv = new TextView(context);
        tv.setText(new String(Character.toChars(0x1F369))); //Doughnut
        layout.addView(tv);
        layout.measure(50, 50);
        layout.layout(0, 0, 50, 50);
    }
    @Override
    protected void onDraw(final Canvas canvas) {
        super.onDraw(canvas);
        ...
        ...
        canvas.translate(20, 20); //Translate if necessary
        //Draw the layout on the canvas, draws a doughnut!!
        layout.draw(canvas);
        canvas.save();
        canvas.restore();
    }
}

请张贴,如果有更好的解决方案。

编辑

我发现静态布局是在画布上绘制文本的更好选择

我修改的代码(比以前少了几行):

public class Scale extends View {
    private final TextPaint tPaint = new TextPaint();
    private final StaticLayout lsLayout;
    ...
    ...
    public Scale(final Context context, ...) {
        super(context);
        ...
        ...
        //Initialise the layout & add a TextView with the emoji in it
        String emoji = new String(Character.toChars(0x1F369))); //Doughnut
        lsLayout = new StaticLayout(emoji, tPaint, 80, Layout.Alignment.ALIGN_CENTER, 1, 1, true);
    }
    @Override
    protected void onDraw(final Canvas canvas) {
        super.onDraw(canvas);
        ...
        ...
        canvas.translate(20, 20); //Translate if necessary
        //Draw the layout on the canvas, draws a doughnut as bright as the rest of the canvas!!
        lsLayout.draw(canvas);
        canvas.save();
        canvas.restore();
    }
}

结果是,表情符号与画布上的其他图形一样明亮:

 类似资料:
  • 问题内容: 我正在尝试在Android的Canvas对象上绘制九个补丁。看起来很奇怪的是,尽管我使用draw9patch工具生成了我的九个补丁,但NinePatch的构造函数需要一个额外的字节数组“ chunk”来构造这九个补丁。 为什么这样不简单?什么是“块”?如果您自己完成此操作,您是如何进行的? 任何帮助表示赞赏。 问题答案: 您可以通过以下方式轻松实现:

  • 如何获取我手指的触摸事件和运动事件然后绘制?

  • 我的任务是在画布上绘制许多矩形,但所有矩形都有一个旋转角度,它们必须在画布上旋转。我在寻找这个问题的解决方案时遇到的许多建议都指出了绘制一个矩形并旋转画布的方法(canvas.rotate(angle)),但它会旋转所有画布,并且只能使用一个矩形。在画布上绘制许多旋转矩形的最佳方法是什么?我想画矩形(单色,带颜料),但不是位图,因为时间效率和内存。 目前我主要的方法是创建一堆画布,在每个画布上绘制

  • 我想在画布上画一段视频。为了实现这一点,我在Javascript中捕获onMouseDown和onMouseUp事件,以获得每个事件的x和y坐标(我需要在画布中设置视频的位置、宽度和高度)。 因此,每次我在画布上绘制视频时,我创建的上一个视频都应该停止,并且必须播放新的视频。两个问题: 1)视频不播放(功能只画第一帧),但他的音频可以 2) 如何停止以前绘制的视频? 演示:http://jsfid

  • 我试图编写一个SWT组件,它能够采取和绘制的实例。我的问题是SWT的和AWT的不兼容:SWT组件不能绘制,AWT/Swing组件不能绘制。 有几种方法试图以其他方式解决这个问题(也可能有一些变化,但基本上有以下两种): 在SWT图像和AWT BuffereImage之间转换 他们都有缺点,没有满足我的期望: 第一种方法是将SWT转换为,由于为每个像素创建了一个新的实例,因此对大图像的性能较差 第二