24

我正在尝试在 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)
4

3 回答 3

50

当您的视图确实有“hasOverlappingRendering()”返回 true 时,淡入淡出过渡将使用硬件层。这样做是为了性能。您必须有许多视图都分别淡出。

你有几个选择。一种是让您的视图具有 hasOverlappingRendering 返回 false。这可能并非在所有情况下都是可能的,但它可能足以解决您的问题。请记住,这意味着包含的视图不应重叠!

第二个是单独转换更少的视图。您可以通过在应该一起淡出的 ViewGroups 上设置 android:transitionGroup="true" 来做到这一点。例如,如果您有一个没有背景的 ListView,您最终将分别转换每个元素。相反,您可以将 ListView 的 transitionGroup 属性设置为 true,然后它们将一起过渡。

- 更新 -

您遇到的问题是淡入的传入视图太大。我在启动活动中尝试了以下视图:

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

是的,来自 android 的 hello world 基本应用程序,为文本提供了 id 和 transitionName。onClick 处理程序只是启动第二个 Activity,将 hello world 视图作为共享元素传递。第二个 Activity 有一个非常大的 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>

将 ScrollView 的 transitionGroup 从 false (默认值)切换为 true 使其工作,因为此时 ScrollView 正在淡入。 ScrollView 具有最大尺寸,而其内容可能很大。

于 2014-10-29T19:15:09.573 回答
8

此问题的根本原因在您的日志中的此行中指出:

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

您的目标活动的高度为 4628,大于 GPU 支持的最大值 - 4096。

另一个答案中已经提到的解决方案是创建一个更短的目标活动。类似的问题和答案在这里:crash - material design android 5.0

于 2015-01-17T03:40:27.807 回答
1

如果不是必须的淡入淡出过渡,您可以避免它:有关详细信息,请参见此处:https ://stackoverflow.com/a/45030173/4334399

于 2017-07-11T09:14:45.397 回答