android - Fragment Transition 和 Alpha 问题

标签 android android-fragments android-transitions

我正在使用 FragmentTransition,以及 2 个 Fragment 之间的 SharedElementTransition

实际的元素转换和 Fragment 转换由一组不同的转换组成,以创建所需的动画,我对动画没有任何问题,但为了清楚起见,包括了所有使用的转换:

    val moveElementTransition: Transition  by lazy { TransitionInflater.from(context).inflateTransition(android.R.transition.move) }
    val noElementTransition:Transition by lazy { TransitionSet().addTransition(TransitionInflater.from(context).inflateTransition(android.R.transition.no_transition)) }
    val exitTransition: Transition by lazy { TransitionSet().addTransition(TransitionInflater.from(context).inflateTransition(android.R.transition.slide_left)).setDuration(200L).setStartDelay(0L) }
    val reenterTransition: Transition by lazy { TransitionSet().addTransition(TransitionInflater.from(context).inflateTransition(android.R.transition.slide_left)).setDuration(200L).setStartDelay(450L) }
    val enterTransition: Transition by lazy { TransitionSet().addTransition(TransitionInflater.from(context).inflateTransition(android.R.transition.slide_bottom)).setDuration(200L).setStartDelay(400L) }

问题

澄清一下,当从 FragmentAFragmentB 时,以及当我弹出 backstack 并反转动画时,所有转换都“有效”。

然而,在转换发生时, View 上的所有 alpha 设置(包括 CardView 角和 View alpha)似乎都是不正确的。结果显然是丑陋的,而过渡发生时任何 alpha 显示不正确(更多的是乘数效果,而不是叠加)。 Fragment Transitions 似乎不正确支持 View 的 alpha?

我在某些 View 中使用的 alpha 插图示例是:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
       android:shape="rectangle">
    <gradient
        android:angle="0"
        android:endColor="@android:color/transparent"
        android:startColor="@color/colorWindowBackgroundTint"
        android:type="linear"/>
</shape>

左侧小插图的正常外观截图,以及 fragment 过渡动画期间的截图:

Left: correct appearance Right: Incorrect during Fragment Transtion

有没有其他人遇到过这个问题,如果遇到过,他们有解决办法吗?

编辑:

根据要求,我创建了一个小型测试应用程序来复制此行为(在模拟器 api 23/24/25 上测试)- 链接:https://github.com/TreeFrogApps/FragmentTransitionTest

最佳答案

我发现当在 fragment B 上按下后退时您显示的示例应用存在两个问题。第一个是右侧的渐变没有优雅地向下滑动,而是消失了。第二个问题是左边的渐变在向下滑动之前以一种相当奇怪的方式变化。这是我在示例应用程序中看到的内容:

enter image description here

我真的不能说为什么我们会看到这个,但我可以告诉你一个解决它的方法。这是否适用于您的真实应用,您必须自行决定。

首先,让我们修复左侧小插图的奇怪行为。这个问题不知何故涉及从纯色到透明色的过渡。要解决此问题,请将结束颜色更改为开始颜色的透明版本。视觉外观不会改变。

shape_vignette_left.xml

<shape 
    android:shape="rectangle">
    <gradient
        android:angle="0"
        android:startColor="#FF303F9F"
        android:endColor="#00303F9F"
        android:type="linear" />
</shape>

为了简单起见,我使用了颜色常量而不是 id。

现在,让我们修复正确的小插图。这(再次以某种方式)与可绘制形状的旋转有关。要解决此问题,请通过反转上述形状的开始/结束颜色并从布局中删除旋转来创建一个内置旋转的新形状可绘制对象,如下所示:

shape_vignette_right.xml

<shape 
    android:shape="rectangle">
    <gradient
        android:angle="0"
        android:startColor="#00303F9F"
        android:endColor="#FF303F9F"
        android:type="linear" />
</shape>

这是新布局:

fragment_b_layout.xml

<FrameLayout 
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <View
        android:layout_width="64dp"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:background="@drawable/shape_vignette_left" />

    <View
        android:layout_width="64dp"
        android:layout_height="match_parent"
        android:layout_gravity="right"
        android:background="@drawable/shape_vignette_right" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="Fragment B"
        android:textColor="@android:color/white" />

</FrameLayout>

这是上述更改结束后的样子:

enter image description here

好多了。


作为后续,这是原始的左侧可绘制对象(全屏),其开始/结束颜色为“#FF303F9F”和“@android:color/transparent”:

enter image description here

这是同一个绘图,其开始/结束颜色为“#FF303F9F”和“#00303F9F”。随着颜色从完全不透明(“#FF303F9F”)过渡到完全透明(“#00303F9F”),位于可绘制对象后面的任何 View 都将变得越来越明显。

enter image description here

关于android - Fragment Transition 和 Alpha 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47003476/

相关文章:

android - 调用 stopForeground 导致重启当前服务

Android:从第二个 Activity 切换回第一个 Activity 同时退出

android - 在 React Native 应用程序中加载 fragment

java - 在 onCreateView 方法之外的 Fragment Activity 中使用 Edittext

android - 如何创建带动画的 TextSwitcher

android - 折叠 CardView 动画无法正常工作

java - Android - Java 服务器和 android 客户端

Android Activity 从左到右过渡,带有缓入缓出曲线

android - 在 Android 中 fragment 发生变化时如何使用 Material Design Transition?

android - Google 云消息传递 - GCM - SERVICE_NOT_AVAILABLE