我正在使用 Mapsforge 并且我有一个 MapView 我已经添加了一些点。有些点距离太近,用户无法单击它们并获得正确的弹出窗口,甚至无法一直放大。
我想要做的是让他们可以长按 map 的某个区域,然后会出现一个可滚动的对话框,列出他们长按位置的 x 像素范围内的点或类似内容。我可以找出对话框和长按的东西,但我很好奇是否有人知道如何在不通过我的应用程序的数据库并对我保存在那里的每个点进行计算的情况下捕获“我单击的 x 像素内的点”?应该有一些我可以调用或使用的 mapsforge 方法吧?
编辑: 我最近又回到了这个问题并添加了以下代码来捕捉长按事件,我现在正试图找出一种方法来捕捉周围的点。我认为它需要基于点在屏幕上的位置,因为如果我根据数据库的纬度和经度来做,我必须为每个缩放级别设置不同的距离值,等等。
boolean ACTION_MOVED = false;
long beginTime;
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN: {
beginTime = System.currentTimeMillis();
ACTION_MOVED = false;
break;
}
case MotionEvent.ACTION_MOVE: {
ACTION_MOVED = true;
break;
}
case MotionEvent.ACTION_UP: {
if (System.currentTimeMillis() - beginTime >= ViewConfiguration.getLongPressTimeout())
if (!ACTION_MOVED) {
Toast.makeText(mapActivity, "long Press", Toast.LENGTH_SHORT).show();
ACTION_MOVED = false;
return true;
}
break;
}
}
return view.onTouchEvent(motionEvent);
}
最佳答案
因为这已经被查看了几次,所以我想我应该发布我最终是如何让它工作的。我基本上遍历数据库,看看是否每个点都在我根据测试选择的某个选择区域内:
public static boolean withinSelectionArea(GeoPoint myPointG, GeoPoint dbPointG, Context context) {
Point myPoint = projection.toPixels(myPointG, null);
Point dbPoint = projection.toPixels(dbPointG, null);
float a = dbPoint.x - myPoint.x;
float b = dbPoint.y - myPoint.y;
double distance = Math.sqrt(a * a + b * b);
return distance < context.getResources().getDisplayMetrics().densityDpi / 4;
}
我还覆盖了 onLongPress 处理程序并在其中调用了上述方法。
关于Android选择长按半径内最近的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10636960/