Android:使用动画显示/隐藏视图

Bla*_*icz 79 android android-animation android-layout android-relativelayout

我一直在浏览这里的许多谷歌搜索结果/问题,以确定如何通过垂直动画显示/隐藏视图,但我似乎找不到一个完全正确或不太模糊的视图.

我有一个布局(撤消栏),它位于另一个布局下方和多个其他小部件之上; 根据具体情况,此撤销栏应垂直滑动打开并滑动关闭.

目前,我现在所做的只是将视图设置为可见或消失.

poz*_*log 64

android:animateLayoutChanges="true" 在父布局中设置属性 .

如果视图不是,则将视图放在布局中,并android:animateLayoutChanges="true"为该布局设置.

注意:这仅适用于API Level 11+(Android 3.0)


Rot*_*miz 19

我创建了一个扩展,用于RelativeLayout显示/隐藏带有动画的布局.它可以扩展任何类型View以获得这些功能.

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.widget.RelativeLayout;

public class AnimatingRelativeLayout extends RelativeLayout
{
    Context context;
    Animation inAnimation;
    Animation outAnimation;

    public AnimatingRelativeLayout(Context context)
    {
        super(context);
        this.context = context;
        initAnimations();

    }

    public AnimatingRelativeLayout(Context context, AttributeSet attrs)
    {
        super(context, attrs);
        this.context = context;
        initAnimations();
    }

    public AnimatingRelativeLayout(Context context, AttributeSet attrs, int defStyle)
    {
        super(context, attrs, defStyle);
        this.context = context;
        initAnimations();
    }

    private void initAnimations()
    {
        inAnimation = (AnimationSet) AnimationUtils.loadAnimation(context, R.anim.in_animation);
        outAnimation = (Animation) AnimationUtils.loadAnimation(context, R.anim.out_animation);
    }

    public void show()
    {
        if (isVisible()) return;
        show(true);
    }

    public void show(boolean withAnimation)
    {
        if (withAnimation) this.startAnimation(inAnimation);
        this.setVisibility(View.VISIBLE);
    }

    public void hide()
    {
        if (!isVisible()) return;
        hide(true);
    }

    public void hide(boolean withAnimation)
    {
        if (withAnimation) this.startAnimation(outAnimation);
        this.setVisibility(View.GONE);
    }

    public boolean isVisible()
    {
        return (this.getVisibility() == View.VISIBLE);
    }

    public void overrideDefaultInAnimation(Animation inAnimation)
    {
        this.inAnimation = inAnimation;
    }

    public void overrideDefaultOutAnimation(Animation outAnimation)
    {
        this.outAnimation = outAnimation;
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以Animation使用overrideDefaultInAnimation和覆盖原始soverrideDefaultOutAnimation

我的原始动画是fadeIn/Out,我正在添加XML动画文件用于翻译进出屏幕(翻译到顶部和从顶部)

in_animation.xml:

    <?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="600"
    android:fillAfter="false"
    android:fromXDelta="0"
    android:fromYDelta="-100%p"
    android:toXDelta="0"
    android:toYDelta="0" />
Run Code Online (Sandbox Code Playgroud)

out_animation.xml:

  <?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="600"
    android:fillAfter="false"
    android:fromXDelta="0"
    android:fromYDelta="0"
    android:toXDelta="0"
    android:toYDelta="-100%p" />
Run Code Online (Sandbox Code Playgroud)


Rud*_*haw 15

这可以在API 12及更高版本的单行声明中合理地实现.下面是一个示例,v您希望动画的视图;

v.animate().translationXBy(-1000).start();
Run Code Online (Sandbox Code Playgroud)

这将使View问题向左滑动1000px.要将视图滑回UI,我们可以简单地执行以下操作.

v.animate().translationXBy(1000).start();
Run Code Online (Sandbox Code Playgroud)

我希望有人觉得这很有用.


And*_*din 11

如果您只想为视图的高度设置动画(从0到某个数字),您可以实现自己的动画:

final View v = getTheViewToAnimateHere();
Animation anim=new Animation(){
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        super.applyTransformation(interpolatedTime, t);
        // Do relevant calculations here using the interpolatedTime that runs from 0 to 1
        v.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, (int)(30*interpolatedTime)));
    }};
anim.setDuration(500);
v.startAnimation(anim);
Run Code Online (Sandbox Code Playgroud)


Jit*_*iya 7

我已经使用这两个功能来平滑地隐藏和显示具有过渡动画的视图.

@TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void expand(final View v, int duration, int targetHeight, final int position) {

        int prevHeight = v.getHeight();

        v.setVisibility(View.VISIBLE);
        ValueAnimator valueAnimator = ValueAnimator.ofInt(0, targetHeight);
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                v.getLayoutParams().height = (int) animation.getAnimatedValue();
                v.requestLayout();
            }
        });
        valueAnimator.setInterpolator(new DecelerateInterpolator());
        valueAnimator.setDuration(duration);
        valueAnimator.start();
        valueAnimator.addListener(new AnimatorListenerAdapter() {

            @Override
            public void onAnimationEnd(Animator animation) {
                v.clearAnimation();
            }
        });

    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    public void collapse(final View v, int duration, int targetHeight, final int position) {
        if (position == (data.size() - 1)) {
            return;
        }
        int prevHeight = v.getHeight();
        ValueAnimator valueAnimator = ValueAnimator.ofInt(prevHeight, targetHeight);
        valueAnimator.setInterpolator(new DecelerateInterpolator());
        valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                v.getLayoutParams().height = (int) animation.getAnimatedValue();
                v.requestLayout();
            }
        });
        valueAnimator.setInterpolator(new DecelerateInterpolator());
        valueAnimator.setDuration(duration);
        valueAnimator.start();
        valueAnimator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                animBoolArray.put(position, false);
                v.clearAnimation();

            }
        });
    }
Run Code Online (Sandbox Code Playgroud)


noo*_*oob 4

尝试使用TranslateAnimation类,它创建位置变化的动画。尝试阅读此内容以获取帮助 - http://developer.android.com/reference/android/view/animation/TranslateAnimation.html

更新:这是一个例子。如果您的视图高度为 50,并且在隐藏模式下您只想显示 10 px。示例代码是 -

TranslateAnimation anim=new TranslateAnimation(0,0,-40,0);
anim.setFillAfter(true);
view.setAnimation(anim);
Run Code Online (Sandbox Code Playgroud)

PS:有很多或其他方法可以帮助您根据需要使用动画。如果您想完全自定义代码,还可以查看RelativeLayout.LayoutParams,但是使用TranslateAnimation 更容易使用。

编辑:-使用 LayoutParams 的复杂版本

RelativeLayout relParam=new RelativeLayout.LayoutParam(RelativeLayout.LayoutParam.FILL_PARENT,RelativeLayout.LayoutParam.WRAP_CONTENT); //you can give hard coded width and height here in (width,height) format.
relParam.topMargin=-50; //any number that work.Set it to 0, when you want to show it.
view.setLayoutParams(relparam);
Run Code Online (Sandbox Code Playgroud)

此示例代码假设您将视图放入RelativeLayout 中,如果不更改布局的名称,则其他布局可能无法工作。如果你想给它们一个动画效果,慢慢地减少或增加topMargin。您也可以考虑在那里使用 Thread.sleep() 。