Google 地图 API。投影
Google Maps API. Projection
我正在尝试将 ImageView
拖到 google 地图并将其作为标记放置。
地图位于 FrameLayout
:
<FrameLayout
android:id="@+id/map_frg"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2">
我已经设置为这个 FrameLayout
OnDragListener
:
private class PinDragListener implements View.OnDragListener {
private GoogleMap map;
public PinDragListener(GoogleMap map) {
this.map = map;
}
@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DROP:
MarkerOptions markerOptions = new MarkerOptions()
.draggable(true)
.anchor(0.0f, 1.0f);
int[] coords = new int[2];
v.getLocationOnScreen(coords);
Projection projection = map.getProjection();
LatLng latLng = projection.fromScreenLocation(new Point(coords[0], coords[1]));
markerOptions.position(latLng);
markerOptions.visible(true);
map.addMarker(markerOptions);
break;
default:
break;
}
return true;
}
}
但是当图像被放到某个地方时,标记一次又一次地放在左下角。有什么问题?
更新:
我已经通过侦听器传递了拖动视图
private class PinTouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
ClipData data = ClipData.newPlainText("", "");
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
v.startDrag(data, shadowBuilder, v, 0);
dragPinListener.onViewTouched(v);
return true;
} else {
return false;
}
}
}
我每次放下标记时都会得到这样的坐标
x = 0 | y = 1234
Lat = 65.96291676309829 | Lng = -18.548969998955727
我需要在 OnDragListener
中的 onDrag
方法中使用 event.getX()
和 event.getY()
来检索当前视图屏幕位置。
OnDragListener.onDrag() 方法将针对拖拽过程中发生的每个特定事件调用,传入一个 DragEvent 来描述每个事件的细节。
每个 DragEvent 都会有以下操作之一:
ACTION_DRAG_LOCATION : 发送到 ACTION_DRAG_ENTERED 和∀ACTION_DRAG_EXITED 之间的视图,以及该视图内拖动的当前位置。
・ 可以通过getX()和getY()获取位置。
工作原理
这是拖放功能的 example,我们创建了一个实现 OnDragListener 接口的自定义 ImageView。
请参考以下这篇link:
http://www.tutorialspoint.com/android/android_drag_and_drop.htm
https://github.com/wada811/Android-View-Drag-And-Drop-Sample/blob/master/app/src/main/java/com/wada811/android_view_drag_and_drop_sample/DragAndDropFrameLayout.java
希望对您有所帮助。
我正在尝试将 ImageView
拖到 google 地图并将其作为标记放置。
地图位于 FrameLayout
:
<FrameLayout
android:id="@+id/map_frg"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="2">
我已经设置为这个 FrameLayout
OnDragListener
:
private class PinDragListener implements View.OnDragListener {
private GoogleMap map;
public PinDragListener(GoogleMap map) {
this.map = map;
}
@Override
public boolean onDrag(View v, DragEvent event) {
switch (event.getAction()) {
case DragEvent.ACTION_DROP:
MarkerOptions markerOptions = new MarkerOptions()
.draggable(true)
.anchor(0.0f, 1.0f);
int[] coords = new int[2];
v.getLocationOnScreen(coords);
Projection projection = map.getProjection();
LatLng latLng = projection.fromScreenLocation(new Point(coords[0], coords[1]));
markerOptions.position(latLng);
markerOptions.visible(true);
map.addMarker(markerOptions);
break;
default:
break;
}
return true;
}
}
但是当图像被放到某个地方时,标记一次又一次地放在左下角。有什么问题?
更新:
我已经通过侦听器传递了拖动视图
private class PinTouchListener implements OnTouchListener {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
ClipData data = ClipData.newPlainText("", "");
DragShadowBuilder shadowBuilder = new View.DragShadowBuilder(v);
v.startDrag(data, shadowBuilder, v, 0);
dragPinListener.onViewTouched(v);
return true;
} else {
return false;
}
}
}
我每次放下标记时都会得到这样的坐标
x = 0 | y = 1234
Lat = 65.96291676309829 | Lng = -18.548969998955727
我需要在 OnDragListener
中的 onDrag
方法中使用 event.getX()
和 event.getY()
来检索当前视图屏幕位置。
OnDragListener.onDrag() 方法将针对拖拽过程中发生的每个特定事件调用,传入一个 DragEvent 来描述每个事件的细节。 每个 DragEvent 都会有以下操作之一:
ACTION_DRAG_LOCATION : 发送到 ACTION_DRAG_ENTERED 和∀ACTION_DRAG_EXITED 之间的视图,以及该视图内拖动的当前位置。 ・ 可以通过getX()和getY()获取位置。
工作原理 这是拖放功能的 example,我们创建了一个实现 OnDragListener 接口的自定义 ImageView。
请参考以下这篇link: http://www.tutorialspoint.com/android/android_drag_and_drop.htm https://github.com/wada811/Android-View-Drag-And-Drop-Sample/blob/master/app/src/main/java/com/wada811/android_view_drag_and_drop_sample/DragAndDropFrameLayout.java
希望对您有所帮助。