Dibuja un centro de texto de una imagen de android

Tengo que colocar el marcador en la vista del mapa y escribir un número en el marcador. He hecho eso, pero la alineación del texto varía en la resolución diferente. abajo está el código de referencia

float xVal = (float) curScreenCoords.x; // Point curScreenCoords float yVal = (float) curScreenCoords.y-20; // Point curScreenCoords Bitmap bitmap = BitmapFactory.decodeResource ( context.getResources() , ( R.drawable.pin_number ) ) ; canvas.drawBitmap(bitmap, xVal, yVal, getInnerPaint()); public Paint getInnerPaint() { if (innerPaint == null) { innerPaint = new Paint(); } innerPaint.setARGB(255, 117, 161, 220); // blue innerPaint.setAntiAlias(true); innerPaint.setStyle(Style.FILL); return innerPaint; } canvas.drawText(String.valueOf(10), xVal+20, yVal+22, getCountPaint()); // 10 is just for example, it can vary to one digit to two to three public Paint getCountPaint() { if (innerPaint == null) { innerPaint = new Paint(); } innerPaint.setARGB(255, 255, 255, 255); innerPaint.setAntiAlias(true); innerPaint.setStyle(Style.FILL); innerPaint.setTextSize(12f); innerPaint.setTextAlign(Align.CENTER); return innerPaint; } 

todo funciona bien, con excepción de la alineación de texto, este código funciona bien para 480 * 800 de resolución. El texto está perfectamente alineado en el centro en el lienzo. x, posición de y es perfecta en la imagen, pero esto no parece perfecto en 320 * 480. la posición xyy del texto se ve diferente en esta resolución. ¿Alguien puede sugerirme por favor qué exactamente sucede mal? ¿hay fundamentos para hacer lo mismo en dispositivos de diferentes tamaños? Gracias por adelantado.

Sus valores curScreenCoords.y-20 y xVal+20, yVal+22 tienen desplazamiento de píxeles constante para todas las resoluciones, pero deben depender de la densidad de píxeles del dispositivo de esta manera:

 xOffset = (int) (13.33f * context.getResources().getDisplayMetrics().density + 0.5f); yOffset = (int) (14.67f * context.getResources().getDisplayMetrics().density + 0.5f); canvas.drawText(String.valueOf(10), xVal + xOffset, yVal + yOffset, getCountPaint()); 

Creo que se puede medir el ancho y la altura que el texto tendría una vez escrito en el lienzo y luego utilizarlo para centrarlo. Algo como:

 String text = "whatever"; Rect bounds = new Rect(); paint.getTextBounds(text, 0, text.length(), bounds); canvas.drawText(text, (canvas.getWidth() - bounds.width()) / 2, (canvas.getHeight() - bounds.height()) / 2, paint); 

Hola, supongo que Ninguna de las respuestas dadas anteriormente son lo suficientemente buenas, así que publico mi respuesta, prueba que los chicos trabajarán en todos los dispositivos y no es compleja en absoluto

 Canvas canvas = new Canvas(bitmap); Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); //paint.setTextAlign(Align.CENTER); paint.setColor(activity.getResources().getColor(R.color.white)); paint.setTextSize(30); // draw text to the Canvas center Rect boundsText = new Rect(); paint.getTextBounds(String.valueOf(cluster.getMarkerList().size()), 0, String.valueOf(cluster.getMarkerList().size()).length(), boundsText); int x = (bitmap.getWidth() - boundsText.width()) / 2; int y = (bitmap.getHeight() + boundsText.height()) / 2; canvas.drawText(String.valueOf(cluster.getMarkerList().size()), x, y, paint); 

Asegúrese de comprobar que la aceleración de hardware está desactivada. En 4.1.2 y otros dispositivos (samsung Galaxy Tag 2.0) obtiene un error de señal fatal 11.

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { setLayerType(View.LAYER_TYPE_SOFTWARE, null); } 

