Creación de un parche 9 dibujable en tiempo de ejecución
Estoy construyendo con éxito un 9patch dibujable en el tiempo de ejecución en Android 3.0 + usando el gist excelente proporcionado por Brian Griffey (encontrado aquí ).
Esencialmente carga el archivo gráfico crudo (sin parches) de la red y el nombre de archivo contiene los recuadros de tapa que necesito usar para escalar la imagen en consecuencia. A continuación, utilizar estos valores con la clase anterior y aplicar la imagen como fondo a una variedad de elementos (como TextView
, ImageButton
, Button
, ViewGroup
, etc).
- ¿Por qué el parche 9 no funciona en absoluto en mi aplicación?
- Nueve parches en un grupo de vistas personalizado
- Problema con la imagen de 9 parches como fondo
- Cómo utilizar correctamente las imágenes de nueve parches
- Android: compilación de 9 archivos de parche para ser utilizado fuera de la carpeta de dibujo?
Esto funciona perfectamente como se puede ver aquí:
Sin embargo, ejecutar el mismo código en Android 2.3.x da como resultado:
He mirado a través del código fuente utilizado en Android para analizar una imagen 9patch ( aquí y aquí ), pero no han encontrado ningún método para que esto funcione correctamente. He intentado casi todo lo que podía lanzar en ella en vano.
Para el registro, el 9patch consta de tres columnas en cada eje, uno fijo, uno estirable y uno fijo.
Espero que alguien más haya resuelto este problema antes.
Gracias por adelantado.
EDIT Sólo estoy interesado en duplicar este comportamiento en Android 2.3 y superiores (que originalmente tenía 2.x).
EDIT # 2 Esta esencia describe exactamente lo que estoy tratando de hacer + Imagen de origen:
EDIT # 3 El tamaño de la imagen es 22px / 58px (ancho / alto) y los cuadros son 14/6/14/6 (arriba / izquierda / abajo / derecha).
- Bad 'Patches' en el archivo de 9 parches
- Utilidad de android nueve parche
- Cómo utilizar 9 imágenes de parche en android para diferentes-2 densidades (como mdpi, ldpi, hdpi).?
- El gráfico de 9 parches de Android no se escala en la vista de imagen
- Dibujo de nueve parche sobre lienzo (Android)
- Fondos rotos por defecto, como para EditText o estado presionado en TabLayout y Toolbar
- Imagen de fondo de Android 9-Patch Tamaño inicial de PNG?
- ¿Por qué necesitamos 9 parches?
Juntando todo lo que he visto hasta ahora, y perfeccionándolo un poco:
-
No parece haber una diferencia en la estructura
Res_png_9patch
(en la que seRes_png_9patch
el fragmento de byte) entre las versiones de android (ver http://code.metager.de/source/xref/android ), por lo que no parece la causa. -
Otras respuestas sobre nueve sugerencias sugieren que cada región (especialmente las extensibles) debe tener al menos 2×2 píxeles (si no 3×3), pero fuera de ese menor es mejor.
-
Sin embargo, la forma en que se asigna parte del bloque de bytes parece que podría actualizarse. Intenta establecer el 4º byte a 9 (el número de parches, creo), añadiendo 7
NO_COLOR
más al final y moviendo su tamaño hasta 56 + (7 x 4) = 84 bytes
Funciona para mí después de actualizar el código. Creo que el tamaño de color hizo infeliz por alguna razón (Basado en los comentarios en el código fuente de Android cada parche tiene una sugerencia de color, establecer menos que el número de secciones en este caso 9 parece causar problemas). Todavía no he probado con tu imagen.
public static NinePatch createFixedNinePatch(Resources res, Bitmap bitmap, int top, int left, int bottom, int right, String srcName){ ByteBuffer buffer = getByteBufferFixed(top, left, bottom, right); NinePatch patch = new NinePatch(bitmap, buffer.array(), srcName); return patch; } public static ByteBuffer getByteBufferFixed(int top, int left, int bottom, int right) { //Docs check the NinePatchChunkFile ByteBuffer buffer = ByteBuffer.allocate(84).order(ByteOrder.nativeOrder()); //was translated buffer.put((byte)0x01); //divx size buffer.put((byte)0x02); //divy size buffer.put((byte)0x02); //color size buffer.put(( byte)0x09); //skip buffer.putInt(0); buffer.putInt(0); //padding buffer.putInt(0); buffer.putInt(0); buffer.putInt(0); buffer.putInt(0); //skip 4 bytes buffer.putInt(0); buffer.putInt(left); buffer.putInt(right); buffer.putInt(top); buffer.putInt(bottom); buffer.putInt(NO_COLOR); buffer.putInt(NO_COLOR); buffer.putInt(NO_COLOR); buffer.putInt(NO_COLOR); buffer.putInt(NO_COLOR); buffer.putInt(NO_COLOR); buffer.putInt(NO_COLOR); buffer.putInt(NO_COLOR); buffer.putInt(NO_COLOR); return buffer; }
Parece que trabajar con 9patches se describe en profundidad en SO ya – Crear un NinePatch / NinePatchDrawable en tiempo de ejecución
No es realmente una respuesta a la pregunta, sino una solución útil …
Siempre he encontrado trabajar con 9 archivos de parches en tiempo de ejecución para ser peludo. He podido utilizar con éxito FrameLayouts y el redimensionamiento automático del texto para lograr mis efectos deseados. Si su aplicación sólo va a utilizar este 9-parche, y no específicamente que permite al usuario descargarlo como una imagen (un generador de imagen de 9 parches de Android, por así decirlo), le aconsejo que eche un vistazo a eso.
- ¿Podemos encontrar elemento por ID en appium
- Cómo insertar marca de tiempo en una columna de base de datos SQLite? Utilizando el tiempo de función ('ahora')?