在 mapview 上选择一个 Location on view Touch

Choose a Location on mapview on view Touch

在我的应用中,我希望用户通过点击 MapView 顶部的视图来选择地图上的位置。
这是我的代码:

map_fragment.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_horizontal|center_vertical"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <org.osmdroid.views.MapView
            android:id="@+id/mapview"
            tilesource="Mapnik"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />

    </LinearLayout>

    <View
        android:id="@+id/view_choose"
        android:layout_width="50dp"
        android:layout_height="70dp"
        android:layout_gravity="center_horizontal|center_vertical"
        android:background="@drawable/choose" />

</FrameLayout>

MapFragment.java

import butterknife.Bind;
import butterknife.ButterKnife;
import org.osmdroid.bonuspack.overlays.MapEventsReceiver;
import org.osmdroid.bonuspack.overlays.MapEventsOverlay;
import org.osmdroid.util.GeoPoint;
import org.osmdroid.views.MapView;
import android.view.MotionEvent;
import android.view.View;
import android.support.v4.app.Fragment;

public class MapFragment extends Fragment {

    public static final String TAG = "MapFragment";

    @Bind(R.id.mapview)
    MapView mapView;
    @Bind(R.id.view_choose)
    View mChooseView;

    boolean isChooseTouched = false;

    public MapFragment() {
        // Required empty public constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_map, container, false);
        ButterKnife.bind(this, view);
        init();
        return view;
    }

    private void init() {
        mapView.setTileSource(TileSourceFactory.MAPNIK);
        mapView.getOverlays().add(0, new MapEventsOverlay(getActivity(), new MyMapEventsReceiver()));

        mChooseView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                    isChooseTouched = true;
                    int artificialX = (view.getWidth() / 2);
                    int artificialY = (view.getHeight());
                    event.setLocation(artificialX, artificialY);
                    return false;
            }
        });
    }

    class MyMapEventsReceiver implements MapEventsReceiver {

        @Override
        public boolean singleTapConfirmedHelper(GeoPoint geoPoint) {

            if (isChooseTouched) {
                Log.d(TAG,"location selected");
                // some other calculation
                isChooseTouched = false;
                return true;
            } 
            return false;
        }

        @Override
        public boolean longPressHelper(GeoPoint geoPoint) {
            return false;
        }
    }

}

我已经在 4 台设备上测试了这段代码。
在其中两个中,它有效。并且日志打印
但在其他两个设备中,它不起作用。它只是移动了 mapview 而没有打印日志。
重点是当我删除此行时:

event.setLocation(artificialX, artificialY);

从代码来看,它适用于所有设备。
当我将上面的行设置为这样的内容时:

event.setLocation(artificialX, artificialY-30);

它再次工作。

但是我需要将事件的位置更改为视图的底部,所以我需要这一行。

我该如何解决这个问题?

好的,我用这个解决了它:

mChooseView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent event) {
        isChooseTouched = true;
        int artificialX = (view.getWidth() / 2);
        int artificialY = (view.getHeight()) - 5;
        float x = view.getLeft() + artificialX;
        float y = view.getTop() + artificialY;
        event.setLocation(x, y);
        mapView.dispatchTouchEvent(event);
        return true;
    }
});