您可以使用BitmapRegionDecoder
來拆分較大的位圖(要求API等級10)。我已經寫了,將利用這個類,並返回一個Drawable
可以放在裏面的方法的ImageView
:
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();
}
}
的方法將檢查,看看是否繪製資源比都MAX_SIZE
(1024)小軸。如果是,它只是返回drawable。如果不是,它會將圖像分開並對圖像塊進行解碼並將它們放在LayerDrawable
中。
我選擇了1024,因爲我相信大多數可用的手機將支持至少那麼大的圖像。如果你想找到手機的實際紋理大小限制,你必須通過OpenGL做一些時髦的東西,這不是我想要深入的東西。
我不確定你是如何訪問你的圖片,所以我認爲他們在你的可繪製文件夾。如果情況並非如此,那麼重構該方法以獲取所需的任何參數應該相當容易。
我不確定這個,但你有沒有嘗試過使用WebView? – 2013-03-27 09:52:52
不是,我有多個非常大的圖像在列表視圖上隨機定位的實例。我必須考慮到性能,這聽起來像一個非常糟糕的主意.. – woot 2013-03-27 12:12:31
看看這個不錯的項目:https://github.com/ened/Android-Tiling-ScrollView – 2013-04-05 14:53:30