android点击展开textview,《Android APP可能有的东西》之UI篇:展开TextView全文

前言

就像朋友圈里面那样的点击查看全文效果,很有可能是在项目中也会遇到。这里给出不实用自定义控件的方法,原理很简单,代码量也不大,可以直接复制粘贴到自己的项目......

上效果图

7b2d11131f2c

我是图

看起来十分美好,但是往下看说明。

上说明

布局部分省略,就是一个线性布局里面两个textview,一个显示内容,一个显示那个作文按钮的提示。

思路是这样:提前计算要显示的文字内容,模拟一个相同的textview放到布局中,让它只显示一定的行数,这里为两行,然后计算出这个两行的高度,这就是真正TextView的一开始出现时需要被展开的高度。然后计算出完全显示时需要多少高度,记录这个值,最后展开的时候就能把内容完全展示出来了。

以下为获取只显示两行时的高度代码:

private int getShortHeight() {//虚拟一个tv来获得理论高度值,短文高度

int width = mTextView.getMeasuredWidth();//宽度

TextView textView = new TextView(this);

textView.setText(R.string.str);

textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);

textView.setMaxLines(mMaxlines);

int measureSpecWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);//宽度match

int measureSpecHeight = View.MeasureSpec.makeMeasureSpec(1920, View.MeasureSpec.AT_MOST);//高度wrap,1920为最大高度

textView.measure(measureSpecWidth, measureSpecHeight);

return textView.getMeasuredHeight();

}

本来以为可以仿照出获取完整文本的高度,理论上是去掉:textView.setMaxLines(mMaxlines);

就可以,但是,获取到的一直是1920的具体值,这个地方我查了很多地方都说应该是自适应内容的高度,这里我表示需要大神ಥ_ಥ

但是问题还是得解决哇,换思路,能拿到最小的那个高度,自己设置了行数,所以每一行的高度我是知道的,所以我只需要知道文本完全显示时需要占多少行就行了。

兴高采烈的去getLineCount();,表示得到饿结果为0,好吧,异步来一次:

mTextView.post(new Runnable() {

@Override

public void run() {

maxLine = mTextView.getLineCount();//获取完全显示饿行数

mLongHeight = getLongHeight();//获取完全显示需要的高度

Log.d("MainActivity", "长的" + mLongHeight + ",短的=" + mShortHeight);

if (mLongHeight <= mShortHeight) {

mTextViewToggle.setVisibility(View.GONE);//完全显示需要的高度小于低的高度的时候,不需要展开

}

}

});

完整文本的高度总算是拿到了,其余细节不多说,然后就设置动画了,代码可以直接拷贝了:

private void toggle() {

ValueAnimator animator;

if (isOpen) {

animator = ValueAnimator.ofInt(mLongHeight, mShortHeight);

isOpen = false;

} else {

animator = ValueAnimator.ofInt(mShortHeight, mLongHeight);

isOpen = true;

}

animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {

@Override

public void onAnimationUpdate(ValueAnimator valueAnimator) {

Integer value = (Integer) valueAnimator.getAnimatedValue();

mLayoutParams.height = value;

mTextView.setLayoutParams(mLayoutParams);

}

});

animator.addListener(new Animator.AnimatorListener() {

@Override

public void onAnimationStart(Animator animator) {

}

@Override

public void onAnimationEnd(Animator animator) {

if (isOpen) {

mTextViewToggle.setText("收起全文");

} else {

mTextViewToggle.setText("展开全文");

}

}

@Override

public void onAnimationCancel(Animator animator) {

}

@Override

public void onAnimationRepeat(Animator animator) {

}

});

animator.setDuration(500);

animator.start();

}

最后

测量高度的时候直接填充了需要的内容,实际项目中这个内容应该也是能拿到然后替换的吧,这里问题不大。

没有使用自定义控件的原因是觉得好像没必要,所以就直接写了,完整的代码查看Demo,不过github上面还是有几个不错的类似自定义控件的,github关键词ExpandTextView,各位小伙伴酌情使用哇~

《UI篇》拓展阅读:

对了,效果图里面的后文:

7b2d11131f2c

1

7b2d11131f2c

2

7b2d11131f2c

3

7b2d11131f2c

4

7b2d11131f2c

5

7b2d11131f2c

6

本文作者:paradoxie

个人主页:谢盒盒的小黑屋,不止说技术

简书地址:简书主页,专注技术类

github地址:paradoxie

转载请注明出处,蟹蟹!

-------我的梦想真的是做一条咸鱼!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值