19

我目前有一个正在运行的 Android 程序,它以编程方式将视图添加到 LinearLayout。我希望这些视图被动画化,并且找不到任何好的资源来弄清楚如何做到这一点。

有人能指出我正确的方向吗?

4

4 回答 4

25

这是一个非常古老的问题,但仍然很有趣:您可以使用属性android:animateLayoutChanges="true"

例如:

<LinearLayout

                android:orientation="horizontal"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:animateLayoutChanges="true"
               />
于 2014-07-10T14:15:50.233 回答
17

这可以通过Scenes 和 Transitions API来完成。

框架为我们提供了三种Transition开箱即用的类型:和Fade,但您也可以创建自定义类型的过渡扩展类并覆盖适当的方法。SlideExplodeVisibility

所以,有了 any ViewGroup,我们可以这样做:

viewGroup.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(final View v) {
        Transition t = null;
        if (i == 1) {
            t = new Fade();
        } else if (i == 2) {
            t = new Slide(Gravity.BOTTOM);
        } else if (i == 3) {
            t = TransitionInflater.from(v.getContext())
                                  .inflateTransition(R.transition.my_transition);
        }

        Button button = new Button(v.getContext());
        button.setText("My button " + i++);

        TransitionManager.beginDelayedTransition(customLayout, t);
        viewGroup.addView(button);
    }
});

my_transition.xml如下

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
               android:duration="3000"
               android:interpolator="@android:interpolator/fast_out_slow_in">

    <fade/>
    <slide android:slideEdge="bottom"/>

</transitionSet>

我们会得到这样的结果:

在此处输入图像描述

请注意,我们必须TransitionManager.beginDelayedTransition()在对布局进行任何更改之前执行(即addView()调用 before)。然后框架将负责其余的工作。

还有另一个重载TransitionManager.beginDelayedTransition(ViewGroup),您不需要指定要应用的确切过渡,系统将执行AutoTransition动画,这基本上会淡化并改变动画视图的边界。


更新评论中对话的总结

框架TransitionManager可从 API 19 获得,并从 API 21 完全支持(完全说我的意思是,例如Slide转换可从 API 21 获得)。虽然有可用的支持包,但它并不支持所有功能。或者,您可以移至TransitionsEverywhere库,它将所有内容向后移植到 Android 4.0。

于 2017-04-26T08:57:56.140 回答
6

尝试

1.线性布局添加视图

linearLayout.addView(customView);

2.添加slide_up.xmlres/anim文件夹

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
android:fillAfter="true">

  <translate
    android:duration="500"
    android:fromYDelta="100%"
    android:toYDelta="0%" />
</set>

3.添加视图后立即应用动画

Animation animation = AnimationUtils.loadAnimation(context, R.anim.slide_up);
customView.startAnimation(animation);

如果要一个一个地为视图设置动画,请使用以下几行

new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
        @Override
        public void run() {
            linearLayout.addView(customView);
            Animation animation = AnimationUtils.loadAnimation(context, R.anim.slide_up);
           customView.startAnimation(animation);
        }
 }, 500);
于 2017-04-28T04:45:04.810 回答
-1

你可以使用 ViewFlipper 并从那里设置动画,你可以看看这个教程 。祝你好运。

于 2010-10-31T08:40:32.883 回答