How to draw text on canvas?
You will have to use the drawText method of the Canvas class.
Paint paint = new Paint(); canvas.drawPaint(paint); paint.setColor(Color.BLACK); paint.setTextSize(16); canvas.drawText("My Text", x, y, paint);
Here's the relevant documentation about it:
There used to be another answer here that got deleted because it was a link only. The original link is here. The code is basically the same, but I took out the non text drawing portions and also scaled up the sizes to work better on modern screen densities.
This just shows a few things you can do with text drawing.
Here is the updated code:
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(); } }}
Something else that I want to try later is drawing text along a path.
See also this fuller answer here that gives the following image.
Another (arguably better) way to draw text on a canvas is to use a StaticLayout
. This handles multiline text when needed.
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);
The TextPaint
and StaticLayout
were instantiated right before being used here for the sake of illustration. Doing so in onDraw
would hurt performance, though. Here is a better example showing them in the context of a custom view that draws it's own text.