54 votes

MapFragment dans ScrollView

J'en ai un de la nouvelle - MapFragments en ScrollView. En fait, c'est un SupportMapFragment, mais de toute façon. Il fonctionne, mais il y a deux problèmes:

  1. Lorsque défile, il laisse un masque noir derrière. Le noir couvre exactement la zone où la carte a été, à l'exception d'un trou où l' +/- boutons de zoom ont été. Voir la capture d'écran ci-dessous. C'est sur Android 4.0.

  2. La vue n'est pas utiliser requestDisallowInterceptTouchEvent() lorsque l'utilisateur interagit avec la carte pour éviter l' ScrollView interception des touches, donc si vous essayez de déplacer verticalement dans la carte, il a juste fait défiler le contenant ScrollView. Je pourrais théoriquement dériver une classe d'affichage de l' MapView et d'ajouter cette fonctionnalité, mais comment puis-je obtenir de l' MapFragment utiliser mon personnalisés MapView , au lieu de la norme?

Partial screenshot of scrolling issue

53voto

walnut_head Points 636

Appliquer une image transparente sur le fragment mapview semble résoudre le problème. Ce n'est pas la plus jolie, mais cela semble fonctionner. Voici un extrait de code XML qui montre ceci:

 <RelativeLayout
        android:id="@+id/relativeLayout1"
        android:layout_width="match_parent"
        android:layout_height="300dp" >

        <fragment
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.MapFragment"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"/>

        <ImageView
            android:id="@+id/imageView123"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:src="@drawable/temp_transparent" />         
</RelativeLayout>
 

36voto

Laksh Points 2735

Pour moi, l'ajout d'un transparent ImageView n'a pas aider à enlever le masque noir complètement. Les parties supérieure et inférieure de la carte encore montré le masque noir pendant le défilement.

Donc la solution pour elle, j'ai trouvé dans cette réponse avec un petit changement. J'ai ajouté,

android:layout_marginTop="-100dp"
android:layout_marginBottom="-100dp"

à mon fragment de carte car il était vertical scrollview. Donc ma mise en page regardé de cette façon:

<RelativeLayout
    android:id="@+id/map_layout"
    android:layout_width="match_parent"
    android:layout_height="300dp">

    <fragment
        android:id="@+id/mapview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_marginTop="-100dp"
        android:layout_marginBottom="-100dp"
        android:name="com.google.android.gms.maps.MapFragment"/>

    <ImageView
        android:id="@+id/transparent_image"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:src="@color/transparent" />

</RelativeLayout>   

Pour résoudre la deuxième partie de la question que je mis requestDisallowInterceptTouchEvent(true) pour mon principal ScrollView. Lorsque l'utilisateur a touché le fond transparent de l'image et a déménagé j'ai désactivé la touche sur l'image transparente pour l' MotionEvent.ACTION_DOWN et MotionEvent.ACTION_MOVE , de sorte que le fragment de carte peuvent prendre les Événements Tactiles.

ScrollView mainScrollView = (ScrollView) findViewById(R.id.main_scrollview);
ImageView transparentImageView = (ImageView) findViewById(R.id.transparent_image);

transparentImageView.setOnTouchListener(new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        int action = event.getAction();
        switch (action) {
           case MotionEvent.ACTION_DOWN:
                // Disallow ScrollView to intercept touch events.
                mainScrollView.requestDisallowInterceptTouchEvent(true);
                // Disable touch on transparent view
                return false;

           case MotionEvent.ACTION_UP:
                // Allow ScrollView to intercept touch events.
                mainScrollView.requestDisallowInterceptTouchEvent(false);
                return true;

           case MotionEvent.ACTION_MOVE:
                mainScrollView.requestDisallowInterceptTouchEvent(true);
                return false;

           default: 
                return true;
        }   
    }
});

Cela a fonctionné pour moi. Espérons qu'il vous aide..

8voto

iagreen Points 4532

Cela a probablement ses racines au même endroit, ce qui pose le problème de cette question . La solution consiste à utiliser un cadre transparent, ce qui est un peu plus léger qu'une image transparente.

0voto

Ralf Points 3732

Pour la deuxième partie de la question - vous pouvez obtenir un fragment de la classe de SupportMapFragment, et utilisez-la dans votre mise en page à la place. Vous pouvez ensuite remplacer Fragment#onCreateView, et d'instancier votre personnalisé MapView.

Si cela ne fonctionne pas, vous pouvez toujours créer votre propre fragment - ensuite, vous avez juste besoin de prendre soin de l'appeler tout le cycle de vie des méthodes vous-même (onCreate, onResume, etc). Cette réponse a un peu plus de détails.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X