场景:描述性文字很多的时候,需要隐藏一部分,点击展示全部时全部显示,在这里我提供一种最简单的方式,因为简单,所以用户体验不是很好,后面再说改进版。
/**
* 控制超过两行的文字隐藏和显示
*@param textView 需要进行此项操作的 textView
*/
private void setOpenOrCloseText(TextView textView) {
if (!flag) { // 展开
textView.setMaxLines(Integer.MAX_VALUE);
mArrow.setImageResource(R.drawable.arrow_up);
flag = true;
} else { //关闭
textView.setMaxLines(2); //最少需要显示的行数
mArrow.setImageResource(R.drawable.arrow_down);
flag = false;
}
}
TextView初始行数可以自行在XML文件lines属性定义。定义一个布尔类型的flag记录当前是展开还是关闭状态,关闭状态点击设置TextView的MaxLines属性,这里的参数是Integer.MAX_VALUE,但是MaxLines属性最终是以实际行数为准。
前面已经说了这是最简单的方式,并且只能针对TextView,用户体验会不好,因为当你一点击展开的时候,剩余的一下就弹出来了,没有过渡,所以感觉会很突兀。只是简单实现这种需求的可以采用此方法。
下面说说用户体验好的方式,适用范围也更广,可以是单独的view,也可以是ViewGroup。使用值动画进行伸缩。
在这里我就讲讲原理吧,代码什么的都不重要,不然也是复制粘贴,还是自己写写的好。
同样也需要一个布尔类型的值记录当前的状态,根据不同的状态获得不同的初始高度和目标高度。以展开为例,初始高度是你想要从什么地方开始展开,目标高度是你想要展开到什么地方,这里提一点,如果你想展开到控件原始的高度,直接获取是做不到的,需要测量该控件的高度,核心方法是
View.MeasureSpec.makeMeasureSpec(int size,int mode) //用此方法得到控件的测量模式
view.measure(int widthMeasureSpec,int heightMeasureSpec) //用此方法对控件进行测量 view为需要进行测量的控件对象
经过这两个方法后就可以获得控件的实际高度了。
获得高度后使用值动画的 ValueAnimator.ofInt(startHeight,targetHeight); //这个方法就是返回的从startHeight展开或者隐藏到targetHeight的值动画对象。
对值动画设置更新监听,产生一个回调,回调方法里的对象里包含了动画执行时间高度值的变化,将此值以LayoutParams的方式设置给控件。
最后设置值动画执行时间,就完成了控件平滑伸缩的效果。