小需求:默认展示4行,超过4行出现“查看全部”,点击则加载浮层显示完整内容;

实现是参考下面网址代码,但是有一些改动(主要涉及纯引英文的文本下面网址的代码可能有些问题)

https://www.jianshu.com/p/f4f99eb932d4

最终显示代码如下:

import android.content.Context
import android.graphics.Color
import android.support.v7.widget.AppCompatTextView
import android.text.Spannable
import android.text.SpannableStringBuilder
import android.text.TextPaint
import android.text.TextUtils
import android.text.method.LinkMovementMethod
import android.text.style.ClickableSpan
import android.util.AttributeSet
import android.view.View
import android.widget.Toast/*** @date: 2020.02.25*/
class FoldTextView : AppCompatTextView {private var isSupportFold = falseprivate var clickCallback: TextClickCallback? = nullprivate var isNeedEllipsis = trueconstructor(context: Context) : this(context, null) {}constructor(context: Context, attrs: AttributeSet?) : this(context, attrs, 0) {}constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context, attrs, defStyleAttr) {val ta = context.obtainStyledAttributes(attrs, R.styleable.PayFoldTextView)isSupportFold = ta.getBoolean(R.styleable.FoldTextView_supportFold, false)}override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)if (isSupportFold) {//获取当前的行数val lineCount = lineCountval layout = layoutval maxLines = maxLinesif (maxLines == 0 || lineCount < maxLines || TextUtils.isEmpty(text)) {return}val totalChars = layout.getLineEnd(maxLines - 1)val lastLineStartIndex = layout.getLineStart(maxLines - 1)if (totalChars >= text.length) {return}val mustShowText = text.subSequence(0, lastLineStartIndex)val tailWidth = paint.measureText(TAIL_TEXT)var lastLineText: CharSequenceif (LINE_BREAKER == text[totalChars - 1].toString()) {lastLineText = text.subSequence(lastLineStartIndex, totalChars - 1)} else {lastLineText = text.subSequence(lastLineStartIndex, totalChars)}val maxWidth = measuredWidth.toFloat()val ellipsizeLastLineText = TextUtils.ellipsize(lastLineText, paint, maxWidth - tailWidth,TextUtils.TruncateAt.END)if (ellipsizeLastLineText.length > 2 && ellipsizeLastLineText != lastLineText) {lastLineText = ellipsizeLastLineText.subSequence(0, ellipsizeLastLineText.length - 1)isNeedEllipsis = true} else {isNeedEllipsis = false}val spannableStringBuilder = SpannableStringBuilder(mustShowText)if (!mustShowText.endsWith("\n")) {spannableStringBuilder.append(LINE_BREAKER)}spannableStringBuilder.append(lastLineText)if (isNeedEllipsis) {spannableStringBuilder.append("...")spannableStringBuilder.append(TAIL_SEPARATOR)} else {spannableStringBuilder.append(TAIL_SEPARATOR_O)}spannableStringBuilder.append(buildClickText())//重新设置文本movementMethod = LinkMovementMethod.getInstance()highlightColor = Color.TRANSPARENT //设置点击后的颜色为透明super.setText(spannableStringBuilder)}}companion object {val LINE_BREAKER = "\n"val TAIL_TEXT = "...查看全部"val TAIL_SEPARATOR = "    "val TAIL_SEPARATOR_O = " "val TAIL_TEXT_WITHOUT_ELLIPSIS = "查看全部"}fun setClickCallback(clickCallback: TextClickCallback?) {this.clickCallback = clickCallback}private fun buildClickText(): SpannableStringBuilder {val spannableString =SpannableStringBuilder(TAIL_TEXT_WITHOUT_ELLIPSIS)val clickableSpan = object : ClickableSpan() {override fun onClick(widget: View) {clickCallback?.respondClick()}override fun updateDrawState(ds: TextPaint) {super.updateDrawState(ds)ds.color = resources.getColor(R.color.pay_color_0086f6)ds.isUnderlineText = false}}spannableString.setSpan(clickableSpan, 0, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)return spannableString}fun setSupportFold(isSupport: Boolean = false) {isSupportFold = isSupportmaxLines = Integer.MAX_VALUE}
}
<declare-styleable name="FoldTextView"><attr name="supportFold" format="boolean"/>
</declare-styleable>

相关注释:

supportFold:是否需要支持文本折叠。

buildClickText()方法主要是给查看全部添加点击事件以及相关样式。

下面代码是:指定Paint属性的宽度下的文本是否与原始文本相同,不相同则需要显示省略号及查看全部。

 if (ellipsizeLastLineText.length > 2 && ellipsizeLastLineText != lastLineText) {lastLineText = ellipsizeLastLineText.subSequence(0, ellipsizeLastLineText.length - 1)isNeedEllipsis = true} else {isNeedEllipsis = false}

ellipsize方法需要的相关参数:

text:原始的文本内容 paint:canvas用到的画笔 avail:画布能提供的宽度 where:枚举类型,就是 省略号显示的位置

/*** Returns the original text if it fits in the specified width* given the properties of the specified Paint,* or, if it does not fit, a truncated* copy with ellipsis character added at the specified edge or center.*/
public static CharSequence ellipsize(CharSequence text,TextPaint p,float avail, TruncateAt where) {return ellipsize(text, p, avail, where, false, null);
}

