#android #google-maps #overlay
#Android #google-карты #наложение
Вопрос:
В API javascript google maps вы можете добавить groundoverlay и просто передать две точки: точку lefttoplatamp; lefttoplong и точку rightbottomlatamp; rightbottomlong… (Обычные наложения не остаются между этими двумя точками, но остаются того же размера при увеличении или уменьшении масштаба.)
Я искал что-то подобное в Android Google Maps api, но нигде не могу его найти. Есть ли такая вещь в API карт Android, и если ее нет, каков наилучший способ имитации этой функции?
Комментарии:
1. Не уверен, когда была добавлена поддержка GroundOverlays в Google Maps Android API, но она доступна сейчас. В API есть класс с именем «GroundOverlay», который выполняет именно то, что делает эквивалентный javascript API. Вот ссылка .
Ответ №1:
Это лучше. Использование метода рисования гарантирует, что вы рисуете только ту часть растрового изображения, которая фактически находится на экране. Иногда я все еще получаю ошибку превышения бюджета виртуальной машины. Я все еще изучаю это.
public class GroundOverlay extends Overlay {
Bitmap original;
Bitmap resized;
int lastZoomlevel;
SnowmapsOverlayObject snowmapsObject;
public static Boolean DRAW = false;
GeoPoint topGeoPoint;
GeoPoint bottomGeoPoint;
OnReady _onReady = null;
Boolean ready = false;
public GroundOverlay(Bitmap original, SnowmapsOverlayObject snowmapsObject) {
this.original = Bitmap.createScaledBitmap(original, original.getWidth(), original.getHeight(), true);
this.snowmapsObject = snowmapsObject;
topGeoPoint = new GeoPoint((int) ((snowmapsObject.topLat).doubleValue() * 1E6), (int) ((snowmapsObject.topLng).doubleValue() * 1E6));
bottomGeoPoint = new GeoPoint((int) ((snowmapsObject.bottomLat).doubleValue() * 1E6), (int) ((snowmapsObject.bottomLng).doubleValue() * 1E6));
}
@Override
public void draw(Canvas canvas, MapView mapView, boolean shadow) {
super.draw(canvas, mapView, false);
Projection projection = mapView.getProjection();
Point leftTop = new Point();
Point rightTop = new Point();
Point rightBottom = new Point();
Point leftBottom = new Point();
projection.toPixels(topGeoPoint, leftTop);
projection.toPixels(new GeoPoint(topGeoPoint.getLatitudeE6(), bottomGeoPoint.getLongitudeE6()), rightTop);
projection.toPixels(bottomGeoPoint, rightBottom);
projection.toPixels(new GeoPoint(bottomGeoPoint.getLatitudeE6(), topGeoPoint.getLongitudeE6()), leftBottom);
if (
(leftTop.x < 0 || leftTop.y < 0) amp;amp;
(rightTop.x < 0 || rightTop.y < 0) amp;amp;
(rightBottom.x < 0 || rightBottom.y < 0) amp;amp;
(leftBottom.x < 0 || leftBottom.y < 0)) {
// Not on screen? Don't draw the overlay
return;
}
// GeoPoint mapCenter = mapView.getMapCenter();
Paint paint = new Paint();
paint.setFilterBitmap(true);
paint.setAntiAlias(true);
canvas.drawBitmap(original, null, new Rect(leftTop.x, leftTop.y, rightBottom.x, rightBottom.y), paint);
if (!ready amp;amp; _onReady != null) {
ready = true;
_onReady.done();
}
}
@Override
public boolean onTouchEvent(MotionEvent e, MapView mapView) {
super.onTouchEvent(e, mapView);
if (e.getAction() == MotionEvent.ACTION_UP) {
setDrawTrue();
}
return false;
}
private void setDrawTrue() {
DRAW = true;
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
DRAW = false;
}
}, 100);
}
public void setOnReady(OnReady onReady) {
this._onReady = onReady;
}
public interface OnReady {
public void done();
}
}
Комментарии:
1. Спасибо, но это все еще напрасно, изображения огромны, с которыми я работаю. Мне нужен способ обрезать изображение
Ответ №2:
Исправил это сам.
Для всех, у кого такая же проблема, вот мой код:
public class GroundOverlay extends OverlayItem {
private MapView map;
private Bitmap overlay;
private GeoPoint topGeoPoint;
private GeoPoint bottomGeoPoint;
public Drawable drawable;
public GroundOverlay(
MapView map,
GeoPoint topLeftGeoPoint,
GeoPoint bottomRightGeoPoint,
Bitmap overlay,
String title,
String snippet) {
super(bottomRightGeoPoint, title, snippet);
this.map = map;
this.overlay = overlay;
this.topGeoPoint = topLeftGeoPoint;
this.bottomGeoPoint = bottomRightGeoPoint;
_init();
}
private void _init() {
Point topPoint = new Point();
Point bottomPoint = new Point();
map.getProjection().toPixels(topGeoPoint, topPoint);
map.getProjection().toPixels(bottomGeoPoint, bottomPoint);
int width = bottomPoint.x - topPoint.x;
int height = bottomPoint.y - topPoint.y;
drawable = overlayDrawable(overlay, width, height);
}
public BitmapDrawable overlayDrawable(Bitmap bitmap, int newWidth, int newHeight) {
Matrix scale = new Matrix();
float scaleFloat = (float)newWidth / (float)bitmap.getWidth();
scale.postScale(scaleFloat, scaleFloat);
Bitmap bitmapScaled = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), scale, false);
BitmapDrawable bm = new BitmapDrawable(bitmapScaled);
bm.setBounds(0,0,bitmapScaled.getWidth(),bitmapScaled.getHeight());
return bm;
}
}
Вам нужно будет где-то использовать setMarker (drawable), и он должен работать. Я делаю это где-то в другом месте (отсюда и общедоступный рисунок).
Комментарии:
1. Я пробовал это, но я получаю VMBudget превышает ошибку. Есть какой — нибудь способ решить эту проблему?
2. Я тоже это понимаю. Не на моем собственном телефоне, а на телефоне одного из моих коллег. Но я также обнаружил, что мне следует использовать метод рисования, который немного помогает. Смотрите мой новый ответ для нового кода.