Android 的活动输入转换在重叠视图上无法按预期工作

Sie*_*yer 6 animation android transition

这是场景:

我正在尝试声明两个活动之间的过渡动​​画 - 主和细节。Master 是一个RecyclerView带有图像的列表,detail 是LinearLayout来自父列表的标题图像。转换在 XML 中声明并绑定到详细活动,如下所示:

<item name="android:windowSharedElementEnterTransition">@transition/activity_enter_shared</item>
<item name="android:windowEnterTransition">@transition/activity_enter</item>
Run Code Online (Sandbox Code Playgroud)

InRecyclerView的适配器转换是这样触发的:

final ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(
    mContext, 
    imgView, 
    ViewCompat.getTransitionName(imgView)
);
mContext.startActivity(new Intent(mContext, ChildActivity.class), options.toBundle());
Run Code Online (Sandbox Code Playgroud)

问题是:@transition/activity_enter我正在应用fade一些布局元素(例如后退按钮)。这些元素放置在FrameLayout 图像上。这似乎会导致fade视图出现问题,而不是顺利出现在屏幕上,而是“弹出”。这仅在视图重叠时发生- 如果放置在LinearLayout所有内容中都按预期工作。

fade@transition/activity_enter像这样声明:

<fade
    android:startDelay="300"
    android:duration="100"
    android:interpolator="@android:interpolator/linear">
    <targets>
        <target android:targetId="@id/target_id" />
    </targets>
</fade>
Run Code Online (Sandbox Code Playgroud)

注 1 - 如果以编程方式触发Activity fade工作正常:

final ViewGroup frame = (ViewGroup) findViewById(R.id.frame);
frame.setOnClickListener(new View.OnClickListener() {
    boolean visible;

    @Override
    public void onClick(View v) {
        TransitionManager.beginDelayedTransition(frame);
        visible = !visible;
        frame.findViewById(R.id.target_id).setVisibility(visible ? View.VISIBLE : View.GONE);
    }
});
Run Code Online (Sandbox Code Playgroud)

注 2 - 共享转换 ( @transition/activity_enter_shared) 是自定义的,但是,使用默认转换并不能解决问题。

注 3 - 最简单的布局如下所示:

<FrameLayout>
    <ImageView />
    <ImageButton android:id="@+id/target_id" />
</FrameLayout/>
Run Code Online (Sandbox Code Playgroud)

然而,问题并非特定于FrameLayout观点,而是观点重叠。

注意 4 - 例如,在下面的布局中,Lorem会弹出,而 ipsum会淡入。

在此处输入图片说明

Sie*_*yer 2

好吧,我找到了答案,对于有兴趣的人来说。

我必须设置

<item name="android:windowSharedElementsUseOverlay">false</item>
Run Code Online (Sandbox Code Playgroud)

在我的风格定义中。

来自文档

指示共享元素是否应在转换期间使用覆盖。默认值是true。