Le déplacement MapFragment (SurfaceView) provoque le fond noir de scintillement
Je suis en train de mettre en œuvre de nouveaux Android de Google Maps API (v2). Toutefois, il ne semble pas aller bien avec SlidingMenu. Comme vous le savez peut-être, MapFragment
mise en œuvre est basée sur SurfaceView
. Le problème est que le SurfaceView
n'aime pas la déplacer - je veux dire de le placer dans les points de vue:
ViewPager
,ScrollView
,ListView
,- ou ladite
SlidingMenu
.
Lorsque vous le déplacez, il laisse un trou noir dans le lieu de ses pixels à l'origine portées. Il ressemble à quelque chose comme cette.
Ce problème peut être partiellement résolu par la spécification d'un arrière-plan transparent sur le SurfaceView
ou même le fait de placer un transparent View
sur elle. Je ne peux pas comprendre si c'est seulement pour moi les résultats sont inacceptables, ou si j'ai un problème différent qui lui donne une apparence à quoi il ressemble.
Pour voir à quoi il ressemble, s'il vous plaît regarder CETTE VIDÉO.
(désolé pour la qualité, mais le problème peut être vu facilement de toute façon)
Lorsqu'un normal listview (l'orange de l'écran) est retiré lors de l'ouverture de SlidingMenu
, l'animation est fluide et agréable. Mais dès que le MapFragment
apparaît, il y a un peu bizarre rafraîchissant/scintillement/problème de synchronisation sur la carte.
Testé sur HTC One S et le Samsung Galaxy ACE.
Mon super-duper-idée folle de le résoudre: à chaque fois que l'animation d'ouverture commence, prendre une capture d'écran de la MapFragment
(il devrait être possible avec SurfaceView) et le poser sur la durée de l'animation. Mais je ne sais vraiment pas comment faire...
La prise de capture d'écran d'une carte n'est pas possible, mais peut-être que quelqu'un aura inspiré par cette.
Ou peut-être désactiver redessiner la carte d'une autre manière, je ne sais pas.
Mise à JOUR:
Trouvé cette.
Il semble que SurfaceView peut être modifié à TextureView pour supprimer ces restrictions. Mais depuis MapFragment est basé sur SurfaceView, je ne sais pas si elle peut être réalisée.
Une autre mise à jour
Il semble que ce problème a été résolu sur les périphériques 4.1+. Ils ont juste utilisé TextureView. mais sur les versions antérieures, nous avons encore à utiliser des solutions de contournement.
- La carte continuera à traiter les commandes et de les animer comme il est glissant. C'est une bonne expérience utilisateur. Prendre une capture d'écran de la couverture de la carte alors qu'il glisse nuisent à partir de ce UX et autant que je sache, il n'est pas possible, voir stackoverflow.com/questions/13773658/...
- stackoverflow.com/a/13910364/1121889 Remplacer les viewpager avec votre carte v2
- Je n'ai pas de
ViewPager
. Aussi, j'ai déjà lu la réponse que vous avez cités (même commenté). - J'ai le même problème avec une surfaceview. J'ai modifié les surfaceView à un textureView. Je ne sais pas si c'est possible avec le mapfragment.
- Je pense que c'est acceptable. Je pense aussi qu'il va finalement être réparé. Si il y a un problème de cliquer sur google j'avais des étoiles pour vous.
- Le problème apparaît de nouveau avec le jeu à la version des services 6.7.74
Vous devez vous connecter pour publier un commentaire.
Bien sûr la bonne solution sera de Google pour résoudre le problème (voir Android Maps V2 question 4639: http://code.google.com/p/gmaps-api-issues/issues/detail?id=4639).
Cependant, un de mes collègues de travail a suggéré une simple extension de la carte au-delà de son conteneur. Si nous prolongeons le fragment de carte au-delà de la région visible de son conteneur, comme suit:
nous pouvons réduire/éliminer le scintillement. Les appareils récents (par exemple, le Galaxy Nexus) montrent pas de scintillement après ce hack, et les appareils plus anciens (par exemple LG Optimus V) réduire le scintillement. Nous devons étendre les marges sur les deux côtés de sorte que les fenêtres d'informations sont centrées quand ils sont sélectionnés.
Mise à jour: Ce problème a été résolu par Google sur Août. 28, mais j'imagine qu'il doit être encore roulée dans un communiqué.
Vous pouvez utiliser cette bibliothèque
https://github.com/NyxDigital/NiceSupportMapFragment/
cela fonctionne très bien pour moi.
Voici une idée folle, ne pas déplacer la MapView 😉
Qui est, de créer une MapView la pleine largeur de l'écran derrière votre application dans un FrameLayout. Posez ensuite votre point de vue sur le dessus, et percer un trou à travers la MapView dans la position que vous avez besoin de l'afficher. Lors d'un déménagement, vous aurez besoin de mettre à jour la carte de position pour rester en synchronisation de sorte que l'utilisateur conserve la possibilité de voir le même article de la carte, mais qui devrait mettre à jour mieux que le déplacement d'une surface d'affichage autour de.
SlidingMenu
se déplace toute la "au-dessus" de la vue de côté, cela signifierait que je serais obligé de modifier entièrement la manière dont la bibliothèque des oeuvres. Sinon, très intéressant, donc +1 🙂Bien,
Citant Dianne Hackborn (un Androïde cadre de l'ingénieur)
Cette architecture est en partie pourquoi vous voyez ces scintille.
Vacille parfois apparaissent en raison de la double tampons: Android codage blog explique plus loin.
Vous pouvez également essayer et sous-classe de la
SurfaceView
pour essayer d'attirer le fond différemment. Je n'ai pas vu un exemple de ce qui ne change pas le z-index pour que de la haut. Découvrez ce DONC, après lesSinon, je recommande seulement obtenir l'
SurfaceHolder
après votre point de vue est centré (essayer de le faire d'une situation temporaire jusqu'alors) et la suppression de laSurfaceView
bien que n'étant pas à se concentrer et à l'écran.setZOrderOnTop(true)
, le scintillement ne disparaît pas. Il n'est pas noir plus, il devient blanc. Mais il est toujours là. Il y a sûrement un problème de performance ou de synchronisation, parce que le fond noir ne reste pas là, il ne vacille pendant une fraction de seconde. Si je pouvais synchroniser les images de SlidingMenu animation avec l'actualisation de SurfaceView, il serait probablement disparaître...C'est possible avec le instantané de l'interface à partir de GoogleMap. Maintenant, vous pouvez afficher un aperçu de la carte pendant le défilement de la page. Avec cela, j'ai résolu mon problème avec la ViewPager, peut-être vous pouvez modifier le code pour l'adapter à votre SlidingMenu.
Voici mon code pour le réglage de l'instantané (c'est dans le même fragment comme carte, appelée FragmentMap.java):
Où "mapFragment" est mon SupportedMapFragment et "iv" est une ImageView (faire match_parent).
Et ici, je suis contrôler le défilement:
Mon fragment avec la carte (FragmentMap) est sur la position 1, donc j'ai besoin pour contrôler le défilement de la position 0 à 1 et à partir de la position 1 à 2 (le premier si la clause). "getRegisteredFragment()" est une fonction dans ma personnalisé FragmentPagerAdapter, en qui j'ai une SparseArray(Fragment) appelé "registeredFragments".
Donc, chaque fois que vous faites défiler jusqu'à ou à partir de votre carte, vous voyez toujours des instantanées. Cela fonctionne très bien pour moi.
Pour empêcher la MapView(c'est en fait une SurfaceView) la création de trous noirs, j'ai ajouter une vue vide avec arrière-plan transparent de couleur pour couvrir l'ensemble de la MapView, de sorte qu'il peut prévenir les MapView de générer un noir "trou". Il peut travailler pour votre situation.
J'ai eu le même problème avec une webview et SlidingMenu et je l'ai résolu en modifiant SlidingMenu code source comme expliqué ici par le développeur principal.
Une autre solution alternative consiste à utiliser la nouvelle
GoogleMap.snapshot()
fonction, et à l'aide d'une capture d'écran de la carte à la place; comme décrit ici.Dans mon scénario, j'ai eu un premier Fragment, ce qui d'un clic sur un bouton échangé dans un deuxième fragment avec un MapFragment à l'intérieur. J'ai remarqué que ce scintillement, ne s'est produite la première fois que vous échangez le fragment - popping la pile de retour, et d'échanger dans un autre fragment du même type n'a pas de provoquer un scintillement.
Donc trouver qu'il avait quelque chose à voir avec l'ajout d'un premier SurfaceView à la fenêtre, j'ai essayé d'ajouter un vide instance d'une SurfaceView à mon chargés initialement fragment, derrière c'est la vue principale. Et bingo, plus de scintillement lors de l'animation dans le fragment suivant!
Je sais que c'est pas la solution la plus propre, mais ça fonctionne. Le Google MapFragment (ou SupportMapFragment dans mon cas) fonctionne toujours très bien, comme le solde non utilisé SurfaceView est dans le fragment précédent.
Je dois ajouter que je suis à l'aide de l'API v2.
Mise À Jour @VenomVendor
- Je ajouter le vide SurfaceView pour le premier fragment d'être montré, à l'indice 0 - behind de la vue principale. Dans mon cas, la Maison fragment est le fragment précédent à celui qui contient les Cartes Google maps fragment, ne sais pas si ce qui compte:
ajouter
android:hardwareAccelerated="true"
dans votre fichier manifest.par exemple:
<application
android:name=".Sample"
android:hardwareAccelerated="true"
/>
J'ai eu le même problème d'écran noir sur le défilement de l'affichage de la liste, j'ai été en utilisant fragment de carte avec la liste afficher dans le même écran, j'ai résolu ce problème avec l'utilisation de la propriété magique en xml d'où je parle de la liste de la vue juste, nous devons mettre android:scrollingCache="false".mon problème est résolu essayer cette propriété pour arrêter la traîne et le scintillement dans vos cartes.
Gars la meilleure solution que j'ai trouvé était à instancier votre plan de soutien par le biais de ce. Fait des merveilles
essayez d'ajouter..
getHolder().setFormat(PixelFormat.TRANSLUCIDE);
à votre SurfaceView du constructeur. Le TextureView doivent aussi travailler, mais qui va vous obliger à déposer, pour les sous-api 14 appareils.
Changer Votre FrameLayout à RelativeLayout si Possible
J'ai eu le même problème et a utilisé une solution basée sur le changement de la "Visibilité".
Cela a fonctionné pour moi...
Ajouter la carte:zOrderOnTop="true" pour votre fragment que ce...
N'oubliez pas de l'ajouter à votre parent ScrollView
Voici une très simple solution de contournement que j'ai utilisé pour se débarrasser de clignotant dans un ViewPager. J'imagine que la même chose sera vraie pour tout Fragment ou d'autres ajoutées dynamiquement MapView.
Le problème ne semble pas vraiment être la MapView lui-même, mais les ressources nécessaires à l'exécution de la MapView. Ces ressources ne sont chargés que la première fois que vous lancez une MapView dans votre activité et ré-utilisés pour chaque MapView, comme vous le souhaitez. Ce chargement de ressources est quelles sont les causes d'un flash à l'écran.
Afin de supprimer le flash, j'ai juste inclus une MapView dans la mise en page de mon Activité (emplacement dans l'activité n'est pas pertinent). Dès que l'Activité a chargé, j'ai juste mis la Visibilité de l'extra MapView à DISPARU. Cela signifie que toutes les ressources nécessaires pour votre MapView sont prêt pour quand vous lancez un de vos Fragments en utilisant MapViews avec pas de lag, pas de clignotant, tout bonheur.
C'est bien sûr une solution, et non une véritable "solution" au problème sous-jacent, mais il permettra de résoudre les effets secondaires.
Afin de couvrir le code utilisé pour l'exhaustivité:
Au hasard (mais proprement) placé dans mon Activité de Mise en page:
Puis, dans ma Classe d'Activité
SurfaceView
et ma question. Je sais de quoi vous parlez, j'ai eu le même problème quand j'ai essayé d'instancier plusieurs MapViews, mais ce n'est pas une réponse à ma question, malheureusement.