您可以使用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)。如果是,它只返回可绘制对象。如果不是,它会将图像分开并解码图像块并将它们放在LayerDrawable
.
我选择 1024 是因为我相信大多数可用的手机都会支持至少那么大的图像。如果你想找到手机的实际纹理大小限制,你必须通过 OpenGL 做一些时髦的东西,这不是我想深入研究的东西。
我不确定你是如何访问你的图像的,所以我假设它们在你的 drawable 文件夹中。如果不是这种情况,那么重构该方法以获取您需要的任何参数应该是相当容易的。