ScrollView中的MapView?

Ces*_*sar 64 android google-maps android-maps

我想在ScrollView中有一个MapView,但是当我尝试滚动地图时,ScrollView优先考虑!有什么方法可以在地图内部滚动时赋予MapView优先级,而ScrollView则不然?

谢谢!

小智 95

我有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;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果它不适合你,请尝试覆盖dispatchTouchEvent方法(相同的实现,只需更改最后的超级调用).谢谢. (36认同)
  • @Rotem,你的评论救了我的屁股.多谢,伙计. (3认同)
  • @Luizje:闪烁是由您为每个视图使用的背景颜色引起的.因此,请确保使用corect bg颜色获得最外层视图. (2认同)
  • @Rotem你的解决方案对我有用.我在ScrollView中有一个com.google.android.gms.maps.MapView,它不能使用上面的代码.我扩展了这个类并编写了你的​​解决方案,重写了dispatchTouchEvent方法. (2认同)
  • @Rotem:它适用于dispatchTouchEvent.谢谢伙伴.. Njoyee编码. (2认同)

Ame*_*yaB 42

在不操纵单个触摸事件的情况下,更好/更简单的方法.如果您使用MapView,这将有效:

  @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        /**
         * Request all parents to relinquish the touch events
         */
        getParent().requestDisallowInterceptTouchEvent(true);
        return super.dispatchTouchEvent(ev);
    }
Run Code Online (Sandbox Code Playgroud)

全班:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用的是MapFragment,则可以将片段放入自定义视图中,然后dispatchTouchEvent()进行requestDisallowInterceptTouchEvent调用.

  • 谢谢老板。它非常适合我。 (2认同)

Zin*_*tet 20

制作自己的地图并使用它.它完全适合我.

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);
}} 
Run Code Online (Sandbox Code Playgroud)

在你的布局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"
                />
Run Code Online (Sandbox Code Playgroud)


Ism*_*bal 13

对于那些想要整个工作代码的人.这里是

自定义地图视图类

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);
  }
}
Run Code Online (Sandbox Code Playgroud)

活动布局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>
Run Code Online (Sandbox Code Playgroud)

在您的活动或片段中实例化自定义地图类

       CustomMapView mapView = (CustomMapView) findViewById(R.id.mapView);
Run Code Online (Sandbox Code Playgroud)

这是它的乐趣

  • 其他解决方案对我不起作用,这个解决方案对我有用!非常感谢! (2认同)

Ped*_*rim 9

您可以像这样创建自定义MapView:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)


ult*_*aon 8

我试过覆盖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);
        }
}
Run Code Online (Sandbox Code Playgroud)