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)

Imagen

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?

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.

  • Cómo crear efecto de rizo en un diseño sencillo
  • ¿Cómo activar el efecto de rizo en Android Lollipop, en una ubicación específica dentro de la vista, sin desencadenar eventos de touch?
  • Cámara Android2 Tamaños de salida
  • Cómo establecer state_selected en ripple drawable
  • Ráfaga de captura de cámara de Android2 es demasiado lento
  • RippleDrawable máscara de color, ¿para qué sirve?
  • Android: ¿Cómo puedo comprobar si un dispositivo tiene funciones de api de Camera2 implementadas o no?
  • Android Development Tool 23.0.0 y Android L Error de actualización en eclipse
  • Cómo utilizar RippleDrawable programaticamente en código (no xml) con Android 5.0 Lollipop?
  • Forma de diseño de material para Android
  • Ondulación y fondo sin límites de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.