本文共 3762 字,大约阅读时间需要 12 分钟。
动态改变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() 可以
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