1

Android では、ビットマップの特定の部分 (たとえば、スプライト シートの 1 つのスプライト) のみを ImageView に表示するクリーンな方法はありますか?

  • ビットマップ png を手動で小さな png に分割します (=> アプリに埋め込まれたドローアブルが増える、面倒な手動操作がバグにつながる可能性がある、またはスプライトシートが失われる)。
  • ImageViews で小さな png を使用し、スプライト シートを生成する (=> 複雑)
  • ImageView、Drawable などの「汚い」サブクラスを作成します (=> Android API「ASIS」を使用すればするほど良い)
  • 大きなビットマップのサブビットマップをプログラムで作成します (=> すべての作業をプログラムで行う必要があります)

たとえば、幅/高さが 40 dp の ImageView を作成し、そのドローアブルを、必要なビットマップの部分のみを表示する ClipDrawable として設定しようとしましたが、うまくいきませんでした:

  • ClipDrawable の作成時に Gravity.CENTER を使用すると、クリップされた部分が親を埋めませんでした。

  • Gravity.FILL を使用すると、「大きな」PNG 全体が表示されました。

さらに、このソリューションは単純なスプライト シート (たとえば 2*2 スプライト) で実行可能ですが、4*4 スプライト シートのようなものを使用する場合は可能ではないと思います。ClipDrawable はそのような用途には向いていないと思います。

テクスチャ ID を設定し、テクスチャ座標を設定してテクスチャの一部のみを表示できる OpenGL のような「クリーンで簡単」なものはありませんか? 私の研究を考えると、そのようなことを始める前に尋ねたいときは、Bitmap.createBitmapで大きなビットマップを手動で分割するのが最善の解決策だと思います。

PS : OpenGl のために SpriteSheets を使用することを検討していますが、私の「メニュー」は Android API を使用して開発されているため、ImageView を使用しています。

4

1 に答える 1

0

キャンバスに精通していますか? それはあなたのために働く別の方法だと思います。

メモリ内に 1 つのビットマップを作成し、drawBitmap を使用して必要な現在のチャンクだけを描画します。

マニュアルの抜粋を次に示します。

public void drawBitmap (Bitmap bitmap, Rect src, Rect dst, Paint paint)

この関数は、ビットマップに関連付けられた密度を無視します。これは、ソースとデスティネーションの四角形の座標空間がそれぞれの密度にあるためで、適切な倍率が適用されている必要があります。

Parameters
bitmap  The bitmap to be drawn
src     May be null. The subset of the bitmap to be drawn
dst     The rectangle that the bitmap will be scaled/translated to fit into
paint   May be null. The paint used to draw the bitmap 
于 2013-06-08T01:51:33.113 に答える