Android:ScrollView Intercepting Map API V2 touch

时间:2013-04-07 02:26:03

标签: android scrollview google-maps-api-2 ontouchlistener

我有一个活动,它有一个滚动视图,可以计算很多东西......其中一个是mapfragment api v2。当我垂直移动地图时,所有滚动都会移动,而我不想要这个,这是一个很大的问题。当我触摸并移动地图时,我真的希望滚动视图不要移动。

代码如下:

public class MyMap extends FragmentActivity {

...



        @Override
        public void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
    setContentView(R.layout.map);

            ...


    fm = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.mapfoto);
    googleMap = fm.getMap();


    /** Here i can do something like googleMap.setOnToucListener().... 
            but it's not supported!!!! */
            ...

    }

}

和map.xml:

<ScrollView 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_below="@+id/scroll"
    tools:context=".MyMap">   

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" >

        <RelativeLayout
            android:id="@+id/relativeLayoutA"
            android:layout_below="@+id/mapfoto"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical" >
            <fragment
                android:id="@+id/map"
                android:layout_width="match_parent"
                android:layout_height="400dp"
                class="com.google.android.gms.maps.SupportMapFragment" />

      ...

            </RelativeLayout>
        ...

        </RelativeLayout>


</ScrollView>    

我试过使用OnMapClickListener()和OnMapLongClickListener()但是没有工作

所有的帮助都很好......

1 个答案:

答案 0 :(得分:1)

这个想法是在地图片段区域上滚动动作时拦截地图片段上的触摸事件。

您可以扩展MapFragment并在其上放置一个截取并传达触摸操作的FrameLayout。

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import com.google.android.gms.maps.SupportMapFragment;

public class OnScrollableContainerMapFragment extends SupportMapFragment {

  private OnTouchListener mOnTouchListener;

  @Override
  public View onCreateView(
      LayoutInflater layoutInflater,
      ViewGroup viewGroup,
      Bundle savedInstance
  ) {
    final View mapView = super.onCreateView(layoutInflater, viewGroup, savedInstance);

    if (mapView != null) {
      ((ViewGroup) mapView).addView(
          new TouchableWrapper(getActivity()),
          new ViewGroup.LayoutParams(
              ViewGroup.LayoutParams.MATCH_PARENT,
              ViewGroup.LayoutParams.MATCH_PARENT
          )
      );
    }

    return mapView;
  }

  public void setOnTouchListener(@NonNull final OnTouchListener onTouchListener) {
    mOnTouchListener = onTouchListener;
  }

  public interface OnTouchListener {

    void onStartScrollingMap();

    void onStopScrollingMap();
  }

  private class TouchableWrapper extends FrameLayout {

    public TouchableWrapper(@NonNull final Context context) {
      super(context);
      setBackgroundColor(ContextCompat.getColor(context, android.R.color.transparent));
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
      switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
          mOnTouchListener.onStartScrollingMap();
          break;
        case MotionEvent.ACTION_UP:
          mOnTouchListener.onStopScrollingMap();
          break;
      }
      return super.dispatchTouchEvent(event);
    }
  }

}

当在地图上滚动动作开始时,您要求外部可滚动容器停止拦截触摸事件。

当地图上的滚动结束时,您告诉外部可滚动容器再次开始拦截触摸事件。

在下面的示例中,外部可滚动容器是ScrollView。

请注意,该示例假定代码位于片段内。它只是整个类文件的一部分,并且缺少必要的元素以使其编译。

(...)
mSupportMapFragment = (OnScrollableContainerMapFragment) getChildFragmentManager()
        .findFragmentById(R.id.fragment_map);

        mSupportMapFragment
        .setOnTouchListener(new OnScrollableContainerMapFragment.OnTouchListener() {
          @Override
          public void onStartScrollingMap() {
            mScrollView.requestDisallowInterceptTouchEvent(true);
          }

          @Override
          public void onStopScrollingMap() {
            mScrollView.requestDisallowInterceptTouchEvent(false);
          }
        });
(...)

XML布局文件如下所示。

请注意,这只是文件的一部分,缺少必要的元素以便编译。

(...)

<fragment
          (...)
            android:id="@+id/fragment_map"
            android:name="com.stackoverflow.answer.OnScrollableContainerMapFragment"
            android:tag="team_details_info_fragment_map" />
(...)

在这里看一下要点:Gist