您好我试图在每5秒钟动画一个视图的高度说: -
我使用的代码如下: -
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);
但有了这个,我得到以下内容: -
我希望高度从之前的高度开始动画,而不是每次从0开始。 有人可以帮助我吗
EDIT1: - 我这样做了
Animation anidelta = new ShowAnimation(delta, deltaheight);
anidelta.setDuration(500/* animation time */);
anidelta.setFillAfter(true);
delta.startAnimation(anidelta);
但它仍然从0到新高度动画。
答案 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);
}