example - shared element transition android fragment
La transición de la escena con elementos de héroe arroja Capa supera el máx. Dimensiones soportadas por la GPU. (3)
Estoy tratando de hacer una transición de héroe en Android 5.0 entre una imagen en un ListView a una página de detalles. Pero para aproximadamente el 50% de mis imágenes, Android se bloquea con la excepción a continuación. Mis imágenes son 600x400 pero intenté cambiarlas a 200x100 pero obtuve el mismo error. Cuando funciona, se ve muy bien, pero no puedo ver la diferencia entre las distintas imágenes. Realmente no estoy seguro de por qué dice que la capa es demasiado grande, ¿alguien tiene una pista?
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 causa raíz de este problema se indica en su registro en esta línea:
W/OpenGLRenderer(18137): Layer exceeds max. dimensions supported by the GPU (1080x4628, max=4096x4096)
W/OpenGLRenderer(18137): Layer exceeds max. dimensions supported by the GPU (1080x4628, max=4096x4096)
.
Su actividad objetivo tiene una altura de 4628 que es mayor que el máximo admitido por la GPU - 4096.
La solución, ya mencionada en la otra respuesta, es crear una actividad objetivo que sea más corta. Preguntas y respuestas similares aquí: crash - material design android 5.0
La transición Fade usará capas de hardware cuando su vista tenga "hasOverlappingRendering ()", devuelva true. Esto se hizo para el rendimiento. Debes tener muchas vistas que se desvanecen por separado.
Usted tiene un par de opciones. Una de ellas es que sus puntos de vista han devuelto Falso. Esto puede no ser posible en todos los casos, pero puede ser suficiente para resolver su problema. ¡Recuerde que esto significa que las vistas contenidas no deben superponerse!
El segundo es transicionar menos vistas por separado. Puede hacer esto configurando android: transitionGroup = "true" en ViewGroups que deberían desaparecer juntos. Por ejemplo, si tiene un ListView sin fondo, terminará la transición de cada elemento por separado. En su lugar, puede establecer la propiedad transitionGroup de ListView en true y luego realizarán la transición juntos.
- actualizar -
El problema que está encontrando es que las vistas entrantes que se están desvaneciendo son demasiado grandes. Probé la siguiente Vista en la Actividad de lanzamiento:
<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>
Sí, la aplicación básica hello world de Android, que proporciona una identificación y una transición de nombre al texto. El controlador onClick solo inicia la segunda actividad, pasando la vista hello world como un elemento compartido. La segunda actividad tiene un TextView extremadamente grande, similar al suyo:
<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>
Cambiar el grupo de transición de ScrollView de falso (el valor predeterminado) a verdadero hace que funcione porque entonces ScrollView se está difuminando. ScrollView tiene un tamaño máximo, mientras que su contenido puede ser enorme.
Solo puede evitarlo si la transición de desvanecimiento no es obligatoria: consulte aquí para obtener más detalles: https://.com/a/45030173/4334399