共享元素转换和RecyclerView中的波纹效果无法正常工作

4

当RecyclerView的一项被点击后启动详细Activity时,我有一个共享元素过渡,但是单击项目的波纹效果从未可见

使用共享元素过渡启动Activity

Intent intent = IntentUtils.createDetailsIntent(InspectionListFragment.this.getContext(), record);
Bundle options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(),
                  view, getString(R.string.transition_element)).toBundle();
getActivity().startActivity(intent, options);

我注意到这个日志信息。
D/OpenGLRenderer: endAllStagingAnimators on 0x95e86600 (RippleDrawable) with handle 0xaa6c2760

如果我移除过渡效果,涟漪效果就会生效(这时候我就看不到这个消息了)。
使用Handler和postDelayed来启动Activity时,结果各不相同。涟漪效果可以看到,但是过渡效果却没有那么流畅:
    handler.postDelayed(new Runnable() {
        @Override
        public void run() {
            Intent intent = IntentUtils.createDetailsIntent(InspectionListFragment.this.getContext(), record);
            Bundle options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(),
                  view, getString(R.string.transition_element)).toBundle();
            getActivity().startActivity(intent, options);
        }
    }, 200);

使用ListView

请注意,使用具有相同项目布局和makeSceneTransitionAnimationListView是可以正常工作的。不幸的是,这并不适合所有情况。

项目布局

<LinearLayout
    android:background="?android:attr/selectableItemBackground"
    android:clickable="true"
    android:focusable="true"

完全有同样的问题。 - jiawen
我还没有找到更好的解决方案。我很想了解为什么ListViewRecyclerView之间会有这样的差异。 - sidecarcat
1个回答

0

当我在卡片中使用ImageView作为共享元素时,我遇到了同样的问题。但是,我通过将CardView用作共享元素转换(以及涟漪效果)的源视图来解决了这个问题。

<android.support.v7.widget.CardView
    android:id="@+id/itemCard"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_margin="8dp"
    app:cardCornerRadius="@dimen/card_corner_radius"
    app:cardElevation="@dimen/card_elevation"
    android:layout_gravity="center"
    android:clickable="true"
    android:onClick="@{onItemClick}"
    android:foreground="?android:attr/selectableItemBackground"
    >

我正在使用数据绑定,但共享元素的更改实质上只是选择了不同的源视图:

// before:
//onItemClickListener.onItemClick(view, getAdapterPosition(), getItemId(), Pair.create((View)b.itemImage, "activity_image"));

// after:
onItemClickListener.onItemClick(view, getAdapterPosition(), getItemId(), Pair.create((View)b.itemCard, "activity_image"));

在此之前,我也尝试使用postDelayed来延迟一小段时间,但我发现这种方法会给导航增加太多的延迟,不符合我的喜好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接