Dealing with Android's texture size limit Dealing with Android's texture size limit android android

Dealing with Android's texture size limit


You can use BitmapRegionDecoder to break apart larger bitmaps (requires API level 10). I've wrote a method that will utilize this class and return a single Drawable that can be placed inside an 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();    }}

The method will check to see if the drawable resource is smaller than MAX_SIZE (1024) in both axes. If it is, it just returns the drawable. If it's not, it will break the image apart and decode chunks of the image and place them in a LayerDrawable.

I chose 1024 because I believe most available phones will support images at least that large. If you want to find the actual texture size limit for a phone, you have to do some funky stuff through OpenGL, and it's not something I wanted to dive into.

I wasn't sure how you were accessing your images, so I assumed they were in your drawable folder. If that's not the case, it should be fairly easy to refactor the method to take in whatever parameter you need.


You can use BitmapFactoryOptions to reduce size of picture.You can use somthing like that :

BitmapFactory.Options options = new BitmapFactory.Options();options.inSampleSize = 3; //reduce size 3 times


Have you seen how your maps working? I had made a renderer for maps once. You can use same trick to display your image.

Divide your image into square tiles (e.g. of 128x128 pixels). Create custom imageView supporting rendering from tiles. Your imageView knows which part of bitmap it should show now and displays only required tiles loading them from your sd card. Using such tile map you can display endless images.