final View v = getTheViewToAnimateHere();
Animation anim=new Animation(){
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
// Do relevant calculations here using the interpolatedTime that runs from 0 to 1
v.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, (int)(30*interpolatedTime)));
}};
anim.setDuration(500);
v.startAnimation(anim);
15
我已经使用这两个功能来平滑地隐藏和显示具有过渡动画的视图 .
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void expand(final View v, int duration, int targetHeight, final int position) {
int prevHeight = v.getHeight();
v.setVisibility(View.VISIBLE);
ValueAnimator valueAnimator = ValueAnimator.ofInt(0, targetHeight);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
v.getLayoutParams().height = (int) animation.getAnimatedValue();
v.requestLayout();
}
});
valueAnimator.setInterpolator(new DecelerateInterpolator());
valueAnimator.setDuration(duration);
valueAnimator.start();
valueAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
v.clearAnimation();
}
});
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
public void collapse(final View v, int duration, int targetHeight, final int position) {
if (position == (data.size() - 1)) {
return;
}
int prevHeight = v.getHeight();
ValueAnimator valueAnimator = ValueAnimator.ofInt(prevHeight, targetHeight);
valueAnimator.setInterpolator(new DecelerateInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
v.getLayoutParams().height = (int) animation.getAnimatedValue();
v.requestLayout();
}
});
valueAnimator.setInterpolator(new DecelerateInterpolator());
valueAnimator.setDuration(duration);
valueAnimator.start();
valueAnimator.addListener(new AnimatorListenerAdapter() {
@Override
public void onAnimationEnd(Animator animation) {
animBoolArray.put(position, false);
v.clearAnimation();
}
});
}
RelativeLayout relParam=new RelativeLayout.LayoutParam(RelativeLayout.LayoutParam.FILL_PARENT,RelativeLayout.LayoutParam.WRAP_CONTENT); //you can give hard coded width and height here in (width,height) format.
relParam.topMargin=-50; //any number that work.Set it to 0, when you want to show it.
view.setLayoutParams(relparam);
int heigth=0;
boolean showing=false;
LinearLayout layout = (LinearLayout) view.findViewById(R.id.layout);
proDetailsLL.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
// gets called after layout has been done but before display
// so we can get the height then hide the view
proHeight = proDetailsLL.getHeight(); // Ahaha! Gotcha
proDetailsLL.getViewTreeObserver().removeGlobalOnLayoutListener(this);
proDetailsLL.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, 0));
}
});
/**
* Method to slide in out the layout
*
* @param isShowing
* if the layout is showing
* @param height
* the height to slide
* @param slideLL
* the container to show
*/
private void slideInOutAnimation(boolean isShowing, int height, final LinearLayout slideLL, final ImageView arroIV) {
if (!isShowing) {
Animation animIn = new Animation() {
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
// Do relevant calculations here using the interpolatedTime that runs from 0 to 1
slideLL.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, (int) (heigth * interpolatedTime)));
}
};
animIn.setDuration(500);
slideLL.startAnimation(animIn);
} else {
Animation animOut = new Animation() {
protected void applyTransformation(float interpolatedTime, Transformation t) {
super.applyTransformation(interpolatedTime, t);
// Do relevant calculations here using the interpolatedTime that runs from 0 to 1
slideLL.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,
(int) (heigth * (1 - interpolatedTime))));
}
};
animOut.setDuration(500);
slideLL.startAnimation(animOut);
}
}
9 回答
在父布局中设置属性
android:animateLayoutChanges="true"
.如果视图不是,则将视图放在布局中,并为该布局设置
android:animateLayoutChanges="true"
.注意:这仅适用于API Level 11(Android 3.0)
我为
RelativeLayout
创建了一个扩展,用于显示/隐藏带有动画的布局 . 它可以扩展任何类型的View
以获得这些功能 .您可以使用
overrideDefaultInAnimation
和overrideDefaultOutAnimation
覆盖原始Animation
我的原始动画是fadeIn / Out,我正在添加XML动画文件用于翻译进出屏幕(翻译到顶部和从顶部)
in_animation.xml:
out_animation.xml:
这可以在API 12及更高版本的单行声明中合理地实现 . 下面是一个示例,其中
v
是您要设置动画的视图;这将使有问题的
View
向左滑动1000px . 要将视图滑回UI,我们可以简单地执行以下操作 .我希望有人觉得这很有用 .
如果您只想为视图的高度设置动画(从0到某个数字),您可以实现自己的动画:
我已经使用这两个功能来平滑地隐藏和显示具有过渡动画的视图 .
也许你正在寻找的是SlidingDrawer .
尝试使用TranslateAnimation类,它为位置更改创建动画 . 试着阅读这个求助 - http://developer.android.com/reference/android/view/animation/TranslateAnimation.html
更新:以下是此示例 . 如果视图的高度为50,则在隐藏模式下,您只想显示10像素 . 示例代码将是 -
PS:有很多或其他方法可以帮助您根据需要使用动画 . 如果要完全自定义代码,还可以查看RelativeLayout.LayoutParams,但使用TranslateAnimation更容易使用 .
EDIT:-Complex version using LayoutParams
此示例代码假定您将视图放在RelativeLayout中,如果不更改Layout的名称,则其他布局可能不起作用 . 如果要对它们赋予动画效果,请缓慢减少或增加topMargin . 您也可以考虑使用Thread.sleep() .
试试这个 .
首先获取想要查看的视图的高度,并在视图显示时设置一个布尔值来保存:
然后调用显示方法隐藏视图,并更改布尔值:
方法: