10 ответов:
У меня была такая же проблема на 10 дней, но я получил решение несколько минут назад!! Вот решение проблемы. Я сделал пользовательский MapView и переопределить onTouchEvent (), как это.
@Override public boolean onTouchEvent(MotionEvent ev) { int action = ev.getAction(); switch (action) { case MotionEvent.ACTION_DOWN: // Disallow ScrollView to intercept touch events. this.getParent().requestDisallowInterceptTouchEvent(true); break; case MotionEvent.ACTION_UP: // Allow ScrollView to intercept touch events. this.getParent().requestDisallowInterceptTouchEvent(false); break; } // Handle MapView's touch events. super.onTouchEvent(ev); return true; }
Сделайте свою собственную карту и используйте ее. Это полностью работает для меня.
public class CustomMapView extends MapView { public CustomMapView(Context context, AttributeSet attrs) { super(context, attrs); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { switch (ev.getAction()) { case MotionEvent.ACTION_UP: System.out.println("unlocked"); this.getParent().requestDisallowInterceptTouchEvent(false); break; case MotionEvent.ACTION_DOWN: System.out.println("locked"); this.getParent().requestDisallowInterceptTouchEvent(true); break; } return super.dispatchTouchEvent(ev); }}в вашем макете xml,
<com.yourpackage.xxxx.utils.CustomMapView android:id="@+id/customMap" android:layout_width="match_parent" android:layout_height="400dp" android:layout_marginLeft="5dp" android:layout_marginRight="5dp" />
лучший / более простой способ сделать это без манипулирования отдельными сенсорными событиями. Это будет работать, если вы используете положение:
@Override public boolean dispatchTouchEvent(MotionEvent ev) { /** * Request all parents to relinquish the touch events */ getParent().requestDisallowInterceptTouchEvent(true); return super.dispatchTouchEvent(ev); }весь класс:
public class CustomMapView extends MapView { public CustomMapView(Context context) { super(context); } public CustomMapView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomMapView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public CustomMapView(Context context, GoogleMapOptions options) { super(context, options); } @Override public boolean dispatchTouchEvent(MotionEvent ev) { /** * Request all parents to relinquish the touch events */ getParent().requestDisallowInterceptTouchEvent(true); return super.dispatchTouchEvent(ev); } }если вы используете MapFragment, то вы можете поместить фрагмент в пользовательский вид, а в
dispatchTouchEvent()сделатьrequestDisallowInterceptTouchEventзвонок.
для тех, кто хочет весь рабочий код . вот это
пользовательский класс просмотра карты
public class CustomMapView extends MapView { private ViewParent mViewParent; public CustomMapView(Context context) { super(context); } public CustomMapView(Context context, AttributeSet attrs) { super(context, attrs); } public CustomMapView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public CustomMapView(Context context, GoogleMapOptions options) { super(context, options); } public void setViewParent(@Nullable final ViewParent viewParent) { //any ViewGroup mViewParent = viewParent; } @Override public boolean onInterceptTouchEvent(final MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (null == mViewParent) { getParent().requestDisallowInterceptTouchEvent(true); } else { mViewParent.requestDisallowInterceptTouchEvent(true); } break; case MotionEvent.ACTION_UP: if (null == mViewParent) { getParent().requestDisallowInterceptTouchEvent(false); } else { mViewParent.requestDisallowInterceptTouchEvent(false); } break; default: break; } return super.onInterceptTouchEvent(event); } }активность макета xml
<ScrollView android:layout_width="match_parent" android:layout_height="wrap_content"> <location.to.your.CustomMapView android:id="@+id/mapView" android:layout_width="match_parent" android:layout_height="250dp" /> </ScrollView>создания экземпляра пользовательского класса карты в вашей деятельности или фрагмент
CustomMapView mapView = (CustomMapView) findViewById(R.id.mapView);вот это
Это учебник С лучшим решением, работает с android map v2..
вы можете создать пользовательский вид карты следующим образом:
public class CustomMapView extends MapView { private MapFragment.ControlLock mCallbackControl; public CustomMapView(Context context) { this(context, null); } public CustomMapView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public CustomMapView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } public CustomMapView(Context context, GoogleMapOptions options) { super(context, options); } public void setCallback(MapFragment.ControlLock callbackControl) { this.mCallbackControl = callbackControl; } @Override public boolean dispatchTouchEvent(MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_UP: System.out.println("unlocked"); mCallbackControl.unlock(); /* Interface */ break; case MotionEvent.ACTION_DOWN: System.out.println("locked"); mCallbackControl.lock(); /* Interface */ break; } return super.dispatchTouchEvent(event); } }
Я пробовал с переопределением MapView.onTouchEvent(...), но это не сработало для меня. Вот код, который хорошо работает (переопределение MapView.onInterceptTouchEvent(...)):
public class MyMapView extends MapView { private ViewParent mViewParent; //add constructors here public void setViewParent(@Nullable final ViewParent viewParent) { //any ViewGroup mViewParent = viewParent; } @Override public boolean onInterceptTouchEvent(final MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: if (null == mViewParent) { getParent().requestDisallowInterceptTouchEvent(true); } else { mViewParent.requestDisallowInterceptTouchEvent(true); } break; case MotionEvent.ACTION_UP: if (null == mViewParent) { getParent().requestDisallowInterceptTouchEvent(false); } else { mViewParent.requestDisallowInterceptTouchEvent(false); } break; default: break; } return super.onInterceptTouchEvent(event); } }
вы можете просто поместить MapView в сам макет и переопределить onTouch или установить Click-Listener - самый простой способ для меня, так как мне нужно было коснуться всего MapView в моем ScrollView.
Если у вас есть mapview в режиме прокрутки, то вы должны четко указать следующие параметры для MapView:
mMapView.setClickable(true); mMapView.setFocusable(true); mMapView.setDuplicateParentStateEnabled(false);
Если кто-то хочет этот класс в Котлине.
Я использовалdispatchTouchEventкак предложил @rotemclass CustomMapView : MapView { constructor(context: Context): super(context) constructor(context: Context, googleMapOptions: GoogleMapOptions): super(context, googleMapOptions) constructor(context: Context, attributeSet: AttributeSet): super(context, attributeSet) constructor(context: Context, attributeSet: AttributeSet, int: Int): super(context, attributeSet, int) override fun dispatchTouchEvent(event: MotionEvent?): Boolean { Log.d("CustomWebView", "touchevent") when(event?.action) { MotionEvent.ACTION_UP -> { Log.d("CustomWebView", "disallow Intercept") parent.requestDisallowInterceptTouchEvent(false) } MotionEvent.ACTION_DOWN -> { Log.d("CustomWebView", "allow Intercept") parent.requestDisallowInterceptTouchEvent(true) } } return super.dispatchTouchEvent(event) } }
Comments