5

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

我有一个自定义的 Mapview 类,它监听 longpress 等,并使用它在我的地图上绘制标记。它在 API-8 上绘制得很好。但在 API-15 上,标记在用户手指进行长按的位置下方偏移约 2 厘米。对于实际设备(三星 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));
4

1 回答 1

1

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

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

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

祝你好运。

于 2012-10-06T15:54:04.040 回答