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).

Esto funciona perfectamente como se puede ver aquí:

Android 3.0 + resultado

Sin embargo, ejecutar el mismo código en Android 2.3.x da como resultado:

Resultado de Android 2.x

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: 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).

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 se Res_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.

  • Prácticas recomendadas para rectángulos redondeados en OpenGL ES
  • Parche para Android - 9
  • Imagen de nueve parches para dibujar 1 borde de píxeles alrededor de TextView
  • Cómo crear 9 patch en Photoshop? ¿Qué es la codificación 9.png?
  • 9 Imagen de parche donde el centro es 1: 1
  • Android: patrón de repetición de 9 patches en lugar de estiramiento
  • Mejor asignación de imágenes de calidad a partir de recursos basados ​​en resolución / densidad
  • ¿Cómo puedo diseñar las pestañas de Android para obtener un aspecto 3D?
  • Botón con fondo transparente oscurece en Lolipop android
  • 9-Patch en Selector muestra puntos negros
  • ¿Es posible hacer un 9-parche dibujable para un gráfico de la leyenda?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.