package com.robert.maps.applib.tileprovider; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.os.Handler; public class TileProviderDual extends TileProviderBase { TileProviderBase mTileProviderMap; TileProviderBase mTileProviderLayer; Paint mPaint; public TileProviderDual(Context ctx, String aName, TileProviderBase aTileProviderMap, TileProviderBase aTileProviderLayer, MapTileMemCache aTileCache) { super(ctx); mTileCache = aTileCache; mTileProviderMap = aTileProviderMap; mTileProviderLayer = aTileProviderLayer; mTileURLGenerator = new TileURLGeneratorBase(aName); mPaint = new Paint(); mTileProviderMap.setLoadingMapTile(null); mTileProviderLayer.setLoadingMapTile(null); } @Override public void Free() { mTileProviderMap.Free(); mTileProviderLayer.Free(); super.Free(); } @Override public Bitmap getTile(int x, int y, int z) { final String tileurl = mTileURLGenerator.Get(x, y, z); final Bitmap bmp = mTileCache.getMapTile(tileurl); if(bmp != null) { return bmp; } final Bitmap bmpMap = mTileProviderMap.getTile(x, y, z); final Bitmap bmpLayer = mTileProviderLayer.getTile(x, y, z); Bitmap bmpDual = null; if(bmpMap != null && bmpLayer == null) { bmpDual = bmpMap; } else if(bmpMap == null && bmpLayer != null) { bmpDual = bmpLayer; } else if(bmpMap != null && bmpLayer != null) { try { bmpDual = Bitmap.createBitmap(bmpMap.getWidth(), bmpMap.getHeight(), Config.ARGB_8888); Canvas canvas = new Canvas(bmpDual); canvas.drawBitmap(bmpMap, 0, 0, mPaint); // final Rect src = new Rect(0, 0, bmpLayer.getWidth(), bmpLayer.getHeight()); // final Rect dst = new Rect(0, 0, bmpMap.getWidth(), bmpMap.getHeight()); // canvas.drawBitmap(bmpLayer, src, dst, mPaint); if(bmpMap.getWidth() == bmpLayer.getWidth()) canvas.drawBitmap(bmpLayer, 0, 0, mPaint); else { float scaleWidth = ((float) bmpMap.getWidth()) / bmpLayer.getWidth(); final Matrix matrix = new Matrix(); matrix.postScale(scaleWidth, scaleWidth); final Bitmap resizedBitmap = Bitmap.createBitmap(bmpLayer, 0, 0, bmpLayer.getWidth(), bmpLayer.getWidth(), matrix, false); if(resizedBitmap != null) { canvas.drawBitmap(resizedBitmap, 0, 0, mPaint); resizedBitmap.recycle(); } } mTileProviderMap.removeTile(tileurl); mTileProviderLayer.removeTile(tileurl); mTileCache.putTile(tileurl, bmpDual); } catch (OutOfMemoryError e) { bmpDual = bmpMap; } catch (Exception e) { bmpDual = bmpMap; } } else { bmpDual = super.getTile(x, y, z); }; return bmpDual; } @Override public void updateMapParams(TileSource tileSource) { mTileProviderMap.updateMapParams(tileSource); mTileProviderLayer.updateMapParams(tileSource); super.updateMapParams(tileSource); } @Override public void setHandler(Handler mTileMapHandler) { mTileProviderMap.setHandler(mTileMapHandler); mTileProviderLayer.setHandler(mTileMapHandler); } @Override public void ResizeCashe(int size) { super.ResizeCashe(size); mTileProviderMap.ResizeCashe(size); mTileProviderLayer.ResizeCashe(size); } @Override public boolean needIndex(String aCashTableName, long aSizeFile, long aLastModifiedFile, boolean aBlockIndexing) { return super.needIndex(aCashTableName, aSizeFile, aLastModifiedFile, aBlockIndexing); } @Override public void Index() { super.Index(); } @Override public void removeTileFromCashe(int x, int y, int z) { mTileProviderMap.removeTileFromCashe(x, y, z); mTileProviderLayer.removeTileFromCashe(x, y, z); } }