2016-12-18 3 views
2

Я пытаюсь создать пользовательский вид для моего приложения для Android. В функции OnDraw я пытаюсь нарисовать emoji, используя его значение unicode, но это не работает. Ниже приведен код:Рисование emojis на холсте Android с использованием значений 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); 
    } 
} 

Кто-нибудь знает, есть ли здесь работа? Или я делаю что-то неправильно?

EDIT [второй вопрос]: С хака я представил ниже, я вижу, что Emojis оказывают внутри TextView нарисованного на Canvas, но они значительно являются скучнее по сравнению с Emojis, установленной на обычный TextView , как показано ниже:

enter image description here

Любая идея, что я здесь отсутствует?

ответ

1

Для чего это стоит, я нашел хак для этого, что я сам не любит много! В этом случае я создаю Layout (например, LinearLayout) и добавьте TextView, который содержит мои эможи, а затем нарисуйте Layout на Canvas.

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(); 
    } 
} 

Пожалуйста, напишите, если есть лучшее решение.

EDIT

я понял, что StaticLayout это лучший вариант, чтобы нарисовать текст на холсте & не вопрос текста/смайликов становятся скучнее.

Мой модифицированный код (меньше строк, чем ранее):

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(); 
    } 
} 

Вот результат, то Emojis такие же яркие, как и остальные части рисунка на холсте:

enter image description here

0

Проблема заключается в том, что ваш символ эмози находится вне диапазона 0000 - FFFF , поэтому он не может быть представлен как один символ юникода.

Это может быть возможно, если вы правильно кодируете «суррогатные пары юникода» для эмози.

Существует калькулятор для определения правильных суррогатных пар mulitbyte юникода на: http://www.russellcottrell.com/greek/utilities/surrogatepaircalculator.htm

+0

Спасибо , но это не помогает: 'String s = new String (Character.toChars (0xD83C)) + новая строка (Character.toChars (0xDF69)); // Donut canvas.drawText (s, 0.75f ​​* width, 0.50f * height, mPaint); ' – Curious

Смежные вопросы