web-dev-qa-db-ja.com

ヒーロー要素を含むシーンの遷移により、レイヤーが最大を超えます。 GPUがサポートする寸法

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

ビューに "hasOverlappingRendering()"がtrueを返す場合、フェードトランジションはハードウェアレイヤーを使用します。これはパフォーマンスのために行われました。多くのビューがすべて個別にフェードアウトする必要があります。

いくつかのオプションがあります。 1つは、ビューでhasOverlappingRenderingがfalseを返すようにすることです。これはすべての場合に可能であるとは限りませんが、問題を解決するには十分な場合があります。これは、含まれているビューが重複してはならないことを意味します!

2つ目は、少数のビューを個別に移行することです。これを行うには、一緒にフェードアウトする必要がある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ハンドラーは2番目のアクティビティを起動し、hello worldビューを共有要素として渡します。 2番目のアクティビティには、あなたのような非常に大きな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が機能します。

50
George Mount

この問題の根本的な原因は、次の行のログに示されています。

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

ターゲットアクティビティの高さは4628で、GPUでサポートされている最大-4096を超えています。

他の回答ですでに述べた解決策は、より短いターゲットアクティビティを作成することです。同様の質問と回答はこちら: クラッシュ-マテリアルデザインAndroid 5.

6
donturner

フェードトランジションが必須でない場合は、これを回避できます。詳細については、こちらを参照してください https://stackoverflow.com/a/45030173/4334399

1
Seth