TextInputLayout 共享元素过渡问题

Posted

技术标签:

【中文标题】TextInputLayout 共享元素过渡问题【英文标题】:TextInputLayout shared element transition issue 【发布时间】:2018-03-01 12:23:41 【问题描述】:

我们开始:两个具有共享元素转换(按钮)的活动。第二个Activity 有一个带有提示的TextInputLayout

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              xmlns:app="http://schemas.android.com/apk/res-auto"
              android:layout_
              android:layout_
              android:focusable="true"
              android:focusableInTouchMode="true"
              android:gravity="center_horizontal"
              android:orientation="vertical">

    <Button android:layout_ android:layout_
            android:text="GO"
            android:transitionName="test"/>

    <android.support.design.widget.TextInputLayout android:layout_
                                                   android:layout_
                                                   android:hint="WTF?!">
        <android.support.design.widget.TextInputEditText android:layout_
                                                         android:layout_/>
    </android.support.design.widget.TextInputLayout>
</LinearLayout>   

第二个Activity的进入转场延迟为澄清问题:TextInputLayout的提示忽略转场动画,转场开始后立即显示。在动画结束时,您可以在提示下方看到正确动画的 EditText 背景(水平线)。这是一个错误还是我错过了什么?这是第二个Activity

public class SecondActivity extends AppCompatActivity 

    public static void launch(Activity activity, View sharedElement) 
        Intent intent = new Intent(activity, SecondActivity.class);

        ActivityOptionsCompat options = ActivityOptionsCompat.
                makeSceneTransitionAnimation(activity, sharedElement, "test");
        activity.startActivity(intent, options.toBundle());
    

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) 
            getWindow().setEnterTransition(new Slide().setDuration(5000));
        
    

编辑:可以通过在第二个 Activity 的布局中添加背景来“修复”这个错误。

【问题讨论】:

你的共享元素是什么?你预计会发生什么? 共享元素是按钮,从示例代码中可以看出。期望是,TextInputLayout 的提示作为 Activity 转换的一部分被正确地动画化,就像视图的其余部分一样(查看视频中 EditText 背景的正确转换)。 请澄清您的问题。您的动画 GIF 看起来不错,我们已经掌握了。是很酷的动画。但我不明白,有什么问题?它在哪里?如果蓝线向上移动,我会看到什么。就这样。然后在输入字段下会出现一个短暂的闪烁 -- 行。是预期的吗?不期待吗?什么? TextInputLayout 的提示不是动画的,在过渡到第二个 Activity 后立即显示。闪烁的线是在 Activity 过渡结束时出现的 EditText 的背景。蓝线是第二个 Activity 动画时的状态栏。这里没有什么很酷或特别的,只是上面显示的代码。 【参考方案1】:

适用于 API 21+

android:transitionGroup="true"

TextInputLayout 中添加这一行。它会修复它。或者,如果您有几个 TextInputLayout,则将该行添加到他们的容器中。

【讨论】:

【参考方案2】:

我认为它的错误是TextInputLayout。我删除了它,并给了TextInputEditText 的提示,它按您的预期工作。

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_
    android:layout_
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:gravity="center_horizontal"
    android:orientation="vertical">

    <Button
        android:layout_
        android:layout_
        android:text="GO"
        android:transitionName="test" />


    <android.support.design.widget.TextInputEditText
        android:layout_
        android:layout_
        android:hint="WTF?!" />

</LinearLayout>

【讨论】:

【参考方案3】:

似乎是一个错误。我提交了new issue。

您可以通过为第二个活动定义 android:background 来避免这种情况。

【讨论】:

以上是关于TextInputLayout 共享元素过渡问题的主要内容,如果未能解决你的问题,请参考以下文章

android-如何从标记位图开始共享元素过渡?

如何实现与视频的共享元素过渡

具有 scaleType centerCrop 过渡的共享元素跳跃

共享元素过渡重叠 BottomNavigationView

共享元素过渡 - 仅对共享视图的可见部分进行动画处理

Android棒棒糖共享元素过渡闪烁/闪烁