38

私の Android アプリケーションには、サーバー側から新しい色と画像を取得することで、グラフィックスのパーツをカスタマイズできるようにする必要があります。これらの画像の一部は 9 パッチ画像です。

これらの 9 パッチの画像 (ネットワーク経由で取得したもの) を作成して表示する方法が見つかりません。

9 パッチのイメージが取得され、ビットマップとしてアプリケーションに保持されます。NinePatchDrawableを作成するには、対応するNinePatchまたは NinePatch のチャンク ( byte[]) が必要です。に画像が存在しないため、NinePatch をリソースからロードすることはできません/res/drawable/。さらに、NinePatch を作成するには、NinePatch のチャンクが必要です。したがって、すべてがチャンクにドリルダウンします。
問題は、既存のビットマップ (NinePatch 情報を含む) からチャンクをどのようにフォーマット/生成するかということです。

Android のソース コードと Web を検索しましたが、このような例は見つかりません。さらに悪いことに、NinePatch リソースのすべてのデコードはネイティブで行われるようです。

この種の問題を経験した人はいますか?

それが重要な場合、私は API レベル 4 をターゲットにしています。

4

7 に答える 7

55

getNinePatchChunkうまく動作します。Bitmap「ソース」ninepatchを指定していたため、nullが返されました。「コンパイルされた」ninepatchイメージが必要です。

Androidの世界には2種類のninepatchファイル形式があります(「ソース」と「コンパイル済み」)。ソースバージョンでは、どこにでも1pxの透明度の境界線を追加します。後でアプリを.apkにコンパイルすると、aaptは*.9.pngファイルをAndroidが期待するバイナリ形式に変換します。これは、pngファイルがその「チャンク」メタデータを取得する場所です。(続きを読む

さて、今はビジネスに取り掛かっています(DJカンズレを聴いています)。

  1. クライアントコード、次のようなもの:

    InputStream stream = .. //whatever
    Bitmap bitmap = BitmapFactory.decodeStream(stream);
    byte[] chunk = bitmap.getNinePatchChunk();
    boolean result = NinePatch.isNinePatchChunk(chunk);
    NinePatchDrawable patchy = new NinePatchDrawable(bitmap, chunk, new Rect(), null);
    
  2. サーバー側では、イメージを準備する必要があります。Android BinaryResourceCompilerを使用できます。これにより、*。9.pngファイルをAndroidネイティブ形式にコンパイルするためだけに、新しいAndroidプロジェクトを作成する手間が省けます。これを手動で行う場合は、基本的にプロジェクトを作成し、いくつかの* .9.pngファイル(「ソース」ファイル)を投入し、すべてを.apk形式にコンパイルし、.apkファイルを解凍してから、*を見つけます。 9.pngファイル、そしてそれはあなたがあなたのクライアントに送るものです。

またBitmapFactory.decodeStream、これらのpngファイルのnpTcチャンクについて知っているかどうかはわかりません。そのため、画像ストリームが正しく処理されている場合とされていない場合があります。の存在は、その可能性をBitmap.getNinePatchChunk示唆してBitmapFactoryいます-アップストリームコードベースで検索することができます。

npTcチャンクについて認識せず、画像が大幅に台無しになっている場合、私の答えは少し変わります。

byte[]コンパイルされたninepatchイメージをクライアントに送信する代わりに、コンパイルされたイメージをロードしてチャンクを吐き出すための簡単なAndroidアプリを作成します。次に、このバイト配列を通常のイメージとともにクライアントに送信します。透明な境界線、「ソース」のninepatchイメージ、「コンパイルされた」ninepatchイメージはありません。チャンクを直接使用してオブジェクトを作成できます。

もう1つの方法は、オブジェクトのシリアル化を使用しNinePatchて、JSONや組み込みのシリアライザーなどを使用して9つのパッチイメージ()をクライアントに送信することです。

編集本当に、本当に独自のチャンクバイト配列を作成する必要がある場合は、、、、およびResourceTypes.cppを確認することdo_9patchから始めますisNinePatchChunk。DmitrySkibaの自家製npTcチャンクリーダーもあります。リンクを投稿できないので、誰かが私の答えを編集できれば、それは素晴らしいことです。Res_png_9patchRes_png_9patch::serialize()

do_9patch: https ://android.googlesource.com/platform/frameworks/base/+/gingerbread/tools/aapt/Images.cpp

isNinePatchChunk:http ://netmite.com/android/mydroid/1.6/frameworks/base/core/jni/android/graphics/NinePatch.cpp

struct Res_png_9patch:https ://scm.sipfoundry.org/rep/sipX/main/sipXmediaLib/contrib/android/android_2_0_headers/frameworks/base/include/utils/ResourceTypes.h

ドミトリースキバのもの:http ://code.google.com/p/android4me/source/browse/src/android/graphics/Bitmap.java

于 2011-04-01T23:02:41.590 に答える
24

その場で 9Patches を作成する必要がある場合は、私が作成したこの要点を確認してください: https://gist.github.com/4391807

任意のビットマップを渡してから、iOS と同様のキャップ インセットを指定します。

于 2012-12-27T20:49:29.620 に答える
6

コンパイルされた 9patch png を準備するために Android Binary Resource Compiler を使用する必要はありません。android-sdk で aapt を使用するだけで問題ありません。コマンド ラインは次のようになります。
aapt.exe c -v -S /path/to/project -C /path/to/destination

于 2013-06-03T05:56:48.187 に答える
4

ですから、基本的にはNinePatchDrawableオンデマンドで作成したいですね。私は次のコードを試しました、多分それはあなたのために働くでしょう:

InputStream in = getResources().openRawResource(R.raw.test);
Drawable d = NinePatchDrawable.createFromStream(in, null);
System.out.println(d.getMinimumHeight() + ":" + d.getMinimumHeight());

これでうまくいくと思います。WebからInputStreamを取得するには、最初の行を変更する必要があります。getNinePatchChunk()ドキュメントによると、開発者から呼び出されることを意図したものではなく、将来的に機能しなくなる可能性があります。

于 2011-02-22T15:59:07.673 に答える
0

Bitmap クラスは、これを行うためのメソッドを提供しますyourbitmap.getNinePatchChunk()。私はそれを使用したことはありませんが、それはあなたが探しているもののようです.

于 2011-02-22T15:46:07.347 に答える