Android 仿微信微博的展开全文功能

1,577 阅读5分钟
原文链接: mp.weixin.qq.com

点击上方蓝字关注码个蛋

微信、微博都在用

  作者:r17171709

  博客:http://www.jianshu.com/u/470afcb80dc2

文章目录

  • 定义相关基本属性

  • 测量

  • 点击效果

  • 使用

  • 动画效果

  • 动画参数的初始化

  • 点击切换

  • 复用问题

可折叠的textview是一个很常见的功能,相信大家都在微信朋友圈体验过这种场景:朋友发的笑话都只有半截,下面是一片白色,你要展开全文之后才能知道最后结果。

其实这也不是什么高大上的东西,网上也有现成的例子,但是使用起来还是得稍微调整一下,最牛逼的应该就是Manabu-GT的ExpandableTextView(https://github.com/Manabu-GT/ExpandableTextView)。那么我们通过对它的学习,自己来撸一发

项目已经发布在github(https://github.com/r17171709/android_demo/tree/master/ExpandableTextView)上

新浪微博

我们先实现一个基本功能,能点击收放就行了,其他效果先不管

0

定义相关基本属性

仔细看下上图,其实这个自定义的控件也就由两部分组成,一个是正常的显示文本部分,另外一个是收放的按钮,因此我们可以通过组合布局的形式来实现

首先写死id,这是因为我们要在组合布局里面操作这2个TextView,所以最简单的途径就是直接拿到这2个对象进行使用

然后是自定义属性的设计

剩下就是很传统的初始化

OK,大家都会的说完了,下面开始分逻辑一一说明

1

测量

onMeasure想必不用多说了,他是负责对ViewGroup进行测量,用来把握整体ViewGroup的大小。那么我们这里就可以利用这个方法来对组合布局收放的大小进行控制

首先,如果你在两次setText之间没有发生文本变化,或者这个组合布局本身都不显示,那么我们果断的终止计算操作,因为这个计算过程是没有意义的

完成上述的判断之后,我们就开始真正的去实现收起一个textview的功能了

如果文本行数不满足收起展开的最小行数,那么终止,而以初始的状态展现在我们的眼前

默认我们是设置成收起状态的,在收起状态时,我们设置当前行数为最大可显示行数,并且按钮显示出来

测量部分就结束了。记住这里又一个关键点,每次UI的变化,都需要我们去重新测量,不然最终获取出来的数据就会有问题

2

点击效果

无非就是收放的切换

3

使用

不带动画效果的收放功能

4

动画效果

基本功能我们是完成了,但是不能仅仅满足这一点点。通过点击进行过渡切换,这样的效果体验上肯定会更好一些

继续添加我们的自定义属性,这里我们添加的是动画执行时间

默认为500ms

5

动画参数的初始化

既然涉及到高度的变化,那么我们就必须要知道收起与展开2个不同状态下的高度值,因为动画变化区间就在这2个值范围内。展开状态下的高度就是设置maxLines为Integer.Max时候ViewGroup的高度,收起状态下的高度就是设置了maxExpandLines值之后的ViewGroup的高度

获取文本的高度

收起之后的高度,这个需要等ViewGroup渲染完成之后才能真正获取到。这里lastHeight指的是总高度减去文本部分的高度,也就是收放按钮所占区域高度

那么很明显,ViewGroup完全展开后的高度为realTextViewHeigt+lastHeight,完全收起时候的高度为collapsedHeight。整个收放的过程由于没有文字的变化,所以并没有进行相关计算,只是单纯的修改高度而已

6

点击切换

点击切换部分主要是动画的操作

当然,为了在动画的执行过程中防止再次点击到切换按钮,可以这样直接拦截点击事件

带动画效果的收放功能

7

复用问题

刚才看到的都是普通场景下的使用,这个一般不会有什么问题。但是一旦牵扯到列表复用,问题就又乱七八糟的出现了,比如之前展开的收起来了,但是底部文字没有变化之类的。其实解决这个问题也很简单,只要我们每次记录当前收放状态并且每次复用的时候重新去设置一遍就行了

来看一些列表的实体bean,主要就是文字与状态2个变量

对刚才的ViewGroup添加一个状态变化的回调接口,这样在点击部分可以通过回调传给adapter中的数据源,这里就不再对setOnClickListener进行赘述了

最后是一个关键的地方,我们扩展一下之前的setText()方法。我们需要将收放状态再次带入,同时还有一个关键的地方,将高度重置

来看看最终效果

列表中的使用

留言有福利,具体规则请看

帮你养成好习惯