gpt4 book ai didi

长按时的 Android map 标记绘制在实际长按区域下方(在 API 15 上)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:17:32 25 4
gpt4 key购买 nike

我已经为此绞尽脑汁好几天了,用谷歌搜索和搜索,但似乎找不到其他人报告此类问题(可能错过了)。

我有一个自定义的 Mapview 类,它监听 longpress 等,并使用它在我的 map 上绘制标记。它在 API-8 上绘制正常。但在 API-15 上,标记在用户手指进行长按的位置下方偏移了约 2 厘米。对于实际设备 (samsung s2) 和 eclipse 模拟器都观察到了这一点。此外,在所有缩放级别上都观察到手指长按区域与绘制的标记区域(偏移约 2 厘米)。

这是我自定义的 Mapview 类(从某处拉出来的):

public class MyCustomMapView extends MapView {
public interface OnLongpressListener {
public void onLongpress(MapView view, GeoPoint longpressLocation);
}

static final int LONGPRESS_THRESHOLD = 500;
private GeoPoint lastMapCenter;

private Timer longpressTimer = new Timer();
private MyCustomMapView.OnLongpressListener longpressListener;


public MyCustomMapView(Context context, String apiKey) {
super(context, apiKey);
}

public MyCustomMapView(Context context, AttributeSet attrs) {
super(context, attrs);
}

public MyCustomMapView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}

public void setOnLongpressListener(MyCustomMapView.OnLongpressListener listener) {
longpressListener = listener;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
handleLongpress(event);

return super.onTouchEvent(event);
}

private void handleLongpress(final MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {
// Finger has touched screen.
longpressTimer = new Timer();
longpressTimer.schedule(new TimerTask() {
@Override
public void run() {

GeoPoint longpressLocation = getProjection().fromPixels((int)event.getX(), (int)event.getY());

/*
* Fire the listener. We pass the map location
* of the longpress as well, in case it is needed
* by the caller.
*/
longpressListener.onLongpress(MyCustomMapView.this, longpressLocation);
}

}, LONGPRESS_THRESHOLD);

lastMapCenter = getMapCenter();
}

if (event.getAction() == MotionEvent.ACTION_MOVE) {

if (!getMapCenter().equals(lastMapCenter)) {
// User is panning the map, this is no longpress
longpressTimer.cancel();
}

lastMapCenter = getMapCenter();
}

if (event.getAction() == MotionEvent.ACTION_UP) {
// User has removed finger from map.
longpressTimer.cancel();
}

if (event.getPointerCount() > 1) {
// This is a multitouch event, probably zooming.
longpressTimer.cancel();
}
}

这就是我如何调用上面的类:

custom_marker = getResources().getDrawable(R.drawable.marker3);
custom_marker.setBounds(-custom_marker.getIntrinsicWidth(), -custom_marker.getIntrinsicHeight(), 0, 0);
customSitesOverlay = new CustomSitesOverlay(custom_marker);
mapView.getOverlays().add(customSitesOverlay);
customSitesOverlay.addOverlay(new OverlayItem(longpressLocation, "User Marker", id));

最佳答案

这看起来像是一个 setBounds 问题。您正在将标记边界设置为可绘制对象右下角的中心。这是故意的行为吗?

您可以将标记设置为底部中心的中心(这是最常用的类型或标记),将边界设置为:

custom_marker.setBounds(-custom_marker.getIntrinsicWidth()/2, -custom_marker.getIntrinsicHeight(), custom_marker.getIntrinsicWidth()/2, 0); 

祝你好运。

关于长按时的 Android map 标记绘制在实际长按区域下方(在 API 15 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12756392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com