Esto corrige el problema que estaba teniendo con este código. El canvas.drawText estaba causando el error.

Puede extender la clase Image y anular onDraw de la misma. Como a continuación

 import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Paint; import android.widget.ImageView; /** * @author amit * */ public class CustomImageView extends ImageView { private int notificationCount; private Paint paint; /** * @param context */ public CustomImageView(Context context) { super(context); notificationCount = 0; paint = new Paint(); paint.setColor(Color.RED); ColorFilter cf = new ColorFilter(); paint.setColorFilter(cf); paint.setStyle(Paint.Style.FILL); paint.setFakeBoldText(true); paint.setTextSize(15); } public synchronized void incrementNotification() { notificationCount--; this.invalidate(); } public synchronized void decrementNotification() { notificationCount++; this.invalidate(); } /** * @return the notificationCount */ public synchronized int getNotificationCount() { return notificationCount; } /** * @param notificationCount * the notificationCount to set */ public synchronized void setNotificationCount(int notificationCount) { this.notificationCount = notificationCount; this.invalidate(); } /* * (non-Javadoc) * * @see android.widget.ImageView#onDraw(android.graphics.Canvas) */ @Override protected void onDraw(Canvas canvas) { // System.out.println("OnDraw is called"); super.onDraw(canvas); if (notificationCount == 0) { return; } canvas.drawText(String.valueOf(notificationCount), 0, 0, paint); } } 

Puede llamar a cualquiera de los siguientes métodos

 incrementNotification(); decrementNotification(); setNotification(int number); 

Elija el color de su opción dentro del constructor. ¡Buena suerte !!

Tuve el mismo problema. Quise dibujar el texto dentro del mapa de bits – para el propósito de la agrupación en Google Maps. En realidad dibuja texto en el CENTRO del mapa de bits.

Código escrito en Kotlin

 fun createCircleBitmapWithTextInside(context: Context, @DrawableRes drawableId: Int, text: String = "POI"): Bitmap{ val scale = context.resources.displayMetrics.density var bitmap = getBitmap(context, drawableId)//BitmapFactory.decodeResource(res, drawableId) var bitmapConfig = bitmap.config ?: Bitmap.Config.ARGB_8888 // resource bitmaps are imutable, // so we need to convert it to mutable one bitmap = bitmap.copy(bitmapConfig, true) val canvas = Canvas(bitmap) val paint = Paint(ANTI_ALIAS_FLAG) paint.color = ResourceUtils.getColor(context, R.color.white) paint.textSize = (18 * scale) paint.setShadowLayer(1f, 0f, 1f, Color.WHITE) paint.style = Paint.Style.FILL paint.textAlign = Paint.Align.CENTER val bound = Rect() paint.getTextBounds(text, 0, text.length, bound) val x = (canvas.width.toFloat() /2) // x - point to the center of width val y = canvas.height / 2 - (paint.descent() + paint.ascent()) / 2 /* Timber.d("bitmap.width:${canvas.width} \tbound.width:${bound.width()} \tx:$x") Timber.d("bitmap.height:${canvas.height} \tbound.height:${bound.height()} \ty:$y")*/ canvas.drawText(text, x, y, paint) return bitmap } 
  • Redibujar múltiples rutas en las mismas posiciones de la orientación anterior de la disposición
  • ¿Cómo crear un bucle de actualización / dibujo apropiadamente con opengl android?
  • Explicación del ejemplo de JetBoy para dev.android.com?
  • Android cómo dibujar un rect rectangular y sombra Layout
  • Acceso rápido y manipulación de píxeles android
  • Cree una ruta de trazado con Google Maps sin conexión
  • Cómo esbozar un TextView?
  • Un método más eficiente de dibujar miles de partículas (Java / Android)
  • Android: calidad de las imágenes redimensionadas en tiempo de ejecución
  • Crear triángulo con cornors redondeados
  • ¿Cómo hacer que cualquier vista dibuje a la lona?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.