2

嗨,我正在尝试每隔 5 秒为 android 中的视图高度设置动画:-

  1. 高度从 0 到 5
  2. 高度从 5 到 10
  3. 高度从 10 到 3 等

我正在使用下面的代码:-

    public class ShowAnimation extends Animation{
    float finalHeight;
    View imageview;

    public ShowAnimation(View view,float deltaheight){
        this.imageview=view;
        this.finalHeight=deltaheight;
    }

    protected void applyTransformation(float interpolatedtime,Transformation t){
        imageview.getLayoutParams().height=(int)(finalHeight*interpolatedtime);
        imageview.requestLayout();
    }
    @Override
    public void initialize(int width, int height, int parentWidth,
            int parentHeight) {
        super.initialize(width, height, parentWidth, parentHeight);
    }

    @Override
    public boolean willChangeBounds() {
        return true;
    }
    }

并像这样初始化它:-

Animation anidelta = new ShowAnimation(delta, deltaheight);
anidelta.setDuration(500/* animation time */);
delta.startAnimation(anidelta);

但是有了这个我得到以下信息: -

  1. 高度从 0 到 5
  2. 高度从 0 到 10
  3. 高度从 0 到 3

我希望高度从以前的高度而不是每次都从 0 开始动画。有人可以在这里帮助我吗

编辑1:-我这样做了

Animation anidelta = new ShowAnimation(delta, deltaheight);
anidelta.setDuration(500/* animation time */);
anidelta.setFillAfter(true);
delta.startAnimation(anidelta);

但它仍然从 0 动画到新高度。

4

4 回答 4

7

好的,这就是我最终解决它的方法:-

    public class ResizeAnimation extends Animation 
{
   View view;
int startH;
int endH;
int diff;

public ResizeAnimation(View v, int newh)
{
    view = v;
    startH = v.getLayoutParams().height;
    endH = newh;
    diff = endH - startH;
}

@Override
protected void applyTransformation(float interpolatedTime, Transformation t) 
{
    view.getLayoutParams().height = startH + (int)(diff*interpolatedTime);
    view.requestLayout();
}

@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) 
{
    super.initialize(width, height, parentWidth, parentHeight);
}

@Override
public boolean willChangeBounds() 
{
    return true;
}}
于 2012-12-08T17:24:44.403 回答
1

我知道这篇文章已经一年多没有活跃了,但我会发布我认为最简单的动画视图高度的方法。

您可以使用API 级别 11 提供的View.setScaleY API ,而不是声明 Animation 类。

使用它,您可以在所需的秒内指定视图以在 0-1 的范围内缩放(0 表示没有高度,1 表示原始高度)。

在 XML 中,将视图的高度设置为最大高度,然后在膨胀视图时(例如在 Activity#onCreate() 或 Fragment#onViewCreated() 中),您可以

yourView.setScaleY(0);

然后5秒后你可以设置

yourView.setScaleY(0.5f);

这将立即缩放您的视图高度。如果要使用动画缩放视图,例如可以执行以下操作:

yourView.animate().scaleY(0.5f).setDuration(200).start();

我希望它有所帮助。

于 2017-11-23T07:53:50.690 回答
0

您需要一个额外的标志来告诉您的applyTransformation方法是要增加还是减少视图高度。

向构造函数添加一个标志并将该标志保存为实例变量,并使用该标志来决定是增加还是减少视图高度:

public class ShowAnimation {
    // other instance variables
    private boolean increaseHeight;

    public ShowAnimation(View view, float deltaheight, boolean increaseHeight) {
        // other initializations
        this.increaseHeight = increaseHeight;
    }

    protected void applyTransformation(float interpolatedTime, Transformation t) {
        if (increaseHeight)
            imageview.getLayoutParams().height = (int) (finalHeight * interpolatedTime);
        else {
            imageview.getLayoutParams().height = (int) (finalHeight * (1 - interpolatedTime));
        }
        imageview.requestLayout();
    }

}
于 2012-12-07T05:16:50.437 回答
-2

尝试动画集。我不确定这是否是你想要的。

动画 1:高度从 0 到 5
动画 2:高度从 0 到 10
动画 3:高度从 0 到 3

public void applyAnimation(ImageView ivDH) {
    System.out.println("Inside applyAnimation()");
    scaleAnim1 = new ScaleAnimation(0, 5, 0, 5);
    scaleAnim1.setDuration(5000);
    scaleAnim1.setRepeatCount(0);
    scaleAnim1.setInterpolator(new AccelerateDecelerateInterpolator());
    scaleAnim1.setFillAfter(true);

    scaleAnim2 = new ScaleAnimation(-5, 10, -5, 10);
    scaleAnim2.setDuration(5000);
    scaleAnim2.setRepeatCount(0);
    scaleAnim2.setInterpolator(new AccelerateDecelerateInterpolator());
    scaleAnim2.setFillAfter(true);

    scaleAnim3 = new ScaleAnimation(10, 3, 10, 3);
    scaleAnim3.setDuration(5000);
    scaleAnim3.setRepeatCount(0);
    scaleAnim3.setInterpolator(new AccelerateDecelerateInterpolator());
    scaleAnim3.setFillAfter(true);

    AnimationSet animationSet = new AnimationSet(true);
    animationSet.addAnimation(scaleAnim1);
    animationSet.addAnimation(scaleAnim2);
    animationSet.addAnimation(scaleAnim3);
    animationSet.setDuration(15000);
    animationSet.setFillAfter(true);

    ivDH.clearAnimation();
    ivDH.startAnimation(animationSet);
}
于 2012-12-07T05:59:43.813 回答