Сцена переход с элементами героя бросает Слой превышает макс. размеры, поддерживаемые графическим процессором

Я пытаюсь сделать переход героя в Android 5.0 между изображением в ListView на страницу сведений. Но примерно для 50% моих изображений Android падает с исключением ниже. Мои изображения 600x400, но я попытался изменить их на 200x100, но получил ту же ошибку. Когда он работает, он выглядит великолепно, но я не вижу разницы между различными изображениями. Неужели неуверенно, почему он утверждает, что слой слишком велик, кто-нибудь понял?

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)

Ответ 1

Переход Fade будет использовать аппаратные уровни, когда ваше представление имеет "hasOverlappingRendering()" return true. Это было сделано для производительности. У вас должно быть много просмотров, которые все исчезают отдельно.

У вас есть пара вариантов. Один из них заключается в том, что ваши представления имеют hasOverlappingRendering return false. Это может быть невозможно во всех случаях, но этого может быть достаточно, чтобы решить вашу проблему. Помните, что это означает, что скрытые представления не должны пересекаться!

Второе - это переход к меньшему количеству просмотров отдельно. Вы можете сделать это, установив android: transitionGroup = "true" в ViewGroups, которые должны быть выведены вместе. Например, если у вас есть ListView без фона, вы в конечном итоге переходите каждый элемент отдельно. Вместо этого вы можете установить для свойства ListView transitionGroup значение true, а затем они будут переходить вместе.

- обновить -

Проблема, с которой вы сталкиваетесь, заключается в том, что входящие объекты, которые затухают, слишком велики. Я попробовал следующий вид в запуске Activity:

<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>

Да, базовое приложение hello world от android, дающее id и transitionName для текста. Обработчик onClick запускает только вторую активность, передавая hello world View как общий элемент. Второе действие имеет чрезвычайно большой TextView, похожий на ваш:

<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>

Переключение перехода из списка ScrollViewGroup из значения false (значение по умолчанию) в значение true заставляет его работать, потому что тогда ScrollView исчезает. ScrollView имеет максимальный размер, а его содержимое может быть огромным.

Ответ 2

Основная причина этой проблемы указана в вашем журнале в этой строке:

W/OpenGLRenderer(18137): Layer exceeds max. dimensions supported by the GPU (1080x4628, max=4096x4096).

Ваша целевая активность имеет высоту 4628, которая больше максимальной, поддерживаемой GPU-4096.

Решение, уже упомянутое в другом ответе, заключается в создании целевой активности, которая короче. Аналогичный вопрос и ответ здесь: crash - дизайн материалов android 5.0

Ответ 3

Вы можете просто избежать этого, если переход затухания не является обязательным: подробнее см. здесь fooobar.com/info/106870/...