4

我有一个动画如下的布局

在此处输入图像描述

txt_billion动态显示,带有(下面的android:animateLayoutChanges="true"布局代码)。

注意Hundred正在跳跃(实际上所有都在跳跃,但Hundred更明显)。如何防止文字跳动?

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:animateLayoutChanges="true"
    android:orientation="horizontal">
    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:padding="8dp"
        android:background="#9f9"
        android:text="Hundreds" />
    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:padding="8dp"
        android:background="#f9f"
        android:text="Thousands" />
    <TextView
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:padding="8dp"
        android:background="#0ff"
        android:text="Millions" />
    <TextView
        android:id="@+id/txt_billion"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:gravity="center"
        android:padding="8dp"
        android:visibility="gone"
        android:background="#ff0"
        android:text="Billions" />
</LinearLayout>

您可以从https://github.com/elye/issue_horizo​​ntal_layout_animate获取代码进行测试

4

2 回答 2

1

尝试改用支持过渡animateLayoutChanges

首先,android:animateLayoutChanges="true"从您的 XML 文件中删除

之后,添加compile 'com.android.support:transition:25.4.0'到您的应用程序依赖项。

然后,在更改可见性之前添加此行(来自 android.support.transition 包的 TransitionManager)

TransitionManager.beginDelayedTransition(parentOfAnimatedView);

对于您的代码

public void clickMe(View view) {
        TransitionManager.beginDelayedTransition((ViewGroup) billionText.getParent());
        if (billionText.getVisibility() == View.GONE) {
            billionText.setVisibility(View.VISIBLE);
        } else {
            billionText.setVisibility(View.GONE);
        }
    }
于 2017-06-20T16:02:40.753 回答
0

问题是animateLayoutChanges它只影响ViewGroup. TextView无法对布局更改动画做出反应,因此文本会跳转。有两种方法可以修复它:

1) 将每个包裹TextView在 a 中FrameLayout并将重量放在FrameLayout. 您还必须添加android:animateLayoutChanges="true"到每个,以及调用getLayoutTransition().enableTransitionType(LayoutTransition.CHANGING)每个FrameLayout. 这是一种粗略的布局方式,但它可以让您继续使用过渡动画。

2)使用 aValueAnimator并为(不)出现的项目的权重设置动画。动画可能有点不稳定,因为它需要LinearLayout在每一帧上进行布局,但它应该仍然可以通过。您还必须解决消失项目上的文本重排问题,可能是先对其淡出进行动画处理,然后再对权重变化进行动画处理。

于 2017-08-02T17:28:38.403 回答