в моем приложении, я хочу, чтобы пользователь выбрал местоположение на карте, нажав на представление, которое находится поверх MapView.
это мой код:
map_fragment.xmlВыберите вид на карте на вид Touch
<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);
он работает снова.
, но мне нужно изменить местоположение события в нижней части представления, поэтому мне нужна эта строка.
как я могу решить эту проблему?