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.
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 :)
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;
}
}
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);
}
}
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)