2016-11-21 4 views
0

Lorsque j'essaie de parcourir la carte google, le fichier CoordinatorLayout défile vers le bas et, bien sûr, je souhaite déplacer la carte à la place. Si je tiens en dehors de la carte, puis que j'essaie de faire un panoramique, cela fonctionne parfaitement, mais ce ne serait pas une très bonne expérience pour l'utilisateur final. L'OnTouchListener corrige une partie du problème ... mais uniquement si je le déplace horizontalement. Au moment où mon doigt monte ou descend, il arrête de faire un panoramique sur la carte. Comment puis-je résoudre ce problème?Désactiver le défilement lors de la mise à l'échelle avec l'API Google Maps

public class HomeFragment extends Fragment { 

private TextView aboutTxt; 
private SupportMapFragment mSupportMapFragment; 
private GoogleMap mMap; 
public HomeFragment() { 
    // Required empty public constructor 
} 


// TODO: Rename and change types and number of parameters 
public static HomeFragment newInstance() { 
    HomeFragment fragment = new HomeFragment(); 

    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if (getArguments() != null) { 

    } 
} 


@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.fragment_home, container, false); 


      view.setOnTouchListener(new View.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 



      if (event.getAction()==MotionEvent.ACTION_DOWN) { 

       Log.e(TAG,"Down"); 
       return true; 
      } 

      if (event.getAction()==MotionEvent.ACTION_MOVE){ 

       Log.e(TAG,"Move"); 
       return true; 

      } 
      if (event.getAction()==MotionEvent.ACTION_UP){ 

       Log.e(TAG,"Up"); 
       return true; 
      } 


      return false; 
     } 
      }); 



    mSupportMapFragment = (SupportMapFragment) getChildFragmentManager().findFragmentById(R.id.map); 
    if (mSupportMapFragment == null) { 
     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     mSupportMapFragment = SupportMapFragment.newInstance(); 
     fragmentTransaction.replace(R.id.map, mSupportMapFragment).commit(); 
    } 

    if (mSupportMapFragment != null) { 
     mSupportMapFragment.getMapAsync(new OnMapReadyCallback() { 
      @Override 
      public void onMapReady(GoogleMap googleMap) { 
       if (googleMap != null) { 

        mMap = googleMap; 
        mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); 

        // Add a marker in Sydney and move the camera 
        LatLng myMap = new LatLng(xx.xxxx, xx.xxxx); 
        mMap.addMarker(new MarkerOptions().position(gradiMap).title("My marker)); 
        mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(myMap, 17)); 

       } 


      } 
     }); 
    } 

XML

<android.support.design.widget.AppBarLayout 
    android:id="@+id/main.appbar" 
    android:layout_width="match_parent" 
    android:layout_height="300dp" 
    android:fitsSystemWindows="true" 
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

    <android.support.design.widget.CollapsingToolbarLayout 
     android:id="@+id/main.collapsing" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:fitsSystemWindows="true" 
     app:contentScrim="?attr/colorPrimary" 
     app:expandedTitleMarginEnd="64dp" 
     app:expandedTitleMarginStart="48dp" 
     app:layout_scrollFlags="scroll|exitUntilCollapsed"> 

     <FrameLayout 
      android:id="@+id/map" 
      android:name="com.google.android.gms.maps.SupportMapFragment" 
      android:layout_width="match_parent" 
      android:layout_height="match_parent" 
      app:layout_collapseMode="parallax" /> 


     <android.support.v7.widget.Toolbar 
      android:id="@+id/main.toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      app:layout_collapseMode="pin" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 
    </android.support.design.widget.CollapsingToolbarLayout> 

</android.support.design.widget.AppBarLayout> 

<android.support.v4.widget.NestedScrollView 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior"> 

    <TextView 
     android:id="@+id/aboutTxt" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:lineSpacingExtra="8dp" 
     android:padding="@dimen/activity_horizontal_margin" 
     android:textColor="@color/colorBlack" 
     android:textSize="17sp" /> 

</android.support.v4.widget.NestedScrollView> 

<android.support.design.widget.FloatingActionButton 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_margin="@dimen/activity_horizontal_margin" 
    android:src="@drawable/whitestar" 
    app:layout_anchor="@id/main.appbar" 
    app:layout_anchorGravity="bottom|right|end" /> 

Répondre

0

trouvé la réponse here. Comme Teimoor Alam Khan dit, juste faire une classe personnalisée et l'utiliser.

public class CustomScrollView extends ScrollView { 

public CustomScrollView(Context context) { 
super(context); 
} 

public CustomScrollView(Context context, AttributeSet attrs) { 
super(context, attrs); 
} 

public CustomScrollView(Context context, AttributeSet attrs, int defStyle) { 
super(context, attrs, defStyle); 
} 

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
final int action = ev.getAction(); 
switch (action) { 
    case MotionEvent.ACTION_DOWN: 
     //Log.i("CustomScrollView", "onInterceptTouchEvent: DOWN super false"); 
     super.onTouchEvent(ev); 
     break; 

    case MotionEvent.ACTION_MOVE: 
     return false; // redirect MotionEvents to ourself 

    case MotionEvent.ACTION_CANCEL: 
     // Log.i("CustomScrollView", "onInterceptTouchEvent: CANCEL super false"); 
     super.onTouchEvent(ev); 
     break; 

    case MotionEvent.ACTION_UP: 
     //Log.i("CustomScrollView", "onInterceptTouchEvent: UP super false"); 
     return false; 

    default: 
     //Log.i("CustomScrollView", "onInterceptTouchEvent: " + action); 
     break; 
} 

return false; 
} 

@Override 
public boolean onTouchEvent(MotionEvent ev) { 
super.onTouchEvent(ev); 
//Log.i("CustomScrollView", "onTouchEvent. action: " + ev.getAction()); 
return true; 
    } 
} 

XML:

<com.app.ui.views.CustomScrollView 
android:id="@+id/scrollView" 
xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fillViewport="true" 
android:orientation="vertical"> 
</com.app.ui.views.CustomScrollView> 
2

Je pense que vous êtes à la recherche OnInterceptTouchEvent. Vous pouvez le définir sur votre CoordinatorLayout et être en mesure de déterminer s'il doit consommer l'événement lui-même, ou le transmettre à ses enfants.

Vous aurez besoin d'étendre CoordinatorLayout et passer outre onInterceptTouchEvent(MotionEvent event) et procédez comme suit:

@Override 
public boolean onInterceptTouchEvent(MotionEvent event) { 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      return false; 
      break; 
     case MotionEvent.ACTION_MOVE: 
      return false; 
      break; 
     default: 
      return true; 
      break; 
    } 
} 
+0

pouvez-vous expliquer un peu plus s'il vous plaît? Je n'arrive toujours pas à le faire fonctionner – r3dm4n

+1

Dans les cas comme celui-ci, la première chose que je fais est de voir si mon interception fait quoi que ce soit. Changez votre méthode 'onInterceptTouchEvent' pour retourner true à chaque fois et voir si des touchers arrivent sur la carte. Ou vous pourriez voir un point d'arrêt sur la ligne 'switch' et voir si jamais il est touché. – LukeWaggoner

+0

merci de m'indiquer dans la bonne direction. problème résolu. – r3dm4n