Android Canvas.drawText


89

Ich habe eine Ansicht, ich zeichne mit dem Canvas-Objekt in der onDraw-Methode (Canvas-Canvas). Mein Code lautet:

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

Das Problem ist, dass der Text nicht im Hintergrund angezeigt wird. Was mache ich falsch? Wenn ich canvas.drawPaint (paint) und paint.setColor (android.R.color.black) entferne, sehen Sie den Text auf dem Bildschirm .....

Antworten:


148

Es hat sich herausgestellt, dass android.R.color.black nicht mit Color.BLACK identisch ist. Der Code wurde geändert in:

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

und jetzt funktioniert alles gut !!


35
Ja. Wenn Sie die Farbdefinition in der res/colors.xmlDatei mit der ID verwenden möchten, R.color.blackkönnen Sie nicht einfach die ID verwenden. Wenn Sie den tatsächlichen Farbwert aus den Ressourcen erhalten möchten, verwenden Siepaint.setColor(getResources().getColor(R.color.black));
Matt Gibson

Weiß jemand, wie man Text in Android Canvas ShapeDrawable mit RectShape zeichnet ?
LOG_TAG

1
und zum Einstellen der Textgröße in können dpSie dies verwenden
SMMousavi

Es ist wichtig, den Stil auf FILL zurückzusetzen, da er sonst Ihren Text (mit möglicherweise sehr dicken Linien) streicheln und sehr fett und hässlich aussehen kann.
Chase Roberts

Hier im drawText ("Some Text", 10,25, paint); es bedeutet, dass der linke Rand 10 und der obere Rand 25 ist. Habe ich recht?
Prinz

33

Es ist zu beachten, dass in der Dokumentation die Verwendung von a Layoutanstelle von Canvas.drawTextdirekt empfohlen wird. Meine vollständige Antwort zur Verwendung von a StaticLayoutist hier , aber ich werde unten eine Zusammenfassung geben.

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

Hier ist ein ausführlicheres Beispiel im Kontext einer benutzerdefinierten Ansicht:

Geben Sie hier die Bildbeschreibung ein

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();
    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.