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.
- Anular onDraw () o draw ()?
- Dibujo de un pulgar hueco redondeado sobre arco
- Centrar el texto en el círculo
- Android: ¿Cómo hacer esta pintura enmarcada?
- Trazado de dibujo de Android
- ¿Cómo dibujo una flecha (en Android)?
- Unwanted Warp efecto de dibujo de texto en la ruta android
- ¿Cómo conseguir el área total cubierta mientras que dibuja la trayectoria en el androide de la lona?
- Personalizar una ProgressBar para convertirse en un termómetro
- Acerca de Android Paint dibujo de color
- Error de procesamiento de OpenGL ES
- Android: trazado de dibujo como superposición en MapView
- Cómo dibujar una ruta entre dos geopuntos en el Android
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 }
- Notificación de repetición diaria de Android en el momento específico de un día mediante AlarmManager
- Error al intentar utilizar la variable de contexto proporcionada de enlace de datos con BaseObservable