Reputation: 8486
Hi I am trying to animate the height of a view in android say every 5 seconds :-
I am using the code below :-
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;
}
}
and initialize it like this:-
Animation anidelta = new ShowAnimation(delta, deltaheight);
anidelta.setDuration(500/* animation time */);
delta.startAnimation(anidelta);
But with this i get the below:-
i want the height to be animated from its previous height rather than from 0 everytime. Can someone please help me here
Edit1:- I did this
Animation anidelta = new ShowAnimation(delta, deltaheight);
anidelta.setDuration(500/* animation time */);
anidelta.setFillAfter(true);
delta.startAnimation(anidelta);
But it still animates from 0 to the newheight.
Upvotes: 3
Views: 7668
Reputation: 1175
I know this post has not been active for over a year but I will post what I think is the easiest way to animate view's height anyway.
Instead of declaring Animation class, you could use View.setScaleY API available from API level 11.
Using this, you can specify view to scale within the range from 0-1 (0 means no height and 1 means original height) in desired second.
In XML set your view's height to its maximum height, then when inflating the view (e.g. in Activity#onCreate() or Fragment#onViewCreated()) you can
yourView.setScaleY(0);
Then after 5 seconds you can set
yourView.setScaleY(0.5f);
This will scale your view's height instantly. If you want to scale the view with animation, you can for example do something like this:
yourView.animate().scaleY(0.5f).setDuration(200).start();
I hope it helps.
Upvotes: 0
Reputation: 28823
Try animation set. I am not sure whether this is what you want.
Animation 1 for : height goes from 0 to 5
Animation 2 for : height goes from 0 to 10
Animation 3 for : height goes from 0 to 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);
}
Upvotes: -2
Reputation: 8486
Ok so this is how I finally solved it:-
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;
}}
Upvotes: 8
Reputation: 12148
You need an extra flag to tell your applyTransformation
method whether you want to increase or decrease the view height.
Add a flag to the constructor and save that flag as an instance variable, and use that flag to decide whether to increase or decrease the view height:
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();
}
}
Upvotes: 0