J'essaie de faire une transition de héros dans Android 5.0 entre une image dans un ListView vers une page de détails. Mais pour environ 50% de mes images Android plante) avec l'exception ci-dessous. Mes images sont 600x400 mais j'ai essayé de les changer en 200x100 mais j'ai obtenu la même erreur. , quelqu'un a une idée?
private void handleNewsItemClicked(AdapterView<?> arg0, View viewClicked, int arg2) {
TopNewsItem item = ((TopNewsItem)arg0.getAdapter().getItem(arg2));
Intent intent = new Intent(getActivity(), TopNewsDetailsActivity.class);
intent.putExtra(TopNewsDetailsActivity.ARGS_ID, item.getGuid().getId());
intent.putExtra(TopNewsDetailsActivity.ARGS_IMAGE, imageUrl);
if(Build.VERSION.SDK_INT >= 21) {
ActivityOptions options = ActivityOptions
.makeSceneTransitionAnimation(this.getActivity(),
viewClicked.findViewById(R.id.image), "article_image");
this.getActivity().startActivity(intent, options.toBundle());
}else
getActivity().startActivity(intent);
}
}
W/OpenGLRenderer(18137): Layer exceeds max. dimensions supported by the GPU (1080x4628, max=4096x4096)
D/AndroidRuntime(18137): Shutting down VM
V/GAV3 (18137): Thread[main,5,main]: Tracking Exception: IllegalStateException (@MessageQueue:nativePollOnce:-2) {main}
/AndroidRuntime(18137): FATAL EXCEPTION: main
E/AndroidRuntime(18137): Process: myapp.app, PID: 18137
E/AndroidRuntime(18137): Java.lang.IllegalStateException: Unable to create layer for RelativeLayout
E/AndroidRuntime(18137): at Android.os.MessageQueue.nativePollOnce(Native Method)
E/AndroidRuntime(18137): at Android.os.MessageQueue.next(MessageQueue.Java:143)
E/AndroidRuntime(18137): at Android.os.Looper.loop(Looper.Java:122)
E/AndroidRuntime(18137): at Android.app.ActivityThread.main(ActivityThread.Java:5221)
E/AndroidRuntime(18137): at Java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime(18137): at Java.lang.reflect.Method.invoke(Method.Java:372)
E/AndroidRuntime(18137): at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:899)
E/AndroidRuntime(18137): at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:694)
La transition Fade utilisera des couches matérielles lorsque votre vue a "hasOverlappingRendering ()" renvoyé true. Cela a été fait pour la performance. Vous devez avoir plusieurs vues disparaissant toutes séparément.
Vous avez plusieurs options. La première consiste pour vos vues à ce que hasOverlappingRendering renvoie false. Cela peut ne pas être possible dans tous les cas, mais cela peut suffire à résoudre votre problème. N'oubliez pas que cela signifie que les vues contenues ne doivent pas se chevaucher!
La seconde consiste à transférer séparément moins de vues. Vous pouvez le faire en définissant Android: transitionGroup = "true" sur ViewGroups qui doivent être effacés ensemble. Par exemple, si vous avez un ListView sans arrière-plan, vous finirez par effectuer la transition de chaque élément séparément. Au lieu de cela, vous pouvez définir la propriété transitionGroup de ListView sur true, puis ils effectueront la transition ensemble.
-- mettre à jour --
Le problème que vous rencontrez est que les vues entrantes qui apparaissent en fondu sont trop grandes. J'ai essayé la vue suivante dans l'activité de lancement:
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:onClick="clicked"
>
<TextView
Android:id="@+id/hello_world"
Android:transitionName="hello"
Android:text="@string/hello_world"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content" />
</RelativeLayout>
Oui, l'application de base Hello World d'Android, qui donne un identifiant et un nom de transition au texte. Le gestionnaire onClick lance simplement la deuxième activité, en passant le bonjour World View en tant qu'élément partagé. La deuxième activité a un TextView extrêmement grand, semblable au vôtre:
<ScrollView xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:transitionGroup="true"
>
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="wrap_content">
<TextView
Android:id="@+id/hello_world"
Android:transitionName="hello"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:layout_alignParentRight="true"
Android:text="@string/hello_world" />
<TextView
Android:layout_below="@+id/hello_world"
Android:text="Lorem ipsum.... I didn't copy all of my text"
Android:textSize="30sp"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
/>
</RelativeLayout>
</ScrollView>
Passer le groupe de transition du ScrollView de false (la valeur par défaut) à true le fait fonctionner car le ScrollView est alors fondu. Le ScrollView a une taille maximale, tandis que son contenu peut être énorme.
La cause première de ce problème est indiquée dans votre journal sur cette ligne:
W/OpenGLRenderer(18137): Layer exceeds max. dimensions supported by the GPU (1080x4628, max=4096x4096)
.
Votre activité cible a une hauteur de 4628, ce qui est supérieur au maximum pris en charge par le GPU - 4096.
La solution, déjà évoquée dans l'autre réponse, est de créer une activité cible plus courte. Question et réponse similaires ici: crash - design matériel Android 5.
Vous pouvez simplement l'éviter si la transition de fondu n'est pas un must: voir ici pour plus de détails: https://stackoverflow.com/a/45030173/4334399