BitmapRegionDecoder
を使用すると、より大きなビットマップを分割できます(APIレベル10が必要)。私はこのクラスを利用して内側に配置することができ、単一のDrawable
を返します方法を書いてきましたImageView
:メソッドは、描画可能リソースは両方でMAX_SIZE
(1024)よりも小さいかどうかをチェックします
private static final int MAX_SIZE = 1024;
private Drawable createLargeDrawable(int resId) throws IOException {
InputStream is = getResources().openRawResource(resId);
BitmapRegionDecoder brd = BitmapRegionDecoder.newInstance(is, true);
try {
if (brd.getWidth() <= MAX_SIZE && brd.getHeight() <= MAX_SIZE) {
return new BitmapDrawable(getResources(), is);
}
int rowCount = (int) Math.ceil((float) brd.getHeight()/(float) MAX_SIZE);
int colCount = (int) Math.ceil((float) brd.getWidth()/(float) MAX_SIZE);
BitmapDrawable[] drawables = new BitmapDrawable[rowCount * colCount];
for (int i = 0; i < rowCount; i++) {
int top = MAX_SIZE * i;
int bottom = i == rowCount - 1 ? brd.getHeight() : top + MAX_SIZE;
for (int j = 0; j < colCount; j++) {
int left = MAX_SIZE * j;
int right = j == colCount - 1 ? brd.getWidth() : left + MAX_SIZE;
Bitmap b = brd.decodeRegion(new Rect(left, top, right, bottom), null);
BitmapDrawable bd = new BitmapDrawable(getResources(), b);
bd.setGravity(Gravity.TOP | Gravity.LEFT);
drawables[i * colCount + j] = bd;
}
}
LayerDrawable ld = new LayerDrawable(drawables);
for (int i = 0; i < rowCount; i++) {
for (int j = 0; j < colCount; j++) {
ld.setLayerInset(i * colCount + j, MAX_SIZE * j, MAX_SIZE * i, 0, 0);
}
}
return ld;
}
finally {
brd.recycle();
}
}
軸。そうであれば、drawableを返します。そうでない場合は、イメージを分割してイメージのチャンクをデコードし、
LayerDrawable
に配置します。
私は、ほとんどの利用可能な携帯電話が少なくともそれ以上の大きさの画像をサポートすると考えているため、1024を選択しました。電話機の実際のテクスチャサイズの制限を調べるには、OpenGLでファンキーなことをする必要があります。それは私が夢中にしたいことではありません。
画像にどのようにアクセスしていたのかわからなかったので、それらがあなたのドロウアブルフォルダにあると仮定しました。そうでない場合は、必要なパラメータを取り込むメソッドをリファクタリングするのはかなり簡単です。
私はこれについてはわかりませんが、代わりにWebViewを使ってみましたか? –
本当に、私はリストビュー上にランダムに配置された非常に大きな画像の複数のインスタンスを持っています。私はパフォーマンスを考慮する必要があり、これはかなり悪い考えのように聞こえます。 – woot
この素晴らしいプロジェクトを見てください:https://github.com/ened/Android-Tiling-ScrollView –