Android Canvas.drawText Android Canvas.drawText android android

Android Canvas.drawText


Worked this out, turns out that android.R.color.black is not the same as Color.BLACK. Changed the code to:

Paint paint = new Paint(); paint.setColor(Color.WHITE); paint.setStyle(Style.FILL); canvas.drawPaint(paint); paint.setColor(Color.BLACK); paint.setTextSize(20); canvas.drawText("Some Text", 10, 25, paint); 

and it all works fine now!!


It should be noted that the documentation recommends using a Layout rather than Canvas.drawText directly. My full answer about using a StaticLayout is here, but I will provide a summary below.

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

Here is a fuller example in the context of a custom view:

enter image description here

public class MyView extends View {    String mText = "This is some text.";    TextPaint mTextPaint;    StaticLayout mStaticLayout;    // use this constructor if creating MyView programmatically    public MyView(Context context) {        super(context);        initLabelView();    }    // this constructor is used when created from xml    public MyView(Context context, AttributeSet attrs) {        super(context, attrs);        initLabelView();    }    private void initLabelView() {        mTextPaint = new TextPaint();        mTextPaint.setAntiAlias(true);        mTextPaint.setTextSize(16 * getResources().getDisplayMetrics().density);        mTextPaint.setColor(0xFF000000);        // default to a single line of text        int width = (int) mTextPaint.measureText(mText);        mStaticLayout = new StaticLayout(mText, mTextPaint, (int) width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false);        // New API alternate        //        // StaticLayout.Builder builder = StaticLayout.Builder.obtain(mText, 0, mText.length(), mTextPaint, width)        //        .setAlignment(Layout.Alignment.ALIGN_NORMAL)        //        .setLineSpacing(1, 0) // multiplier, add        //        .setIncludePad(false);        // mStaticLayout = builder.build();    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        // Tell the parent layout how big this view would like to be        // but still respect any requirements (measure specs) that are passed down.        // determine the width        int width;        int widthMode = MeasureSpec.getMode(widthMeasureSpec);        int widthRequirement = MeasureSpec.getSize(widthMeasureSpec);        if (widthMode == MeasureSpec.EXACTLY) {            width = widthRequirement;        } else {            width = mStaticLayout.getWidth() + getPaddingLeft() + getPaddingRight();            if (widthMode == MeasureSpec.AT_MOST) {                if (width > widthRequirement) {                    width = widthRequirement;                    // too long for a single line so relayout as multiline                    mStaticLayout = new StaticLayout(mText, mTextPaint, width, Layout.Alignment.ALIGN_NORMAL, 1.0f, 0, false);                }            }        }        // determine the height        int height;        int heightMode = MeasureSpec.getMode(heightMeasureSpec);        int heightRequirement = MeasureSpec.getSize(heightMeasureSpec);        if (heightMode == MeasureSpec.EXACTLY) {            height = heightRequirement;        } else {            height = mStaticLayout.getHeight() + getPaddingTop() + getPaddingBottom();            if (heightMode == MeasureSpec.AT_MOST) {                height = Math.min(height, heightRequirement);            }        }        // Required call: set width and height        setMeasuredDimension(width, height);    }    @Override    protected void onDraw(Canvas canvas) {        super.onDraw(canvas);        // do as little as possible inside onDraw to improve performance        // draw the text on the canvas after adjusting for padding        canvas.save();        canvas.translate(getPaddingLeft(), getPaddingTop());        mStaticLayout.draw(canvas);        canvas.restore();    }}