android – 具有半径的CardView上的共享元素转换

android – 具有半径的CardView上的共享元素转换,第1张

概述我已经在这个问题上工作了好几个星期,我仍然无法解决这个问题. 所以,我有一个包含带有ImageView的LinearLayout的CardView. 没有该半径,Shared Element Transition可以无缝地工作.但是,当我将半径(app:cardCornerRadius =“25dp”)添加到该CardView时,共享元素转换看起来很难看,因为它首先删除半径然后开始动画. 第一种方 我已经在这个问题上工作了好几个星期,我仍然无法解决这个问题.

所以,我有一个包含带有ImageVIEw的linearLayout的CardVIEw.

没有该半径,Shared Element Transition可以无缝地工作.但是,当我将半径(app:cardCornerRadius =“25dp”)添加到该CardVIEw时,共享元素转换看起来很难看,因为它首先删除半径然后开始动画.

第一种方法:ObjectAnimator

我创建了ObjectAnimator来为卡上的半径值设置动画,并在动画结束后开始转换.

ObjectAnimator animator = ObjectAnimator            .offloat(vIEw,"radius",AppUtil.dpAsPixel(this,25),0);animator.setDuration(150);animator.addListener( // start new Activity with Transition );animator.start();

这有效,但看起来不太好,因为转换在开始转换之前等待动画完成.我需要的是半径是在转换到新Activity时的动画(类似于TransitionSet中的ORDERING_TOGETHER).

第二种方法 – ChangeImagetransform

我已经阅读了StackOverflow post来使用transformation Class,如ChangeImagetransform和ChangeBounds.

我确实定义了我建议的应用程序主题(my_Transition包含ChangeImagetransform TransitionSet)

<item name="androID:windowsharedElementEnterTransition">@Transition/my_Transition</item><item name="androID:windowsharedElementExitTransition">@Transition/my_Transition</item>

但它不起作用..

第三种方法 – 天真

我的最后一次尝试是强制目标ImageVIEw的半径也是25dp.因为目标ImageVIEw可能是方形的,因此可能我的CardVIEw被转换为方形,但正如您所猜测的那样,它不起作用.

第四种方法 – 不使用CardVIEw

如您所见,我正在使用Penguin图像并使用CardVIEw来制作半径.我可以使用图像转换使图像四舍五入,但我仍然认为这不是创建共享元素转换的正确方法.

这是我的问题,有没有办法使CardVIEw半径的共享元素转换工作而不首先删除半径?

解决方法 我终于能够解决它了.对于那些感兴趣的人,这是如何:

为什么在开始转换之前删除半径?因为目标ImageVIEw没有任何半径.

activity_detail.xml

<ImageVIEw    androID:ID="@+ID/iv_image_cover"    androID:layout_wIDth="match_parent"    androID:layout_height="250dp"    androID:scaleType="centerCrop"    androID:src="@{animal.imageRes}"    androID:Transitionname="animalimage"    tools:src="@drawable/acat"/>

当我使用没有半径的CardVIEw时,它并不显着,但它实际上变成了目标共享视图.

>要实现半径到无半径转换,您必须将目标共享视图设置为四舍五入.我只是使用卡片视图(半径)包裹它.

activity_detail.xml

<androID.support.v7.Widget.CardVIEw    androID:ID="@+ID/card"    androID:layout_wIDth="match_parent"    androID:layout_height="wrap_content"    androID:Transitionname="card"    app:cardCornerRadius="25dp">    <ImageVIEw        androID:ID="@+ID/iv_image_cover"        androID:layout_wIDth="match_parent"        androID:layout_height="250dp"        androID:scaleType="centerCrop"        androID:src="@{animal.imageRes}"        androID:Transitionname="animalimage"        tools:src="@drawable/acat"    /></androID.support.v7.Widget.CardVIEw>

>务必将makeSceneTransition更改为使用“card”而不是“animalimage”

ListActivity.class

ActivityOptionsCompat option = ActivityOptionsCompat.makeSceneTransitionAnimation(ListActivity.this,cardVIEw,"card");startActivity(intent,option.toBundle());

>在DetailActivity中,您可以在转换开始时启动半径动画.

DetailActivity.java

@OverrIDeprotected voID onCreate(@Nullable Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    getwindow().getSharedElementEnterTransition()        .addListener(new Transition.TransitionListener() {            @OverrIDe            public voID onTransitionStart(Transition Transition) {                ObjectAnimator animator = ObjectAnimator                    .offloat(activityDetailBinding.card,0);                animator.setDuration(250);                animator.start();            }        });}

>享受平稳过渡

注:要点为layout和activities

总结

以上是内存溢出为你收集整理的android – 具有半径的CardView上的共享元素转换全部内容,希望文章能够帮你解决android – 具有半径的CardView上的共享元素转换所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1131096.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-30
下一篇 2022-05-30

发表评论

登录后才能评论

评论列表(0条)

保存