Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:ItemizeOverlay onTouchEvent和onTap重叠_Android_Android Mapview_Touch Event_Overlayitem - Fatal编程技术网

Android:ItemizeOverlay onTouchEvent和onTap重叠

Android:ItemizeOverlay onTouchEvent和onTap重叠,android,android-mapview,touch-event,overlayitem,Android,Android Mapview,Touch Event,Overlayitem,我正在尝试在地图覆盖上放置一个标记,然后在用户选择可绘制对象时显示一个对话框。问题是这些事件似乎有重叠。单击地图并绘制标记后,onTap会立即启动,因为我刚刚绘制了标记,它直接位于onTap事件下,所以我的对话框总是启动。有人对如何使这些活动相互排斥有什么建议吗 以下是地图活动的代码: public class SelectGameLocation extends MapActivity implements GestureDetector.OnGestureListener, GestureD

我正在尝试在地图覆盖上放置一个标记,然后在用户选择可绘制对象时显示一个对话框。问题是这些事件似乎有重叠。单击地图并绘制标记后,onTap会立即启动,因为我刚刚绘制了标记,它直接位于onTap事件下,所以我的对话框总是启动。有人对如何使这些活动相互排斥有什么建议吗

以下是地图活动的代码:

public class SelectGameLocation extends MapActivity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener  {

    private MapView mapView = null;
    private SelectGameLocationItemizedOverlay selectLocationOverlay = null;
    private List<Overlay> mapOverlays = null;
    private GestureDetector gestureDetector = null;

