Google如何在Google地图中缩放图片,我试图创建一个使用自定义地图而非Google地图的应用程序。一切都运行良好,我无法相应缩放图像,尺寸为>的手机240 x 320,但对于尺寸大于此崩溃的手机,因为我超过了android中应用程序的默认堆大小并获得java.lang.OutOfMemoryError:位图大小超过VM预算。我根本无法弄清楚如何根据手机的分辨率缩放图像。
这就是我在做什么:
1)首先计算手机的宽度和高度:
Display display = getWindowManager().getDefaultDisplay();
Constatnts.SCR_WD = display.getWidth();
Constatnts.SCR_HT = display.getHeight();
2)我为zoomIn按钮设置了一个onclicklistener,它调用了缩小功能:
public void zoomOut() {
if (isloading > 5)
return;
System.gc();
if (zoomLevel < 12) {
dc = true;
sc = true;
emptyBuffer();
zoom = -1;
stopload = true;
bitmapArr1 = new Bitmap[tilesyno][tilesxno];
for (int i = 0; i < bitmapArr.length; i++) {// row
for (int j = 0; j < bitmapArr[i].length; j++) {// coloum
if (bitmapArr[i][j] != null) {
int tmpTilewd = bitmapArr[i][j].getWidth() / 2;
int tmpTileHt = bitmapArr[i][j].getHeight() / 2;
Bitmap b = ExtraFunctions.ScaleBitmap(bitmapArr[i][j],
tmpTilewd, tmpTileHt);
if (bitmapArr1 != null)
bitmapArr1[i][j] = b;
}
}
}
lastPressed1 = System.currentTimeMillis();
setCenterLatLon();
zoomLevel++;
if (!isStarted)
tryLoadMap();
}
}
void tryLoadMap() {
if (isStarted)
return;
isStarted = true;
Thread th = new Thread() {
public void run() {
try {
Thread.sleep(System.currentTimeMillis() - lastPressed1);
} catch (InterruptedException e) {
e.printStackTrace();
}
loadLocalMap();
if (showDirection)
DirectionPath(lat, lon);
if (isSearchAvail)
SearchPath(lat, lon, tmpselected);
isStarted = false;
}
};
th.start();
}
缩放:
public static Bitmap ScaleBitmap(Bitmap bitmapOrg,int newWidth,int newHeight) {
if(bitmapOrg==null)
return null;
int width = bitmapOrg.getWidth();
int height = bitmapOrg.getHeight();
// calculate the scale - in this case = 0.4f
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// createa matrix for the manipulation
Matrix matrix = new Matrix();
// resize the bit map
matrix.postScale(scaleWidth, scaleHeight);
// rotate the Bitmap
//matrix.postRotate(45);
// recreate the new Bitmap
return Bitmap
.createBitmap(bitmapOrg, 0, 0, width, height, matrix, true);
}
LOgcat:
08-30 17:09:30.342: E/dalvikvm-heap(440): 1451808-byte external allocation too large for this process.
08-30 17:09:30.382: E/GraphicsJNI(440): VM won't let us allocate 1451808 bytes
08-30 17:09:30.382: D/AndroidRuntime(440): Shutting down VM
08-30 17:09:30.401: W/dalvikvm(440): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
08-30 17:09:30.442: E/AndroidRuntime(440): FATAL EXCEPTION: main
08-30 17:09:30.442: E/AndroidRuntime(440): java.lang.IllegalStateException: Could not execute method of the activity
08-30 17:09:30.442: E/AndroidRuntime(440): at android.view.View$1.onClick(View.java:2072)
08-30 17:09:30.442: E/AndroidRuntime(440): at android.view.View.performClick(View.java:2408)
08-30 17:09:30.442: E/AndroidRuntime(440): at android.view.View$PerformClick.run(View.java:8816)
08-30 17:09:30.442: E/AndroidRuntime(440): at android.os.Handler.handleCallback(Handler.java:587)
08-30 17:09:30.442: E/AndroidRuntime(440): at android.os.Handler.dispatchMessage(Handler.java:92)
08-30 17:09:30.442: E/AndroidRuntime(440): at android.os.Looper.loop(Looper.java:123)
08-30 17:09:30.442: E/AndroidRuntime(440): at android.app.ActivityThread.main(ActivityThread.java:4627)
08-30 17:09:30.442: E/AndroidRuntime(440): at java.lang.reflect.Method.invokeNative(Native Method)
08-30 17:09:30.442: E/AndroidRuntime(440): at java.lang.reflect.Method.invoke(Method.java:521)
08-30 17:09:30.442: E/AndroidRuntime(440): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
08-30 17:09:30.442: E/AndroidRuntime(440): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
08-30 17:09:30.442: E/AndroidRuntime(440): at dalvik.system.NativeStart.main(Native Method)
08-30 17:09:30.442: E/AndroidRuntime(440): Caused by: java.lang.reflect.InvocationTargetException
08-30 17:09:30.442: E/AndroidRuntime(440): at com.Map.zoomIn(MapScreen.java:762)
08-30 17:09:30.442: E/AndroidRuntime(440): at java.lang.reflect.Method.invokeNative(Native Method)
08-30 17:09:30.442: E/AndroidRuntime(440): at java.lang.reflect.Method.invoke(Method.java:521)
08-30 17:09:30.442: E/AndroidRuntime(440): at android.view.View$1.onClick(View.java:2067)
08-30 17:09:30.442: E/AndroidRuntime(440): ... 11 more
08-30 17:09:30.442: E/AndroidRuntime(440): Caused by: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
08-30 17:09:30.442: E/AndroidRuntime(440): at android.graphics.Bitmap.nativeCreate(Native Method)
08-30 17:09:30.442: E/AndroidRuntime(440): at android.graphics.Bitmap.createBitmap(Bitmap.java:468)
08-30 17:09:30.442: E/AndroidRuntime(440): at android.graphics.Bitmap.createBitmap(Bitmap.java:435)
08-30 17:09:30.442: E/AndroidRuntime(440): at com.Map.ncore.XtraFunctions.ScaleBitmap(ExtraFunctions.java:32)
08-30 17:09:30.442: E/AndroidRuntime(440): at com.Map.MapCanvas.zoomIn(MapCanvas.java:1018)
08-30 17:09:30.442: E/AndroidRuntime(440): ... 15 more
08-30 17:14:30.522: I/Process(440): Sending signal. PID: 440 SIG: 9
答案 0 :(得分:1)
嗯什么是bitmapArr[i][j]
?那些解码的位图?如果是这样的话,那你就错过了这一点。您应该在将它们读入bitmapArr
之前进行缩放。否则,您将保留原始文件和下采样文件的副本,不保存任何内容(实际上使用更多内存)。在知道要缩小到哪个尺寸之前,不应该从磁盘(或任何地方)读取图像。