动态改变textview的高度。依赖jar:nineoldandroids-2.4.0.jar
效果图:
省份代码:
//1 默认不显示
layout_provices.getLayoutParams().height = 0;
layout_provices.requestLayout();
//2 拿到布局的高
layout_provices.measure(0, 0);
maxHeight1 = layout_provices.getMeasuredHeight();
layout_tv.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//3 创建ValueAnimator对象,这个必须放在监听中,因isOpen = !isOpen是动画执行后才执行的;
if (isOpen) {
animator = ValueAnimator.ofInt(maxHeight1,0);
} else {
animator = ValueAnimator.ofInt(0,maxHeight1);
}
//4 更新布局的监听
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int height = (Integer) valueAnimator.getAnimatedValue();//5拿到实时高度
layout_provices.getLayoutParams().height = height;
layout_provices.requestLayout();//6 更新布局,让布局参数生效
}
});
//执行动画及监听
animator.setDuration(300).addListener(new LayoutTvAnimatorListener());
animator.start();
}
});
class LayoutTvAnimatorListener implements AnimatorListener{
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationEnd(Animator animator) {
isOpen = !isOpen;
}
@Override
public void onAnimationRepeat(Animator animator) {
}
@Override
public void onAnimationStart(Animator animator) {
//旋转图片
ViewPropertyAnimator.animate(iv_arrow).rotationBy(180).setDuration(300).start();
}
}
TextView代码:
/**
* 1 拿到textview的5行时候的高,和内容全部显示的时候的高
* 2 创建ValueAnimator对象,设置value的范围
* 3 给textview设置监听,获取实时高度,更新高度
*/
1 拿到textview的5行时候的高,和内容全部显示的时候的高
当textview的高度大于显示时的高度的时候,方法getMeasuredHeight是拿不到高度的。
只有 textView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() 可以
<span style="white-space:pre"> </span>textView.setMaxLines(5);
textView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
//当父布局完成后调用这个方法
@Override
public void onGlobalLayout() {
textView.getViewTreeObserver().removeGlobalOnLayoutListener(this);//即使移除监听
minHeight = textView.getMeasuredHeight();//getHeight()也可以
//获取textview内容全部显示时候的高,(放在外面无效)
textView.setMaxLines(Integer.MAX_VALUE);
textView.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
textView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
maxHeight = textView.getHeight();
//默认显示5行数据
textView.getLayoutParams().height = minHeight;
textView.requestLayout();
}
});
}
});
2 创建ValueAnimator对象,设置value的范围
3 给textview设置监听,获取实时高度,更新高度
textView.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ValueAnimator animator = null;
if (isOpen2) {//设置value的变化范围
animator = ValueAnimator.ofInt(maxHeight,minHeight);
} else {
animator = ValueAnimator.ofInt(minHeight,maxHeight);
}
//给animator设置监听,实时的获取变化中的高度,把高赋值给textview
animator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int value = (Integer) valueAnimator.getAnimatedValue();
textView.getLayoutParams().height = value;
textView.requestLayout();
}
});
animator.setDuration(300).addListener(new TvAnimatorListener());
animator.start();
}
});
class TvAnimatorListener implements AnimatorListener{
@Override
public void onAnimationCancel(Animator animator) {
}
@Override
public void onAnimationEnd(Animator animator) {
isOpen2 = !isOpen2;
}
@Override
public void onAnimationRepeat(Animator animator) {
}
@Override
public void onAnimationStart(Animator animator) {
}
}
代码:http://download.csdn.net/detail/ss1168805219/9489604