    @Override
    protected void onCreate(Bundle arg0) {
        super.onCreate(arg0);

        //set the layout
        setContentView(R.layout.activity_select_game_location);

        //configure activity for double clicks
        gestureDetector = new GestureDetector(this);
        gestureDetector.setOnDoubleTapListener(this);

        //create and configure mapview
        mapView = (MapView) findViewById(R.id.selectGameLocation);
        mapView.setBuiltInZoomControls(true);
        mapView.setHapticFeedbackEnabled(true);

        //configure the overlay to draw the icons on the map
        mapOverlays = mapView.getOverlays();
        Drawable drawable = this.getResources().getDrawable(R.drawable.map_icon);
        selectLocationOverlay = new SelectGameLocationItemizedOverlay(drawable, this);
        mapOverlays.add(selectLocationOverlay);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        gestureDetector.onTouchEvent(ev);
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onDoubleTap(MotionEvent me) {
        GeoPoint p = GeoPointHelper.getPointClicked(me, mapView);
        mapView.getController().animateTo(p);
        mapView.getController().zoomIn();
        return true;
    }

    //Overridden methods but not used
    @Override
    public boolean onDoubleTapEvent(MotionEvent me) {
        return false;
    }

    @Override
    public boolean onDown(MotionEvent me) {
        return false;
    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {
    }

    @Override
    public boolean onSingleTapConfirmed(MotionEvent me) {
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        return false;
    }

    @Override
    public boolean onSingleTapUp(MotionEvent me) {
        return false;
    }
}
public类SelectGameLocation扩展了MapActivity实现了GestureDetector.OnEstureListener、GestureDetector.OnDoubleTapListener{
私有MapView MapView=null;
private SelectGameLocationItemizedOverlay selectLocationOverlay=null;
私有列表mapOverlays=null;
私人GestureDetector GestureDetector=null;
@凌驾
创建时受保护的void(包arg0){
super.onCreate(arg0);
//设置布局
setContentView(R.layout.activity\u select\u game\u location);
//为双击配置活动
gestureDetector=新的gestureDetector(本);
gestureDetector.setOnDoubleTapListener(此);
//创建和配置mapview
mapView=(mapView)findViewById(R.id.selectGameLocation);
mapView.SetBuilTinZoomControl(真);
mapView.setHapticFeedbackEnabled(真);
//配置覆盖以在地图上绘制图标
mapOverlays=mapView.getOverlays();
Drawable Drawable=this.getResources().getDrawable(R.Drawable.map_图标);
selectLocationOverlay=new SelectGameLocationItemizedOverlay(可绘制,此项);
mapOverlays.add(选择LocationOverlays);
}
@凌驾
公共布尔dispatchTouchEvent(MotionEvent ev){
手势检测器。开触点(ev);
返回超级dispatchTouchEvent(ev);
}
@凌驾
公共布尔onDoubleTap(MotionEvent me){
GeoPoint p=GeoPointHelper.getPointClicked(me,mapView);
mapView.getController().animateTo(p);
mapView.getController().zoomIn();
返回true;
}
//已重写但未使用的方法
@凌驾
公共布尔OnDoubleTapeEvent(MotionEvent me){
返回false;
}
@凌驾
公共布尔onDown(MotionEvent me){
返回false;
}
@凌驾
受保护的布尔值isRouteDisplayed(){
返回false;
}
@凌驾
在ShowPress上公开作废(运动事件e){
}
@凌驾
公共布尔值OnSingleTapConfiged(MotionEvent me){
返回false;
}
@凌驾
公共布尔onScroll(MotionEvent e1、MotionEvent e2、浮点距离X、浮点距离Y){
返回false;
}
@凌驾
公开无效在线新闻(运动事件e){
}
@凌驾
公共布尔onFling(MotionEvent e1、MotionEvent e2、float-velocityX、float-velocityY){
返回false;
}
@凌驾
公共布尔onSingleTapUp(MotionEvent me){
返回false;
}
}
以及覆盖类的代码:

public class SelectGameLocationItemizedOverlay extends ItemizedOverlay {

    private Context context = null;
    private List<OverlayItem> overlays = new ArrayList<OverlayItem>();

    public SelectGameLocationItemizedOverlay(Drawable marker, Context context) {
        super(boundCenterBottom(marker));
        this.context = context;
    }

    @Override
    protected boolean onTap(int index) {

        OverlayItem itemClicked = overlays.get(index);
        AlertDialog.Builder dialog = new AlertDialog.Builder(context);
        dialog.setTitle(itemClicked.getTitle());
        dialog.setMessage(itemClicked.getSnippet());
        dialog.setCancelable(true);
        dialog.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                Log.i(this.getClass().getName(), "Selected Yes To Add Location");
                ((SelectGameLocation) context).finish();
            }
        });
        dialog.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                Log.i(this.getClass().getName(), "Selected No To Add Location");
                dialog.cancel();
            }
        });
        dialog.show();
        return true;
    }

    @Override
    public boolean onTouchEvent(MotionEvent me, MapView mapView) {
        drawMarker(GeoPointHelper.getPointClicked(me, mapView));
        return super.onTouchEvent(me, mapView);
    }

    private OverlayItem drawMarker(GeoPoint p) {        
            OverlayItem overlayitem = new OverlayItem(p, "Select As Game Location?", "Do you want this location to be added as the location for the game?");
            getOverlays().clear();
            addOverlay(overlayitem);
            return overlayitem;
    }

    public List<OverlayItem> getOverlays() {
        return overlays;
    }

    public void addOverlay(OverlayItem overlay) {
        overlays.add(overlay);
        populate();
    }

    @Override
    protected OverlayItem createItem(int i) {
        return overlays.get(i);
    }

    @Override
    public int size() {
        return overlays.size();
    }

}
public类selectGameLocationItemizeOverlay扩展ItemizeOverlay{
私有上下文=null;
私有列表覆盖=新建ArrayList();
public SelectGameLocationItemizedOverlay(可绘制标记,上下文){
super(boundCenterBottom(marker));
this.context=上下文;
}
@凌驾
受保护的布尔onTap(整数索引){
OverlayItemClicked=overlays.get(索引);
AlertDialog.Builder dialog=新建AlertDialog.Builder(上下文);
setTitle(itemClicked.getTitle());
setMessage(itemClicked.getSnippet());
对话框。可设置可取消(true);
setPositiveButton(R.string.yes,新的DialogInterface.OnClickListener(){
public void onClick(DialogInterface对话框,int-id){
Log.i(this.getClass().getName(),“选择是以添加位置”);
((SelectGameLocation)context.finish();
}
});
setNegativeButton(R.string.no,new DialogInterface.OnClickListener(){
public void onClick(DialogInterface对话框,int-id){
Log.i(this.getClass().getName(),“选择否以添加位置”);
dialog.cancel();
}
});
dialog.show();
返回true;
}
@凌驾
公共布尔onTouchEvent(MotionEvent me、MapView MapView){
drawMarker(GeoPointHelper.getPointClicked(me,mapView));
返回super.onTouchEvent(me、mapView);
}
专用覆盖项目绘图标记(地质点p){
OverlayItem OverlayItem=新的OverlayItem(p,“选择作为游戏位置?”,“是否希望将此位置添加为游戏位置?”);
getOverlays().clear();
addOverlay(overlayitem);
返回覆盖项;
}
公共列表getOverlays(){
返回覆盖层;
}
公共void addOverlay(OverlayItem overlay){
叠加。添加(叠加);
填充();
}
@凌驾
受保护的OverlayItem createItem(int i){
返回覆盖。获取(i);
}
@凌驾
公共整数大小(){
返回overlays.size();
}
}

我认为问题的根本在于onTap是一个特定的onTouchEvent,因此,如果您在覆盖中写入这两个事件,当您触摸地图时,它们都会被触发

您可以尝试在mapActivity中实现的某个触摸事件中添加一个新的覆盖项,并保持覆盖中的onTap事件不变


这样可能行得通,但你得试试,我不确定

我遇到了完全相同的问题,我的onTouchEvent在地图上添加了一个标记,并希望在用户单击该标记时显示有关该标记的信息,它工作了,但它也在其上添加了另一个标记

所以我没有使用onTouchEvent,而是在onTap(int-index)和onTap(G)中执行所有操作
public boolean onTap (final GeoPoint p, final MapView mapView){
    boolean tapped = super.onTap(p, mapView);
    if (tapped){            
        //do what you want to do when you hit an item           
    }           
    else{
        //do what you want to do when you DON'T hit an item
        }                   
    return true;
}

//Return true in order to say that the listener has correctly taken the event into account 
@Override
protected boolean onTap(int index) {
    return true;
}
if(isFirst)
{
    isFirst=false;
} else{
    // the actual onTap() comes here
}