Java 在Android的OSMDroid中旋转一个标记?
好的,这个问题困扰了我好几个小时,我有以下相对简单的代码在osmdroid映射上放置一个标记Java 在Android的OSMDroid中旋转一个标记?,java,android,maps,openstreetmap,osmdroid,Java,Android,Maps,Openstreetmap,Osmdroid,好的,这个问题困扰了我好几个小时,我有以下相对简单的代码在osmdroid映射上放置一个标记 final ArrayList<OverlayItem> items = new ArrayList<OverlayItem>(); OverlayItem marker = new OverlayItem("markerTitle", "markerDescription", new GeoPoint(52.033954,1.210179)); marker.setMarker
final ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
OverlayItem marker = new OverlayItem("markerTitle", "markerDescription", new GeoPoint(52.033954,1.210179));
marker.setMarkerHotspot(OverlayItem.HotspotPlace.TOP_CENTER);
items.add(marker);
Drawable newMarker = this.getResources().getDrawable(R.drawable.maincar);
DefaultResourceProxyImpl resProxyImp = new DefaultResourceProxyImpl(getApplicationContext());
ItemizedIconOverlay markersOverlay = new ItemizedIconOverlay<OverlayItem>(items, newMarker, null, resProxyImp);
mapView.getOverlays().add(markersOverlay);
final ArrayList items=new ArrayList();
叠加瞬变电磁标记=新叠加瞬变电磁(“markerTitle”、“markerDescription”、新地质点(52.033954,1.210179));
marker.setMarkerHotspot(覆盖项目、热点位置、顶部中心);
项目。添加(标记);
Drawable newMarker=this.getResources().getDrawable(R.Drawable.maincar);
DefaultResourceProxyImpl resProxyImp=新的DefaultResourceProxyImpl(getApplicationContext());
itemizedictionoverlay markersOverlay=newitemizedictionoverlay(items,newMarker,null,resProxyImp);
mapView.getOverlays().add(markersOverlay);
但是,标记始终朝向屏幕顶部(0度)。我怎样才能轻松地将每个标记旋转到指定的角度(360度是一个整圈)?尝试以下方法:仅当需要旋转相机时
CameraPosition cameraPosition = new CameraPosition.Builder()
.target(centerCoordinates) // Sets the center of the map
.zoom(zoom) // Sets the zoom
.bearing(bearing) // Sets the orientation of the camera to east
.tilt(30) // Sets the tilt of the camera to 30 degrees
.build(); // Creates a CameraPosition from the builder
googleMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition));
最好的方法可能是创建ItemizedItemOverlay的子类。重写onDrawItem()并尝试以下操作:
@Override
protected void onDrawItem(ISafeCanvas canvas, Item item, Point curScreenCoords, float aMapOrientation) {
int degrees = 90;
canvas.save();
canvas.rotate(degrees, curScreenCoords.x, curScreenCoords.y);
super.onDrawItem(canvas, item, curScreenCoords, aMapOrientation);
canvas.restore();
}
Bitmap source = BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher);
Bitmap target = RotateMyBitmap(source, 120.0f);
final ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
OverlayItem marker = new OverlayItem("markerTitle", "markerDescription", new GeoPoint(52.033954,1.210179));
marker.setMarkerHotspot(OverlayItem.HotspotPlace.TOP_CENTER);
items.add(marker);
Drawable newMarker = new BitmapDrawable(getResources(), target);
//Drawable newMarker = this.getResources().getDrawable(R.drawable.maincar);
DefaultResourceProxyImpl resProxyImp = new DefaultResourceProxyImpl(getApplicationContext());
ItemizedIconOverlay markersOverlay = new ItemizedIconOverlay<OverlayItem>(items, newMarker, null, resProxyImp);
mapView.getOverlays().add(markersOverlay);
尝试使用如下方法使用RotateMyBitmap:
@Override
protected void onDrawItem(ISafeCanvas canvas, Item item, Point curScreenCoords, float aMapOrientation) {
int degrees = 90;
canvas.save();
canvas.rotate(degrees, curScreenCoords.x, curScreenCoords.y);
super.onDrawItem(canvas, item, curScreenCoords, aMapOrientation);
canvas.restore();
}
Bitmap source = BitmapFactory.decodeResource(this.getResources(), R.drawable.ic_launcher);
Bitmap target = RotateMyBitmap(source, 120.0f);
final ArrayList<OverlayItem> items = new ArrayList<OverlayItem>();
OverlayItem marker = new OverlayItem("markerTitle", "markerDescription", new GeoPoint(52.033954,1.210179));
marker.setMarkerHotspot(OverlayItem.HotspotPlace.TOP_CENTER);
items.add(marker);
Drawable newMarker = new BitmapDrawable(getResources(), target);
//Drawable newMarker = this.getResources().getDrawable(R.drawable.maincar);
DefaultResourceProxyImpl resProxyImp = new DefaultResourceProxyImpl(getApplicationContext());
ItemizedIconOverlay markersOverlay = new ItemizedIconOverlay<OverlayItem>(items, newMarker, null, resProxyImp);
mapView.getOverlays().add(markersOverlay);
结果是:
这很好,但我建议您使用class这个怎么样:
Bitmap bmpOriginal = BitmapFactory.decodeResource(this.getResources(), R.drawable.maincar_osm);
Bitmap bmResult = Bitmap.createBitmap(bmpOriginal.getWidth()*2, bmpOriginal.getHeight()*2, Bitmap.Config.ARGB_8888);
Canvas tempCanvas = new Canvas(bmResult);
tempCanvas.rotate(270, bmpOriginal.getWidth()/2, bmpOriginal.getHeight()/2);
tempCanvas.drawBitmap(bmpOriginal, 0, 0, null);
Drawable newMarker = new BitmapDrawable(getResources(),bmResult);
DefaultResourceProxyImpl resProxyImp = new DefaultResourceProxyImpl(getApplicationContext());
ItemizedIconOverlay markersOverlay = new ItemizedIconOverlay<OverlayItem>(items, newMarker, null, resProxyImp);
mapView.getOverlays().add(markersOverlay);
Bitmap bmpOriginal=BitmapFactory.decodeResource(this.getResources(),R.drawable.maincar\u osm);
位图bmResult=Bitmap.createBitmap(bmpOriginal.getWidth()*2,bmpOriginal.getHeight()*2,Bitmap.Config.ARGB_8888);
Canvas tempCanvas=新画布(bmResult);
tempCanvas.rotate(270,bmpOriginal.getWidth()/2,bmpOriginal.getHeight()/2);
drawBitmap(bmpOriginal,0,0,null);
Drawable newMarker=新的位图Drawable(getResources(),bmResult);
DefaultResourceProxyImpl resProxyImp=新的DefaultResourceProxyImpl(getApplicationContext());
itemizedictionoverlay markersOverlay=newitemizedictionoverlay(items,newMarker,null,resProxyImp);
mapView.getOverlays().add(markersOverlay);
如果您不想添加任何自定义代码,您还可以使用(位于osmdroid顶部)的标记替换itemizedictionoverlay
它支持设置旋转(度数)
它还支持“平面”或“广告牌”模式,这取决于如果地图也旋转,您希望发生什么。不幸的是,这是针对谷歌地图而不是OSM,并旋转整个地图,而不仅仅是标记。谢谢你至少能回答:-)考虑把赏金给回答你问题的人。