Back to project page geoar-app.
The source code is released under:
Apache License
If you think the Android project geoar-app listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
/** * Copyright 2012 52North Initiative for Geospatial Open Source Software GmbH *//w w w . ja v a 2 s . c o m * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.n52.geoar.map.view.overlay; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; import org.mapsforge.android.maps.MapView; import org.mapsforge.android.maps.Projection; import org.mapsforge.core.GeoPoint; import android.graphics.Canvas; import android.graphics.Rect; import android.graphics.drawable.Drawable; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Point; /** * * @author Arne de Wall <a.dewall@52North.org> * */ public class DataSourcePointOverlay extends DataSourceOverlay<Point, PointOverlayType> { private final List<PointOverlayType> pointOverlays = Collections .synchronizedList(new ArrayList<PointOverlayType>()); private final Set<Integer> visiblePointOverlays = Collections .synchronizedSet(new HashSet<Integer>()); private Drawable defaultMarker; private int left, right, bottom, top; private android.graphics.Point itemPosition; public DataSourcePointOverlay(){ } @Override public boolean onLongPress(GeoPoint geoPoint, MapView mapView) { return super.onLongPress(geoPoint, mapView); } @Override public boolean onTap(GeoPoint geoPoint, MapView mapView) { if(overlayItemTapListener == null) return false; Projection projection = mapView.getProjection(); android.graphics.Point eventPosition = projection.toPixels(geoPoint, null); if (eventPosition == null) return false; android.graphics.Point checkItemPoint = new android.graphics.Point(); for (Integer index : visiblePointOverlays) { PointOverlayType pointOverlay = pointOverlays.get(index); if (pointOverlay.getPoint() == null) continue; checkItemPoint = projection.toPixels(pointOverlay.getPoint(), checkItemPoint); Rect markerBounds = pointOverlay.marker.getBounds(); int checkLeft = checkItemPoint.x + markerBounds.left; int checkRight = checkItemPoint.x + markerBounds.right; int checkTop = checkItemPoint.y + markerBounds.top; int checkBottom = checkItemPoint.y + markerBounds.bottom; if (checkRight >= eventPosition.x // && checkLeft <= eventPosition.x && checkBottom >= eventPosition.y && checkTop <= eventPosition.y) { overlayItemTapListener.onOverlayItemTap(pointOverlays.get(index)); return true; } } return false; } @Override protected void drawOverlayBitmap(Canvas canvas, android.graphics.Point drawPosition, Projection projection, byte zoom) { android.graphics.Point pointOverlayPosition = new android.graphics.Point(); int index = 0; visiblePointOverlays.clear(); for (PointOverlayType pot : pointOverlays) { if (zoom != pot.cachedZoomLevel) { pot.cachedMapPosition = projection.toPoint(pot.getPoint(), pot.cachedMapPosition, zoom); pot.cachedZoomLevel = zoom; } pointOverlayPosition.x = pot.cachedMapPosition.x - drawPosition.x; pointOverlayPosition.y = pot.cachedMapPosition.y - drawPosition.y; Rect markerBounds = pot.marker.copyBounds(); this.left = pointOverlayPosition.x + markerBounds.left; this.right = pointOverlayPosition.x + markerBounds.right; this.top = pointOverlayPosition.y + markerBounds.top; this.bottom = pointOverlayPosition.y + markerBounds.bottom; // check boundingbox marker interesects with canvas if (this.right >= 0 && this.left <= canvas.getWidth() && this.bottom >= 0 && this.top <= canvas.getHeight()) { pot.marker.setBounds(left, top, right, bottom); pot.marker.draw(canvas); pot.marker.setBounds(markerBounds); this.visiblePointOverlays.add(index); } index++; } } @Override public void setOverlayTypes(List<PointOverlayType> overlayTypes) { this.pointOverlays.clear(); pointOverlays.addAll(overlayTypes); } @Override public void clear() { pointOverlays.clear(); } @Override public void removeOverlayType(OverlayType<? extends Geometry> overlayType) { this.pointOverlays.remove(overlayType); populate(); } @Override public void addOverlayType(OverlayType<? extends Geometry> overlaytype) { this.pointOverlays.add((PointOverlayType) overlaytype); populate(); } @SuppressWarnings("unchecked") @Override public void addOverlayTypes( List<OverlayType<? extends Geometry>> overlaytypes) { this.pointOverlays .addAll((List<PointOverlayType>) (List<?>) overlaytypes); populate(); } @Override public List<PointOverlayType> getOverlayTypes() { return new ArrayList<PointOverlayType>(pointOverlays); } }