Android Canvas.drawText

I have a view, I draw with a Canvas object in the onDraw (Canvas canvas) method. My code is:

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

The problem is that the text is not displayed through the background, what am I doing wrong? If I remove canvas.drawPaint (paint) and paint.setColor (android.R.color.black), you can see the text on the screen .....

+64
android android canvas
Apr 16 '10 at 18:49
source share
2 answers

Developed this, it turns out that android.R.color.black is not the same as Color.BLACK. Code changed:

 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 now everything works fine!

+114
Apr 17 '10 at 7:52
source share

It should be noted that the documentation recommends using Layout rather than Canvas.drawText directly. My full answer about using StaticLayout is here , but I will give a brief description 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 more complete example in the context of a user 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(); } } 
+9
Jan 26 '17 at 9:35 on
source share



All Articles