ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

android – Ripple效果无法使用共享元素转换和RecyclerView

2019-07-11 11:27:04  阅读:370  来源: 互联网

标签:android android-recyclerview android-transitions


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

使用共享元素转换启动活动

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的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);

使用ListView

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

项目布局

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

解决方法:

当我在卡片中使用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,但我发现这种方法为我喜欢的导航添加了太多的延迟.

标签:android,android-recyclerview,android-transitions
来源: https://codeday.me/bug/20190711/1431515.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有