Cómo reasignar una imagen de 9 parches mediante programación a un ImageView?
Tengo una actividad que tiene un ImageView definido dentro de un HorizontalScrollView. El origen de la imagen es un archivo de 9 parches que está limitado a estirar sólo el borde derecho para llenar la pantalla. He implementado una función de zoom simple que permite al usuario pulsar dos veces para acercar y alejar, redimensionando el mapa de bits y asignando el nuevo mapa de bits a la vista. Mi problema actual es que cuando se duplica tocando para retroceder, el 9-patch no se aplica cuando asigno el nuevo mapa de bits redimensionado a la vista. En otras palabras, en lugar de estirar sólo el borde derecho como se define en el archivo de 9 parches, estiró toda la imagen.
Aquí está mi XML:
- ¿Por qué el parche 9 no funciona en absoluto en mi aplicación?
- Cómo crear androide spinner sin triángulo hacia abajo en el lado derecho del widget
- Bad 'Patches' en el archivo de 9 parches
- Diferentes imágenes de 9 parches para diferentes densidades?
- 9 Imagen de parche donde el centro es 1: 1
<HorizontalScrollView android:id="@+id/hScroll" android:fillViewport="true" android:layout_width="fill_parent" android:layout_height="fill_parent" android:fadingEdge="none" > <RelativeLayout android:id="@+id/rlayoutScrollMap" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/imgResultMap" android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="fitXY" android:src="@drawable/map_base"/> </RelativeLayout> </horizontalScrollView>
Esta es la parte relevante de mi código, dentro de la llamada onDoubleTap ():
public boolean onDoubleTap(MotionEvent e) { if (zoom == 1) { zoom = 2; // zoom out } else { zoom = 1; // zoom in } Bitmap image = BitmapFactory.decodeResource(getResources(),R.drawable.map_base); Bitmap bmp = Bitmap.createScaledBitmap(image, image.getWidth() * zoom, image.getHeight() * zoom, false); ImageView imgResultMap = (ImageView)findViewById(R.id.imgResultMap); imgResultMap.setImageBitmap(bmp); return false; }
EDIT : Después de hacer algunas investigaciones, lo he averiguado. En lugar de simplemente manipular el mapa de bits, necesito incluir también el trozo de 9 parches, que no forma parte de la imagen de mapa de bits, para reconstruir un nuevo 9-parcheable. Vea el siguiente código de ejemplo:
... else { // Zoom out zoom = 1; Bitmap mapBitmapScaled = mapBitmap; // Load the 9-patch data chunk and apply to the view byte[] chunk = mapBitmap.getNinePatchChunk(); NinePatchDrawable mapNinePatch = new NinePatchDrawable(getResources(), mapBitmapScaled, chunk, new Rect(), null); imgResultMap.setImageDrawable(mapNinePatch); } ....
- Cómo crear 9 patch en Photoshop? ¿Qué es la codificación 9.png?
- ¿Cuándo debo usar 9 imágenes de parches en android
- 9 parches - el borde 1px está borroso
- ¿Es posible hacer un 9-parche dibujable para un gráfico de la leyenda?
- Herramienta de parche de Android 9: ¿Cuál es la nueva función de límites de diseño?
- ¿Hay una herramienta para permitir el uso de 9 parches de Android en Javascript?
- Convertir imágenes png a 9 parche en Android Studio
- Android Nine-patch equivalente para otras plataformas
EDIT : Después de hacer algunas investigaciones, lo he averiguado. En lugar de simplemente manipular el mapa de bits, necesito incluir también el trozo de 9 parches, que no forma parte de la imagen de mapa de bits, para reconstruir un nuevo 9-parcheable. Vea el siguiente código de ejemplo:
... else { // Zoom out zoom = 1; Bitmap mapBitmapScaled = mapBitmap; // Load the 9-patch data chunk and apply to the view byte[] chunk = mapBitmap.getNinePatchChunk(); NinePatchDrawable mapNinePatch = new NinePatchDrawable(getResources(), mapBitmapScaled, chunk, new Rect(), null); imgResultMap.setImageDrawable(mapNinePatch); } ....
EDIT # 2 : Para aquellos que mira mi solución aquí, también echar un vistazo a las sugerencias de Kai a continuación sobre la gestión de memoria. Información muy útil.
¿Por qué no incluye sólo dos imágenes escaladas diferentes y cambia entre ellas usando imgResultMap.setImageResource(resId)
al hacer zoom? También tenga en cuenta que está cargando y creando mapas de bits en UIThread que no es una buena manera de proporcionar una experiencia de usuario fluida, por lo menos precargar el mapa de bits sólo una vez durante onCreate () y caché que.
Mover esto: ImageView imgResultMap = (ImageView)findViewById(R.id.imgResultMap);
A un global intialized en el método onCreate. De lo contrario, el dispositivo tiene que buscar la vista y encontrarla cada vez que se pulsa.
Y trate de llamar a imgResultMap.invalidate();
Antes de volver del método onDoubleTap ( http://developer.android.com/reference/android/view/View.html#invalidate () )
Las imágenes de 9 parches parecen funcionar sólo cuando están configuradas como una imagen de fondo de View
. Asi que:
- En lugar de
android:src
, setandroid:background
en su XML de disposición, y - Llame a
setBackgroundResource()
cuando desee cambiar la imagen.
También puede utilizar una View
sencilla en lugar de una ImageView
si lo desea; En realidad no importa mucho.
También otra solución es establecer la imagen mediante programación como ImageResource y establecer scaleType
imageView.setImageResource(R.drawable.favorite_driver_icon); imageView.setScaleType(ScaleType.FIT_XY);
- Detener una tostada y empezar otra en android
- Android: perspectiva de DDMS frente a perspectiva de depuración