我目前有一个正在运行的 Android 程序,它以编程方式将视图添加到 LinearLayout。我希望这些视图被动画化,并且找不到任何好的资源来弄清楚如何做到这一点。
有人能指出我正确的方向吗?
我目前有一个正在运行的 Android 程序,它以编程方式将视图添加到 LinearLayout。我希望这些视图被动画化,并且找不到任何好的资源来弄清楚如何做到这一点。
有人能指出我正确的方向吗?
这是一个非常古老的问题,但仍然很有趣:您可以使用属性android:animateLayoutChanges="true"
例如:
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:animateLayoutChanges="true"
/>
这可以通过Scenes 和 Transitions API来完成。
框架为我们提供了三种Transition
开箱即用的类型:和Fade
,但您也可以创建自定义类型的过渡扩展类并覆盖适当的方法。Slide
Explode
Visibility
所以,有了 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。
尝试
1.线性布局添加视图
linearLayout.addView(customView);
2.添加slide_up.xml
到res/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);
你可以使用 ViewFlipper 并从那里设置动画,你可以看看这个教程 。祝你好运。