动画视图android的高度

时间:2012-12-07 05:07:17

标签: android android-animation

您好我试图在每5秒钟动画一个视图的高度说: -

  1. 身高从0到5
  2. 身高从5到10
  3. 身高从10变为3等
  4. 我使用的代码如下: -

        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
    4. 我希望高度从之前的高度开始动画,而不是每次从0开始。 有人可以帮助我吗

      EDIT1: - 我这样做了

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

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

4 个答案:

答案 0 :(得分: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;
}}

答案 1 :(得分: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();
    }

}

答案 2 :(得分:0)

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

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

使用此功能,您可以在所需的秒数内指定视图以在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();

我希望它有所帮助。

答案 3 :(得分:-1)

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

动画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);
}