Utilización de esquinas redondeadas

Hay un buen post hecho por el popular desarrollador de Google Romain Guy que muestra cómo usar una esquinas redondeadas (llamado "StreamDrawable" en su código ) en una vista de manera eficiente.

La muestra en sí funciona muy bien en mi Galaxy S3 cuando en el modo retrato, pero tengo algunos problemas con él:

  1. Si la pantalla es pequeña (por ejemplo, en pantallas qvga), las imágenes mostradas se recortan.

  2. Si tengo un mapa de bits de entrada que es demasiado pequeño como deseo mostrarlo, la imagen de salida tiene sus bordes manchados. Incluso en el Galaxy S3, cuando se ejecuta el código de ejemplo y está en el paisaje, se ve horrible:

    Introduzca aquí la descripción de la imagen

  3. Todavía no estoy seguro acerca de ello (ya que uso una solución de escalado de la imagen para utilizar el código de ejemplo), pero creo que incluso esta solución es un poco lento cuando se utiliza en un listView. Tal vez hay una solución de renderscript para esto?

No importa si utilizo setImageDrawable o setBackgroundDrawable. Debe ser algo en el dibujable en sí.

He intentado jugar con las variables y el bitmapShader, pero nada funcionó. Lamentablemente TileMode no tiene un valor para sólo estirar la imagen, sólo mosaico de alguna manera.

Como solución, puedo crear un nuevo mapa de bits escalado, pero es sólo una solución. Seguramente hay una mejor manera que también no usará más memoria de lo que debería.

¿Cómo soluciono esos problemas y uso este gran código?

Creo que la solución que se presenta en este sitio web funciona bien.

A diferencia de otras soluciones, no causa pérdidas de memoria, aunque se basa en la solución de Romain Guy.

EDIT: ahora en la biblioteca de soporte, también puede utilizar RoundedBitmapDrawable (usando RoundedBitmapDrawableFactory ).

Tuve algunos problemas de tamaño con este código, y lo resolví.

Tal vez esto también le ayudará a usted:

1) en el constructor almacenar el mapa de bits en una variable local (p. Ej. Bitmap de mapa de bits privado;)

2) anular dos métodos más:

@Override public int getIntrinsicWidth() { return bmp.getWidth(); } @Override public int getIntrinsicHeight() { return bmp.getHeight(); } 

Saludos cordiales, DaRolla

Hay problema subyacente es que TileMode del TileMode no tiene una opción de escala. Shader.TileMode.CLAMP en el origen que se ha establecido en Shader.TileMode.CLAMP y los documentos lo describen así:

Replicar el color del borde si el sombreador dibuja fuera de sus límites originales

Para solucionar este problema, hay tres soluciones:

  1. Restrinja el tamaño de la vista en la que el dibujable se utiliza para el tamaño del mapa de bits.
  2. Restringir la región de dibujo; Por ejemplo, cambiar:

     int width = bounds.width() - mMargin; int height = bounds.height() - mMargin; mRect.set(mMargin, mMargin, width, height); 

    A:

     int width = Math.min(mBitmap.getWidth(), bounds.width()) - mMargin; int height = Math.min(mBitmap.getHeight(), bounds.height()) - mMargin; mRect.set(mMargin, mMargin, width, height); 
  3. Escale el mapa de bits al tamaño del dibujable. Me he trasladado la creación de sombreado en onBoundsChange () y han optado por crear un nuevo mapa de bits de aquí:

     bitmap = Bitmap.createScaledBitmap(mBitmap, width, height, true); mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); 

    Tenga en cuenta que esto es una operación potencialmente lenta y se ejecutará en el hilo principal. Es posible que desee considerar cuidadosamente cómo desea implementarlo antes de ir para esta última solución.

  • Cambiar completamente el color de Android ImageView con color de tinte
  • PhoneGap Android: ¿Cómo forzar a la aplicación a utilizar iconos de asset \ www \ res en lugar res \ drawable carpeta?
  • Problema de representación de Android Drawable (Barra de progreso, Interruptor)
  • Creación de un parche 9 dibujable en tiempo de ejecución
  • Atributos del tema en pre-lollipop Drawable using DrawableCompat?
  • ¿Cómo puedo configurar el fondo de mi forma en xml?
  • El botón de Android selecciona y presiona dibujable
  • XML dibujable teniendo un comportamiento diferente en 4.3 y 4.1.2
  • Establecer fondo de RelativeLayout con la imagen descargada con Universal Image Loader
  • Dibujar círculo mediante programación utilizando Android ShapeDrawable
  • La línea punteada no está punteada cuando la aplicación se está ejecutando en un dispositivo Android real
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.