Как нарисовать текст на холсте? - PullRequest
30 голосов
/ 28 октября 2010

Я пытаюсь разработать простой класс круговой диаграммы для Android.На данный момент он может взять карту меток и значений и нарисовать круговую диаграмму.Я еще не добавил легенды для пирога, где мне нужно разместить тексты возле маленьких прямоугольников в углу экрана.Любая помощь приветствуется, так как я новичок в разработке Android.

Ответы [ 3 ]

51 голосов
/ 28 июля 2013

Вам нужно будет использовать метод drawText класса Canvas.

Paint paint = new Paint(); 
canvas.drawPaint(paint); 
paint.setColor(Color.BLACK); 
paint.setTextSize(16); 
canvas.drawText("My Text", x, y, paint); 

Вот соответствующая документация об этом:

http://developer.android.com/reference/android/graphics/Canvas.html#drawText(java.lang.String, float, float, android.graphics.Paint)

8 голосов
/ 26 января 2017

Раньше здесь был другой ответ, который был удален, потому что это была только ссылка. Исходная ссылка здесь . Код в основном такой же, но я вынул части для нетекстового рисования, а также увеличил размеры, чтобы лучше работать на современных плотностях экрана.

Это просто показывает несколько вещей, которые вы можете сделать с рисованием текста.

enter image description here

Вот обновленный код:

public class MainActivity extends AppCompatActivity {

    DemoView demoview;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        demoview = new DemoView(this);
        setContentView(demoview);
    }

    private class DemoView extends View {
        public DemoView(Context context){
            super(context);
        }

        @Override protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            // custom drawing code here
            // remember: y increases from top to bottom
            // x increases from left to right
            int x = 0;
            int y = 0;
            Paint paint = new Paint();
            paint.setStyle(Paint.Style.FILL);

            canvas.save();
            canvas.translate(100, 200);

            // make the entire canvas white
            canvas.drawColor(Color.WHITE);

            // draw some text using STROKE style
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(1);
            paint.setColor(Color.MAGENTA);
            paint.setTextSize(100);
            canvas.drawText("Style.STROKE", 0, 0, paint);

            canvas.translate(0, 200);

            // draw some text using FILL style
            paint.setStyle(Paint.Style.FILL);
            //turn antialiasing on
            paint.setAntiAlias(true);
            //paint.setTextSize(30);
            canvas.drawText("Style.FILL", 0, 0, paint);

            canvas.translate(0, 200);

            // draw some rotated text
            // get text width and height
            // set desired drawing location
            x = 75;
            y = 185;
            paint.setColor(Color.GRAY);
            //paint.setTextSize(25);
            String str2rotate = "Rotated!";

            // draw bounding rect before rotating text
            Rect rect = new Rect();
            paint.getTextBounds(str2rotate, 0, str2rotate.length(), rect);
            canvas.translate(x, y);
            paint.setStyle(Paint.Style.FILL);
            // draw unrotated text
            canvas.drawText("!Rotated", 0, 0, paint);
            paint.setStyle(Paint.Style.STROKE);
            canvas.drawRect(rect, paint);
            // undo the translate
            canvas.translate(-x, -y);

            // rotate the canvas on center of the text to draw
            canvas.rotate(-45, x + rect.exactCenterX(),
                    y + rect.exactCenterY());
            // draw the rotated text
            paint.setStyle(Paint.Style.FILL);
            canvas.drawText(str2rotate, x, y, paint);

            //undo the translation and rotation
            canvas.restore();
        }
    }
}

Еще кое-что, что я хочу попробовать позже - это рисование текста по пути .

См. Также этот более полный ответ здесь , который дает следующее изображение.

enter image description here

1 голос
/ 26 января 2017

Другой (возможно, лучший) способ рисования текста на холсте - это использование StaticLayout. Это обрабатывает многострочный текст при необходимости.

String text = "This is some text.";

TextPaint textPaint = new TextPaint();
textPaint.setAntiAlias(true);
textPaint.setTextSize(16 * getResources().getDisplayMetrics().density);
textPaint.setColor(0xFF000000);

int width = (int) textPaint.measureText(text);
StaticLayout staticLayout = new StaticLayout(text, textPaint, (int) width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false);
staticLayout.draw(canvas);

TextPaint и StaticLayout были созданы непосредственно перед тем, как их использовать здесь для иллюстрации. Однако в onDraw это ухудшит производительность. Вот лучший пример , показывающий их в контексте пользовательского представления, которое рисует свой собственный текст.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...