¿Cómo poner texto en un dibujable?

Intento crear un dibujante sobre la marcha para usarlo como fondo para una distribución lineal personalizada. Necesita tener marcas de almohadilla y eso (no es gran cosa), pero también tiene números que marcan las marcas de almohadilla (como una regla). Sé que puedo simplemente crear elementos de texto y ponerlos dentro de la distribución lineal y solo tengo las marcas de almohadilla en el dibujo, pero espero tenerlos también dentro del dibujo, así que no tengo que hacer cálculos de medición dos veces.

Leí el libro “Desarrollo profesional de aplicaciones para Android 2” (por Reto Meier). Entre otros, contiene un proyecto de ejemplo donde se crea una aplicación de brújula simple donde “dibuja” texto, marcadores, etc.

La breve explicación es que creas una clase que amplía la clase android.view.View y anula el onDraw(Canvas) .

Todo el código fuente del libro está disponible para su descarga aquí: http://www.wrox.com/WileyCDA/WroxTitle/Professional-Android-2-Application-Development.productCd-0470565527,descCd-DOWNLOAD.html . Si descargas el código y miras dentro del proyecto llamado “Chapter 4 Compass”, creo que encontrarás lo que estás buscando 🙂

Aquí hay un breve ejemplo de un TextDrawable que funciona como un TextDrawable normal, pero le permite especificar texto como la única variable constructora:

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

Al mirar la respuesta de Plowman e intentar ajustarla a mis necesidades, me topé con una clase que se usa para la cámara en este enlace.

Aquí está el código de la clase TextDrawable . Parece bastante simillar con Plowmans, pero para mí funciona mejor:

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

Para responder a los comentarios anteriores sobre cómo centrar el texto:

 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)