2013-04-07 2 views
3

У меня есть активность, которая имеет scrollview, которая содержит много вещей ... одним из них является mapfragment api v2. ПРОБЛЕМА БОЛЬШОЙ И ТРОЛЛИНГА - когда я перемещаю карту по вертикали, ВСЕ прокрутка перемещается, и я не хочу этого. Я действительно хочу, чтобы scrollview DONT MOVE, когда я касался и перемещал карту.Android: ScrollView Перехват карты API V2 touch

код, как:

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 ile действие прокрутки происходит на участке фрагмента карты.

Вы можете расширить 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

Смежные вопросы