Canvas.drawTextOnPath (…) no funciona en Lollipop
Canvas.DrawTextOnPath no parece funcionar en un dispositivo Lollipop. Vea la diferencia aquí. (La imagen del Nexus 10 es correcta pero Lollipop no se muestra correctamente)
- ArrayIndexOutOfBoundsException al mostrar Toast en android lollipop
- Desactivar Ripple en ListView
- Imágenes verdes al hacer una codificación JPEG desde YUV_420_888 utilizando la nueva cámara Android2 api
- Enfocar lento en Nexus 6 con cámara2 API
- Estilizar los botones de material en Android v21
El código es un trazado de ruta simple.
// Path for the inner circle unitPath = new Path(); unitPath.addArc(unitRect, 180.0f, 180.0f); // Draw the text and the path canvas.drawTextOnPath("Inner Circle", unitPath, 0.0f, 0.0f, unitPaint); canvas.drawPath(unitPath,unitPaint);
El proyecto de prueba de Android Studio que ilustra este problema se puede ver aquí para cualquier persona que quiera verlo. Https://dl.dropboxusercontent.com/u/6768304/WebLinks/TestApp.rar
¿Hay algo "diferente" que necesito hacer en este dispositivo?
- Android Support Design TabLayout: Centro de Gravedad y Modo Scrollable
- La ondulación se dibuja a continuación ImageView
- Cámara Android2 getPreviewFrame
- Crear una ondulación dibujable sin transparencia
- ¿Cómo bloquear / desbloquear la pantalla con el modo Patrón / Contraseña en Android?
- Convertir la cámara Android api YUV_420_888 a RGB
- Establecer el efecto de ondulación en la vista de imagen
- ¿Cómo implementar el efecto ripple en Android KeyboardView?
Aceptar por lo que parece que DrawTextOnPath es un poco roto ahora con tamaños de fuente por debajo de 1.0f
La solución es escalar todo, dibujar el texto y luego reducirlo.
El método drawTitle en el proyecto de demostración cambiaría de esto:
private void drawTitle(Canvas canvas) { canvas.drawTextOnPath(upperTitle, upperTitlePath, 0.0f, 0.02f, unitPaint); canvas.drawTextOnPath(lowerTitle, lowerTitlePath, 0.0f, 0.0f, unitPaint); canvas.drawTextOnPath(unitTitle, unitPath, 0.0f, 0.0f, unitPaint); canvas.drawPath(unitPath,unitPaint); }
a esto:
private void drawTitle(Canvas canvas) { //Save original font size float originalTextSize = unitPaint.getTextSize(); // set a magnification factor final float magnifier = 100f; // Scale the canvas canvas.save(); canvas.scale(1f / magnifier, 1f / magnifier); // create new rects and paths based on the new scale unitRect = new RectF(); unitRect.set((faceRect.left + unitPosition) * magnifier, (faceRect.top + unitPosition) * magnifier, (faceRect.right - unitPosition) * magnifier, (faceRect.bottom - unitPosition) * magnifier); unitPath = new Path(); unitPath.addArc(unitRect, 180.0f, 180.0f); titleRect = new RectF(); titleRect.set((faceRect.left + titlePosition) * magnifier, (faceRect.top + titlePosition) * magnifier, (faceRect.right - titlePosition) * magnifier, (faceRect.bottom - titlePosition) * magnifier); upperTitlePath = new Path(); upperTitlePath.addArc(titleRect, 180.0f, 180.0f); titleRect = new RectF(); titleRect.set((faceRect.left + titlePosition) * magnifier, (faceRect.top + titlePosition) * magnifier, (faceRect.right - titlePosition) * magnifier, (faceRect.bottom - titlePosition) * magnifier); lowerTitlePath = new Path(); lowerTitlePath.addArc(titleRect, -180.0f, -180.0f); // increase the font size unitPaint.setTextSize(originalTextSize * magnifier); // do the drawing of the text canvas.drawTextOnPath(unitTitle, unitPath, 0.0f, 0.0f, unitPaint); canvas.drawTextOnPath(upperTitle, upperTitlePath, 0.0f, 0.02f, unitPaint); canvas.drawTextOnPath(lowerTitle, lowerTitlePath, 0.0f, 0.0f, unitPaint); // bring everything back to normal canvas.restore(); unitPaint.setTextSize(originalTextSize); canvas.drawPath(unitPath, unitPaint); }
Sí, roto como de Lollipop. Funcionó perfectamente en 4.4.4.
https://code.google.com/p/android/issues/detail?id=40965
Estoy fijando el tamaño del texto a 5.f si era más pequeño, escalando el lienzo abajo, y escalando la trayectoria de la línea de base para arriba apropiadamente. Lento, pero funciona, no puedo esperar hasta que pueda eliminar este terrible cludge.
- Robolectric 3.0 InflateException con un fragmento personalizado de mapa
- ¿Cómo importar un proyecto de biblioteca en Android Studio, sin hacer una copia?