【问题标题】:Ripple effect not working with shared element transition and RecyclerView波纹效果不适用于共享元素转换和 RecyclerView
【发布时间】:2016-03-21 17:05:08
【问题描述】:

当一个`RecyclerView 项目点击启动一个详细活动时,我有一个共享元素转换,但项目点击的涟漪效应永远不可见

使用共享元素转换启动 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 延迟 Activity 启动

如果我使用带有postDelayed 的 Handler 来启动 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);

使用列表视图

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

项目布局

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

【问题讨论】:

  • 遇到同样的问题
  • 我还没有找到更好的解决方案。我有兴趣了解为什么ListViewRecyclerView 之间存在如此大的差异。

标签: android android-recyclerview android-transitions


【解决方案1】:

当我在卡片中有一个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 并稍作延迟,但我发现这种方法给导航增加了太多延迟,我不喜欢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-18
    • 1970-01-01
    • 2018-03-15
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    相关资源
    最近更新 更多