【Android】Webから9-patch画像を取得すると端末が9-patchとして認識してくれない件


やりたいこと

  1. WebにおいてあるZipファイルをダウンロードする(この中にはアプリで使用する画像群やカラーの値が入っている)
  2. ダウンロードしてきたZipを展開する
  3. Fileで保存する
  4. 保存されたファイルから画像や値を引いて使用する

この順序を実装してく中で(4)のタイミングで「9-patchが効いてねえ。。」「え!てっきり拡張子で判断しているのかと。。」
という壁にぶつかって解消するまでの流れを記載して行きます。

9-patchってAndroidはどうやって認識してるんだ?

https://github.com/android/platform_frameworks_base/blob/master/graphics/java/android/graphics/drawable/Drawable.java
まず調べる必要があったのはこの部分。AOSPのDrawable.javaから該当部を見つけました。
Drawableを取得する際にはその画像の9patch情報(chunk)を見てNinePatchDrawableなのかBitmapDrawableなのかを返している。
その「chunk」が厄介で、結果を見ると一度コンパイラを通さないと生成されない。

さてどうしよう。。

「コンパイラを通さないと9-patchとして認識してくれない。。」
結論から言うと、一度コンパイルしてbinから取得してきた9patch画像をZipに入れることにしました。(運用としてちょっと面倒だけど。。)
これで正しく表示させることができました。

別案(未検証)

/frameworks/base/tools/aapt/Images.cpp
を持ってきて、
read_png→do_9patchてやれば、9patch化できるだろうけど、、
https://github.com/cozybit/aosp-frameworks-base/blob/master/tools/aapt/Images.cpp