第三方开源库:nineoldandroid:ValueAnimator 动态设置textview的高

动态改变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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值