2013-04-07 101 views
3

我有一個活動,有一個滾動視圖,計數很多東西......其中之一是mapfragment api v2。大和行車問題是當我垂直移動地圖時,所有的滾動移動,我不想要這個。當我觸摸並移動地圖時,我確實希望滾動視圖不要移動。Android:滾動視圖攔截地圖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(),但沒有奏效

所有的幫助都是很好的...

回答

0

這個想法是在地圖片段wh上攔截觸摸事件滾動動作發生在地圖片段區域。

可以擴展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