Android Canvas.drawText

91

J'ai une vue, je dessine avec l'objet Canvas dans la méthode onDraw (Canvas canvas). Mon code est:

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

Le problème est que le texte n'apparaît pas à travers l'arrière-plan, qu'est-ce que je fais de mal? Si je supprime le canvas.drawPaint (paint) et paint.setColor (android.R.color.black), vous pouvez voir le texte à l'écran .....

Gaz
la source

Réponses:

153

Cela a fonctionné, il s'avère que android.R.color.black n'est pas le même que Color.BLACK. Le code a été remplacé par:

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

et tout fonctionne bien maintenant !!

Gaz
la source
35
Oui. Si vous souhaitez utiliser la définition de couleur dans le res/colors.xmlfichier avec l'ID R.color.black, vous ne pouvez pas simplement utiliser l'ID. Si vous souhaitez obtenir la valeur de couleur réelle à partir des ressources, utilisezpaint.setColor(getResources().getColor(R.color.black));
Matt Gibson
Quelqu'un sait comment dessiner du texte dans Android Canvas ShapeDrawable avec RectShape ?
LOG_TAG
1
et pour définir la taille du texte, dpvous pouvez l'utiliser comme ceci
SMMousavi
Il est important de réinitialiser le style sur FILL, sinon cela risque de tracer votre texte (avec des lignes potentiellement très épaisses) et d'avoir l'air vraiment gras et laid.
Chase Roberts
Ici, dans le drawText ("Some Text", 10,25, paint); cela signifie que la marge de gauche est de 10 et la marge du haut de 25. ai-je raison?
Prince Dholakiya le
37

Il convient de noter que la documentation recommande d'utiliser a Layoutplutôt que Canvas.drawTextdirectement. Ma réponse complète sur l'utilisation d'un StaticLayoutest ici , mais je vais fournir un résumé ci-dessous.

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

Voici un exemple plus complet dans le contexte d'une vue personnalisée:

entrez la description de l'image ici

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();
    }
}
Suragch
la source