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.

  • Padding arround textview con fondo de nueve parches no tienen efecto visual
  • forma androide con un fondo repetido
  • Android Nine-patch equivalente para otras plataformas
  • Creación de una burbuja de chat utilizando Formas o imagen de 9 parches
  • ¿Es posible utilizar varias imágenes de parche dentro de LayerDrawable?
  • 9 parches - el borde 1px está borroso
  • Android ¿Qué tiene de malo este parche 9?
  • Mi 9 Patch Image dejó de funcionar
  • Android Lollipop 5.1: Señal fatal 11 (SIGSEGV), código 2, error addr 0x9e985ff8 en tid 4093 (RenderThread) / cuando se usa un lote de nueve gráficos de parche
  • ¿Qué debo usar para un mejor rendimiento, nueve parches o un recurso xml extraíble?
  • Herramienta de parche de Android 9: ¿Cuál es la nueva función de límites de diseño?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.