动画视图滑出另一个视图,将视图推到下面

nha*_*man 25 android android-animation

我有一个按钮列表.当我按下按钮时,视图应该向下滑动按钮,如下所示:

开始:
在此输入图像描述

半:
在此输入图像描述

结束:
在此输入图像描述

我该怎么做?应该滑出的视图比按钮大,因此首先隐藏按钮后面的View然后向下滑动会导致视图在按钮上方可见.这不应该发生.

有关如何处理此问题的任何想法或示例?

Lui*_*uis 74

我相信最简单的方法是扩展Animation类和覆盖applyTransformation()以更改视图的高度,如下所示:

import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.view.animation.Animation;
import android.view.animation.Transformation;
import android.widget.LinearLayout;

public class MyCustomAnimation extends Animation {

    public final static int COLLAPSE = 1;
    public final static int EXPAND = 0;

    private View mView;
    private int mEndHeight;
    private int mType;
    private LinearLayout.LayoutParams mLayoutParams;

    public MyCustomAnimation(View view, int duration, int type) {

        setDuration(duration);
        mView = view;
        mEndHeight = mView.getHeight();
        mLayoutParams = ((LinearLayout.LayoutParams) view.getLayoutParams());
        mType = type;
        if(mType == EXPAND) {
            mLayoutParams.height = 0;
        } else {
            mLayoutParams.height = LayoutParams.WRAP_CONTENT;
        }
        view.setVisibility(View.VISIBLE);
    }

    public int getHeight(){
        return mView.getHeight();
    }

    public void setHeight(int height){
        mEndHeight = height;
    }

    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {

        super.applyTransformation(interpolatedTime, t);
        if (interpolatedTime < 1.0f) {
            if(mType == EXPAND) {
                mLayoutParams.height =  (int)(mEndHeight * interpolatedTime);
            } else {
                mLayoutParams.height = (int) (mEndHeight * (1 - interpolatedTime));
            }
            mView.requestLayout();
        } else {
            if(mType == EXPAND) {
                mLayoutParams.height = LayoutParams.WRAP_CONTENT;
                mView.requestLayout();
            }else{
                mView.setVisibility(View.GONE);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

要使用它,请onclick()按如下方式设置:

int height;

@Override
public void onClick(View v) {
    if(view2.getVisibility() == View.VISIBLE){
        MyCustomAnimation a = new MyCustomAnimation(view2, 1000, MyCustomAnimation.COLLAPSE);
        height = a.getHeight();
        view2.startAnimation(a);
    }else{
        MyCustomAnimation a = new MyCustomAnimation(view2, 1000, MyCustomAnimation.EXPAND);
        a.setHeight(height);
        view2.startAnimation(a);
    }
}
Run Code Online (Sandbox Code Playgroud)

问候.

  • 对不起老兄,但MyAnimation是什么? (3认同)
  • 我尝试使用它,它工作得很好.但是当我第一次扩展它而不显示动画只是显示视图时,我遇到了一些错误.之后动画显示. (3认同)
  • 在我的情况下,`view2`突然出现即.没有滑动动画,但它会以完美的滑动动画消失.如何将滑动效果也应用于"EXPAND"? (2认同)