2010-10-19 17 views
24

Estoy tratando de crear un dibujable sobre la marcha para usar 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.¿Cómo poner el texto en un dibujable?

Respuesta

11

He leído el libro "Desarrollo de aplicaciones Professional Android 2" (por Reto Meier). Entre otros, contiene un proyecto de ejemplo que se puede crear una aplicación simple brújula en el que "dibuja" el texto, marcadores, etc.

La breve explicación es que se crea una clase que amplía la clase android.view.View y reemplaza el método 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 descarga el código y mira dentro del proyecto llamado "Capítulo 4 Brújula", creo que encontrará lo que está buscando :)

+0

canvas.drawText (...) era exactamente lo que estaba buscando. ¡Gracias! – atraudes

81

Aquí hay un breve ejemplo de TextDrawable que funciona como un dibujo normal pero permite especifica el texto como la única variable constructor:

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

¡Súper, justo lo que necesitaba! – Bostone

+0

funciona bien, el único problema es que el texto se muestre de ancho. Estoy dibujando texto en (x, y) de acuerdo con el progreso. donde x = progreso * seekBar.getWidth()/seekBar.getMax() e y = seekBar.getHeight()/2. ¿Puede por favor decirme dónde está mi error para calcular las coordenadas x, y? –

+0

ok, funciona perfecto. ese fue mi error He puesto relleno (izquierdo y derecho) de la barra de búsqueda. Gracias labrador. –

4

en cuanto a la respuesta de labrador y tratando de adaptarse a mis necesidades me stumpled en una clase que se utiliza para Camera in this link

Aquí está el código de la TextDrawable Class. 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); 
    } 
} 
+0

Me parece un poco cortada y no centrada correctamente: https://i.stack.imgur.com/2xRyf.png. ¿Puedes verificar el código otra vez? –

+0

@androiddeveloper lamentablemente no puedo por el momento. –

+0

Lástima. Tu código es el único que encontré decente. –

Cuestiones relacionadas