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:
- Agregue ObjectAnimator a AnimatedVectorDrawable en tiempo de ejecución
- Cambiar el drawableLeft del botón cuando se hace clic en el botón
- Fondo animado como la aplicación de despertador Timely
- Agregar margen inferior al último elemento de ListView
- ¿Qué hay de nuevo en Drawable Tinting en Android L Developer Preview en comparación con la versión anterior?
-
Si la pantalla es pequeña (por ejemplo, en pantallas qvga), las imágenes mostradas se recortan.
-
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:
-
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?
- ¿Qué es "Recursos" en el constructor BitmapDrawable realmente?
- Problema con selector en RecycleView
- Forma del androide con el movimiento inferior
- Cómo crear una flecha que mira hacia la derecha usando xml formas en android?
- ¿Cuál es la diferencia entre setBackgroundResource y setBackgroundDrawable
- Cómo poner un <vector> en una <forma> en Android?
- Android create pie dount con degradado
- Forma de anillo en android
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:
- Restrinja el tamaño de la vista en la que el dibujable se utiliza para el tamaño del mapa de bits.
-
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);
-
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.
- Android: Intent Flag para destruir la actividad y comenzar una nueva
- Retrofit2: Modificación del cuerpo de la petición en OkHttp Interceptor