public class SimpleViewAnimator extends LinearLayout
{
private Animation inAnimation;
private Animation outAnimation;
public SimpleViewAnimator(Context context)
{
super(context);
}
public void setInAnimation(Animation inAnimation)
{
this.inAnimation = inAnimation;
}
public void setOutAnimation(Animation outAnimation)
{
this.outAnimation = outAnimation;
}
@Override
public void setVisibility(int visibility)
{
if (getVisibility() != visibility)
{
if (visibility == VISIBLE)
{
if (inAnimation != null) startAnimation(inAnimation);
}
else if ((visibility == INVISIBLE) || (visibility == GONE))
{
if (outAnimation != null) startAnimation(outAnimation);
}
}
super.setVisibility(visibility);
}
}
10
使用这个类:
public class ExpandCollapseExtention {
public static void expand(View view) {
view.setVisibility(View.VISIBLE);
final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
view.measure(widthSpec, heightSpec);
ValueAnimator mAnimator = slideAnimator(view, 0, view.getMeasuredHeight());
mAnimator.start();
}
public static void collapse(final View view) {
int finalHeight = view.getHeight();
ValueAnimator mAnimator = slideAnimator(view, finalHeight, 0);
mAnimator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationEnd(Animator animator) {
view.setVisibility(View.GONE);
}
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
mAnimator.start();
}
private static ValueAnimator slideAnimator(final View v, int start, int end) {
ValueAnimator animator = ValueAnimator.ofInt(start, end);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int value = (Integer) valueAnimator.getAnimatedValue();
ViewGroup.LayoutParams layoutParams = v.getLayoutParams();
layoutParams.height = value;
v.setLayoutParams(layoutParams);
}
});
return animator;
}
}
60
使用Android 3.0(Honeycomb)中引入的新动画API,创建此类动画非常简单 .
将 View 向下滑动一段距离:
view.animate().translationY(distance);
您可以稍后将 View 滑回原来的位置,如下所示:
view.animate().translationY(0);
您还可以轻松组合多个动画 . 以下动画将向下滑动 View 高度并同时淡入其中:
// Prepare the View for the animation
view.setVisibility(View.VISIBLE);
view.setAlpha(0.0f);
// Start the animation
view.animate()
.translationY(view.getHeight())
.alpha(1.0f)
.setListener(null);
10 回答
Kotlin
基于Suragch的answer,这是一种使用View扩展的优雅方式:
然后无论你想在哪里使用它,你只需要
myView.slideUp()
或myView.slideDown()
最简单的解决方案:在容纳视图的容器上设置
android:animateLayoutChanges="true"
.将其置于某些上下文中:如果您具有如下所示的布局,则将自动为此容器中的视图的所有可见性更改进行动画处理 .
你可以在Animating Layout Changes - Android Developer找到更多相关细节
我在理解应用已接受的答案时遇到了麻烦 . 我需要更多的背景 . 现在我已经弄明白了,这是一个完整的例子:
MainActivity.java
activity_mail.xml
注意事项
感谢this article指出我正确的方向 . 它比这个页面上的其他答案更有帮助 .
如果要从屏幕上的视图开始,则不要将其初始化为
INVISIBLE
.由于我们在屏幕上完全动画,因此无需将其设置回
INVISIBLE
. 但是,如果您没有完全关闭屏幕动画,则可以添加Alpha动画并使用AnimatorListenerAdapter
设置可见性 .Property Animation docs
当
LinearLayout
的可见性发生变化时,您可以通过创建LinearLayout
的新子类并重写setVisibility()
以启动Animations
来启动正确的Animation
. 考虑这样的事情:使用这个类:
使用Android 3.0(Honeycomb)中引入的新动画API,创建此类动画非常简单 .
将
View
向下滑动一段距离:您可以稍后将
View
滑回原来的位置,如下所示:您还可以轻松组合多个动画 . 以下动画将向下滑动
View
高度并同时淡入其中:然后,您可以将
View
淡出并将其滑回原始位置 . 我们还设置了AnimatorListener
,因此我们可以在动画结束后将View
的可见性设置回GONE
:您可以使用Android应用程序中的波纹管代码上下滑动任何视图或布局
我有一个角落的情况,我的视图的高度仍然是
zero
所以......这是我的解决方案 . 只需获得对您的视图的引用并调用此方法:
无需做任何其他事情=)