web-dev-qa-db-fra.com

Comment mettre du texte dans un dessinable?

J'essaie de créer un dessinable à la volée à utiliser comme arrière-plan pour une disposition linéaire personnalisée. Il doit avoir des marques de hachage et autres (pas grand-chose), mais aussi des numéros étiquetant ce que sont les marques de hachage (comme une règle). Je sais que je peux simplement créer des éléments de texte et les mettre à l'intérieur de la disposition linéaire et avoir juste les marques de hachage dans le dessinable, mais j'espère les avoir également à l'intérieur du dessinable, donc je n'ai pas à faire deux fois des calculs de mesure.

33
atraudes

J'ai lu le livre "Professional Android 2 Application Development" (par Reto Meier). Entre autres, il contient un exemple de projet où vous créez une application boussole simple où vous "dessinez" du texte, marqueurs etc.

La brève explication est que vous créez une classe qui étend la classe Android.view.View Et remplace la méthode onDraw(Canvas).

Tout le code source du livre est disponible en téléchargement ici: http://www.wrox.com/WileyCDA/WroxTitle/Professional-Android-2-Application-Development.productCd-0470565527,descCd-DOWNLOAD.html . Si vous téléchargez le code et regardez à l'intérieur du projet nommé "Chapter 4 Compass", je pense que vous trouverez ce que vous cherchez :)

14
Julian

Voici un bref exemple d'un TextDrawable qui fonctionne comme un dessinable normal mais vous permet de spécifier du texte comme seule variable constructeur:

public class TextDrawable extends Drawable {

    private final String text;
    private final Paint paint;

    public TextDrawable(String text) {

        this.text = text;

        this.Paint = new Paint();
        Paint.setColor(Color.WHITE);
        Paint.setTextSize(22f);
        Paint.setAntiAlias(true);
        Paint.setFakeBoldText(true);
        Paint.setShadowLayer(6f, 0, 0, Color.BLACK);
        Paint.setStyle(Paint.Style.FILL);
        Paint.setTextAlign(Paint.Align.LEFT);
    }

    @Override
    public void draw(Canvas canvas) {
        canvas.drawText(text, 0, 0, Paint);
    }

    @Override
    public void setAlpha(int alpha) {
        Paint.setAlpha(alpha);
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
        Paint.setColorFilter(cf);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }
}
92
plowman

En regardant la réponse de Ploughman et en essayant de l'adapter à mes besoins, je suis tombé sur une classe qui est utilisée pour Appareil photo dans ce lien

Voici le code de la classe TextDrawable . Cela ressemble assez à Ploughmans mais pour moi ça marche mieux:

import Android.content.res.Resources;
import Android.graphics.Canvas;
import Android.graphics.Color;
import Android.graphics.ColorFilter;
import Android.graphics.Paint;
import Android.graphics.Paint.Align;
import Android.graphics.Rect;
import Android.graphics.drawable.Drawable;
import Android.util.TypedValue;

public class TextDrawable extends Drawable {
    private static final int DEFAULT_COLOR = Color.WHITE;
    private static final int DEFAULT_TEXTSIZE = 15;
    private Paint mPaint;
    private CharSequence mText;
    private int mIntrinsicWidth;
    private int mIntrinsicHeight;

    public TextDrawable(Resources res, CharSequence text) {
        mText = text;
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        mPaint.setColor(DEFAULT_COLOR);
        mPaint.setTextAlign(Align.CENTER);
        float textSize = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP,
                DEFAULT_TEXTSIZE, res.getDisplayMetrics());
        mPaint.setTextSize(textSize);
        mIntrinsicWidth = (int) (mPaint.measureText(mText, 0, mText.length()) + .5);
        mIntrinsicHeight = mPaint.getFontMetricsInt(null);
    }
    @Override
    public void draw(Canvas canvas) {
        Rect bounds = getBounds();
        canvas.drawText(mText, 0, mText.length(),
                bounds.centerX(), bounds.centerY(), mPaint);
    }
    @Override
    public int getOpacity() {
        return mPaint.getAlpha();
    }
    @Override
    public int getIntrinsicWidth() {
        return mIntrinsicWidth;
    }
    @Override
    public int getIntrinsicHeight() {
        return mIntrinsicHeight;
    }
    @Override
    public void setAlpha(int alpha) {
        mPaint.setAlpha(alpha);
    }
    @Override
    public void setColorFilter(ColorFilter filter) {
        mPaint.setColorFilter(filter);
    }
}
6
Jimmy Kane

Pour répondre aux commentaires ci-dessus concernant la manière de centrer le texte:

mPaint.textAlign = Align.CENTER
...
// Centering for mixed case letters
canvas.drawText(mText, 0, mText.length,
        bounds.centerX().toFloat(), bounds.centerY().toFloat() - ((mPaint.descent() + mPaint.ascent()) / 2), mPaint)

// Centering for all uppercase letters
canvas.drawText(mText, 0, mText.length,
            bounds.centerX().toFloat(), bounds.centerY().toFloat() - mPaint.ascent() / 2, mPaint)
2
user2241362