Bueno, siguiendo con mis mensajes sin contestar, ahí va otro
En un MapView tengo un Overlay en el que dibujo una serie de líneas mediante la función canvas.drawLines(float[] puntos, Paint paint), de modo que pasándole una lista de puntos me los dibuja todos del tirón. El problema es que me dibuja las líneas en su posición, pero como le da la gana si activo el antialias del paint.
Algunas (no todas) las líneas las pinta así (nótese que las líneas desaparecen justo en el principio y final de los segmentos, no de golpe, sino como degradado):
Si aumento el zoom dibuja bien la mayoría:
Si quito el antialias no hay problema, pero se ve peor, como es normal:
No sé qué estoy haciendo mal. Antes pintaba cada segmento por separado (canvas.drawLine) y quedaba a la perfección, lo he cambiado por eficiencia.
El Paint:
paint = new Paint();
paint.setStyle(Style.STROKE);
paint.setStrokeWidth(2);
paint.setColor(Color.parseColor("#10AF00"));
paint.setStrokeCap(Cap.ROUND);
paint.setStrokeJoin(Join.ROUND);
paint.setAntiAlias(true);
Las propiedades StrokeCap y StrokeJoin no modifican nada, he probado a quitarlas, cambiarlas, etc, como quien oye llover.
Pinto, dentro del Overlay, mediante:
c.drawLines(points, paint);
En fin, no encuentro nada y me está empezando a tocar los huevecillos ya el asunto.
Edito -------------------------Tengo una habilidad especial para pegarme 3 horas buscando algo, preguntarlo aquí y encontrar la respuesta. Resulta que a partir de android 3.0 se soporta aceleración por hardware para la UI, y mi móvil lleva la 4.0. Bien, algunas funciones no están soportadas o están limitadas cuando la aceleración está activada, y justamente canvas.drawLines no soporta antialias (algo que no dicen en la documentación de la librería Canvas), por eso queda como en las imágenes.
La solución ha sido volver a dibujar segmento a segmento, es menos eficiente (120 llamadas a drawLines o 1800 a drawLine...) pero lo es más que desactivar la aceleración y prefiero que se vea bien en este caso. Algo así:
if (mapView.isHardwareAccelerated()){
for (int i = 0; i < points.length; i += 4){
c.drawLine(points[i], points[i+1], points[i+2], points[i+3], paint);
}
}else{
c.drawLines(points, paint);
}