Cómo dibujar el texto sobre lienzo?
Estoy tratando de desarrollar una clase simple de gráfico circular para android. Por ahora, puede tomar un mapa de etiquetas y valores y dibujar el gráfico circular. Todavía estoy para añadir las leyendas para el pastel, que es donde tengo que colocar los textos cerca de pequeños rectángulos en la esquina de la pantalla. Cualquier ayuda apreciada, ya que soy nuevo en Android dev.
- Cómo dibujar una porción de mapa de bits a través de lienzo DrawBitmap
- Inclinar un mapa de bits sólo en la dirección vertical
- Cómo rotar un lienzo en un punto específico usando android.graphics.Camera.rotateX (angle)
- Cómo corregir "lienzo: intentando utilizar un error de mapa de bits reciclado"?
- Cómo dibujar con una pintura "invertida" en Android Canvas?
- Dibuja un camino curvo en la lona?
- Android canvas drawText y-posición del texto
- Android: ¿Cómo manejar el dibujo con métodos de lienzo en diferentes tamaños de pantalla?
- Dibujo personalizado en la lona del mapa de Mapbox
- Tabla de Donuts Android
- Cómo dibujar una línea curva en android?
- RecyclerView con elementos personalizados
- Dibuja un árbol (literalmente) con círculos en Android: no es una estructura de árbol
Tendrás que usar el método drawText de la clase Canvas.
Paint paint = new Paint(); canvas.drawPaint(paint); paint.setColor(Color.BLACK); paint.setTextSize(16); canvas.drawText("My Text", x, y, paint);
Aquí está la documentación pertinente al respecto:
http://developer.android.com/reference/android/graphics/Canvas.html#drawText(java.lang.String, float, float, android.graphics.Paint)
Solía haber otra respuesta aquí que se borró porque era un enlace. El enlace original está aquí . El código es básicamente el mismo, pero he sacado las porciones de dibujo no texto y también ampliado los tamaños para trabajar mejor en densidades de pantalla modernas.
Esto sólo muestra algunas cosas que puede hacer con el dibujo de texto.
Aquí está el código actualizado:
public class MainActivity extends AppCompatActivity { DemoView demoview; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); demoview = new DemoView(this); setContentView(demoview); } private class DemoView extends View { public DemoView(Context context){ super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // custom drawing code here // remember: y increases from top to bottom // x increases from left to right int x = 0; int y = 0; Paint paint = new Paint(); paint.setStyle(Paint.Style.FILL); canvas.save(); canvas.translate(100, 200); // make the entire canvas white canvas.drawColor(Color.WHITE); // draw some text using STROKE style paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(1); paint.setColor(Color.MAGENTA); paint.setTextSize(100); canvas.drawText("Style.STROKE", 0, 0, paint); canvas.translate(0, 200); // draw some text using FILL style paint.setStyle(Paint.Style.FILL); //turn antialiasing on paint.setAntiAlias(true); //paint.setTextSize(30); canvas.drawText("Style.FILL", 0, 0, paint); canvas.translate(0, 200); // draw some rotated text // get text width and height // set desired drawing location x = 75; y = 185; paint.setColor(Color.GRAY); //paint.setTextSize(25); String str2rotate = "Rotated!"; // draw bounding rect before rotating text Rect rect = new Rect(); paint.getTextBounds(str2rotate, 0, str2rotate.length(), rect); canvas.translate(x, y); paint.setStyle(Paint.Style.FILL); // draw unrotated text canvas.drawText("!Rotated", 0, 0, paint); paint.setStyle(Paint.Style.STROKE); canvas.drawRect(rect, paint); // undo the translate canvas.translate(-x, -y); // rotate the canvas on center of the text to draw canvas.rotate(-45, x + rect.exactCenterX(), y + rect.exactCenterY()); // draw the rotated text paint.setStyle(Paint.Style.FILL); canvas.drawText(str2rotate, x, y, paint); //undo the translation and rotation canvas.restore(); } } }
Algo más que quiero probar más tarde es dibujar texto a lo largo de un camino .
Véase también esta respuesta más completa aquí que da la siguiente imagen.
Otra manera (posiblemente mejor) de dibujar el texto en un lienzo es usar un StaticLayout
. Esto maneja el texto multilínea cuando es necesario.
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);
El TextPaint
y StaticLayout
fueron instanciados justo antes de ser utilizados aquí por el bien de la ilustración. Hacerlo en onDraw
afectaría el rendimiento, sin embargo. Aquí hay un mejor ejemplo que muestra en el contexto de una vista personalizada que dibuja su propio texto.
- Cómo obtener una vista desde un evento de coordenadas en android?
- Cómo dibujar un círculo dentro de un círculo con formas de Android xml?