2016-06-27 6 views
1

в моем приложении, я хочу, чтобы пользователь выбрал местоположение на карте, нажав на представление, которое находится поверх 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); 

он работает снова.

, но мне нужно изменить местоположение события в нижней части представления, поэтому мне нужна эта строка.

как я могу решить эту проблему?

ответ

1

ок я решил его с этим:

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; 
    } 
});