下面的代码加上"\n"是因为在英文条件下,最后一行的文字可能会显示到倒数第二行,所以强制加上换行符。

  val spannableStringBuilder = SpannableStringBuilder(mustShowText)if (!mustShowText.endsWith("\n")) {spannableStringBuilder.append(LINE_BREAKER)}

Android实现文本折叠效果相关推荐

  1. Android TextView 文本折叠效果

    最近项目中要实现文本展开收起的效果,即默认只显示4行文字,如果textview文字超过4行的话,点击右下角的 更多 按钮即可查看全部的内容.之前的做法是根据 TextView 中的字数来判断,效果不太 ...

  2. android窗帘拉开动画,Android 窗帘(Curtain Menu)效果五之应用场景和使用方法

    Awesome Drawer Introduction 实现Android窗帘拉开折叠效果 Usage xml布局文件使用 xmlns:android="http://schemas.and ...

  3. android 折叠式布局,Android卡片式折叠交互效果

    原标题:Android卡片式折叠交互效果 近日有报道称:在互联网共享单车最早起步的上海,目前有150万辆共享单车.迅猛的增速之下,上海市交通委紧急叫停,成为继杭州.广州等城市之后,国内又一个暂停新增投 ...

  4. android新特性:使用CollapsingToolbarLayout实现折叠效果及问题解决

    CollapsingToolbarLayout作用是提供了一个可以折叠的Toolbar,它继承至FrameLayout,给它设置layout_scrollFlags就可以实现折叠效果! 效果展示: 引 ...

  5. android 实现控件搜索折叠效果 Animation动画折叠和普通折叠

    android 实现控件搜索折叠效果 Animation动画折叠和普通控件直接折叠效果: 原理很简单,都是获取对应的高度,通过实现高度变化而改变显示效果: 话不多说直接上代码 1.普通折叠效果,以下是 ...

  6. android 头部折叠,Android 头像折叠效果

    一.前言: 我们在开发中,经常遇到头像折叠效果,特别是直播软件,以前都是写死的,太Low了,今天用recycleView实现头像折叠效果: 效果图.png 1.项目依赖: //recyclerview ...

  7. jQuery 文本段落展开和折叠效果

    找了几个感觉这个效果是最好的,最简单的. jQuery 文本段落展开和折叠效果 <!DOCTYPE html> <head> <meta http-equiv=" ...

  8. Android仿掌上英雄联盟首页,实现折叠效果

    不单单是掌上英雄联盟,像微博发现页也用了这样的布局,当滑动到一定距离的时候,自动隐藏轮播图,或者标题栏下面的布局.并且使tablayout置顶. 与之相似的还有简书的个人页面也是这样的布局. 图片处理 ...

  9. android 百叶窗动画,Android 百叶窗折叠效果

    blinds.png 其实这个标题的类比并不太准确,百叶窗高度是固定的,只是 Z 轴有旋转.折叠效果并没有体现出来.不过毕竟自己一开始想到这个名字,那就硬着头皮也要叫这名字啦. 缘由 在微信的「聊天信 ...

  10. Android RecyclerView点击展开、折叠效果的实现方式

    实现效果 思路 我使用的是第三方适配器BaseRecyclerViewAdapterHelper 但是遇到一个问题 这个适配器2.0和3.0不兼容 而2.0版本 没有折叠效果这个组件 我用3.0版本 ...

最新文章

  1. TCP/UDP对比总结
  2. linux shell命令设置内存大小运行jar文件
  3. Java实战之04JavaWeb-02Request和Response
  4. 数据结构----------实现最小堆排序
  5. Android第四十五天
  6. 自己动手写Docker系列 -- 5.5实现容器停止
  7. 数据异常值分析和处理
  8. linux磁盘空间满如何清理,linux磁盘空间不足怎么办,磁盘清理方法
  9. 数据仓库多维数据模型设计
  10. 智能指针的标准之争:Boost vs. Loki (转)
  11. Linux: 李纳斯·托沃兹(Linus Torvalds): “使用KDE”(转)
  12. ARPG游戏设计制作随笔
  13. arcgis栅格计算器:将栅格图层指定值设置为Nodata及栅格图层求交
  14. 2022世界杯期间,独立站卖家如何借势营销?
  15. 国产DSP,32位双核CPU,pin2pin替代TMS320F280049C,高频400MHz
  16. 二进制空间权重矩阵_白话空间统计之二十五:空间权重矩阵(三)解构空间权重矩阵...
  17. 传奇Newoupui-pak配置失败怎么处理?
  18. MATLAB相干成像系统,光学成像系统的模型及MATLAB仿真
  19. 大众点评超详细爬虫系列2
  20. 5个小技巧 教你在家里如何给花儿拍“写真”

热门文章

  1. 基于AES的图像加密
  2. VS QT进行相机镜头控制软件二次开发
  3. JAVA - Quartz 定时任务_启动原理
  4. Ubuntu 20.04 LTS 修改IP地址
  5. Dwg TrueView 2018中文版
  6. 若依源码学习7:Excel 导入导出
  7. xshell怎么上传文件
  8. 加密音乐文件MGG/NCM转MP3
  9. 获赞36w,小红书近期的流行趋势是什么?
  10. 计算机专业如何高质量的走完大学四年?毕业成为Offer收割机