MoreTextView

可展开和收缩的 TextView,列表也可以使用

使用方法

先在根目录的 build.gradle 下的 repositories 添加:

allprojects {repositories {...maven { url "https://jitpack.io" }}}

然后在 app 目录下的 build.gradle 的 dependencies 添加:

 dependencies {implementation 'com.github.wht007:MoreTextView:1.0'}
属性
<!--能显示的最大行数-->
<attr name="maxUnFoldLines" format="integer" />
<!--动画执行时间-->
<attr name="animDuration" format="integer" />
<!--内容文字颜色-->
<attr name="contentTextColor" format="color" />
<!--内容文字大小-->
<attr name="contentTextSize" format="dimension" />
<!--收起图片-->
<attr name="foldImage" format="reference" />
<!--收起的文字描述-->
<attr name="foldValue" format="string" />
<!--展开图片-->
<attr name="unFoldImage" format="reference" />
<!--展开文字描述-->
<attr name="unFoldValue" format="string" />
<!--收起/展开文字大小-->
<attr name="expandCollapsTextSize" format="dimension" />
<!--收起/展开文字颜色-->
<attr name="expandCollapsTextColor" format="color" />
<!--收起/展开文字居左/居右-->
<attr name="expandCollapsTextGravity"><flag name="left" value="3" /><flag name="right" value="5" />
</attr>
<!--上下箭头图片居左/居右-->
<attr name="imageGrarity"><flag name="left" value="3" /><flag name="right" value="5" />
</attr>
布局文件
<cn.wht.moretextview.MoreTextView
android:id="@+id/item_txt"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="8dp"
app:animDuration="1000"
app:expandCollapsTextColor="@color/colorAccent"
app:contentTextColor="@color/colorPrimaryDark"
app:contentTextSize="14sp"
app:expandCollapsTextGravity="right"
app:foldImage="@mipmap/icon_up"
app:foldValue="收起"
app:imageGrarity="left"
app:layout_constraintTop_toTopOf="parent"
app:maxUnFoldLines="5"
app:unFoldImage="@mipmap/icon_down"
app:unFoldValue="展开" />
核心逻辑
/*** 显示状态(默认收起)*/
private boolean isFold = true;
/**
* 是否有重新绘制(在setText时设置true)
*/private boolean isChange = false;@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {if (!isChange || getVisibility() == View.GONE) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);return;}isChange = false;mFoldTxt.setVisibility(View.GONE);// Measuresuper.onMeasure(widthMeasureSpec, heightMeasureSpec);// 如果内容真实行数小于等于最大行数,不处理if (mContentText.getLineCount() <= mMaxFoldLines) {return;}// 完整显示内容时的真实高度mTextHeightWithMaxLines = getRealTextViewHeight(mContentText);// 如果是收起状态,重新设置最大行数if (isFold) {mContentText.setMaxLines(mMaxFoldLines);}mFoldTxt.setVisibility(View.VISIBLE);super.onMeasure(widthMeasureSpec, heightMeasureSpec);if (isFold) {// 收起时获取除文本之外的高度mContentText.post(new Runnable() {@Overridepublic void run() {mMarginBetweenTxtAndBottom = getHeight() - mContentText.getHeight();}});// 保存收起时的控件总高度mCollapsedHeight = getMeasuredHeight();}}

通过调用setText()方法触发onMeasure方法,然后根据设置文本的实际内容占据的行数,来决定是否显示展开/收起,以及是否记录一些相应的高度方便展开/收起动画使用

/*** 点击事件*/
@Override
public void onClick(View view) {if (mFoldTxt.getVisibility() != View.VISIBLE) {return;}isFold = !isFold;// 修改收起/展开图标、文字setDrawbleAndText();// 保存位置状态if (mCollapsedStatus != null) {mCollapsedStatus.put(mPosition, isFold);}// 执行展开/收起动画mAnimating = true;ValueAnimator valueAnimator;if (isFold) {// 收缩动画, getHeight 获取的是容器总高度   mCollapsedHeight 时最大显示n行时的高度valueAnimator = new ValueAnimator().ofInt(getHeight(), mCollapsedHeight);} else {// 展开动画 getHeight 此时获取的是收起时的总高度 ->展开的最终位置((收起时的总高度+完全显示内容的总高度)-  (收起时的总高度-收取展开控件的高度))// (收起时的总高度+完全显示内容的总高度) 多加了收起时纯文本高度。   最终位置也可以是写成(getHeight()+mTextHeightWithMaxLines-mContentText.getHeight())valueAnimator = new ValueAnimator().ofInt(getHeight(), getHeight() +mTextHeightWithMaxLines - (getHeight() - mFoldTxt.getHeight()));}valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator) {int animatedValue = (int) valueAnimator.getAnimatedValue();mContentText.setMaxHeight(animatedValue - mMarginBetweenTxtAndBottom);getLayoutParams().height = animatedValue;requestLayout();Log.d("addUpdateListener","addUpdateListener");}});valueAnimator.addListener(new Animator.AnimatorListener() {@Overridepublic void onAnimationStart(Animator animator) {}@Overridepublic void onAnimationEnd(Animator animator) {// 动画结束后发送结束的信号mAnimating = false;if (mListener != null) {mListener.onFoldStateChangeListener(mContentText, !isFold);}}@Overridepublic void onAnimationCancel(Animator animator) {}@Overridepublic void onAnimationRepeat(Animator animator) {}});valueAnimator.setDuration(mAnimationDuration);valueAnimator.start();
}

点击事件中有两点需要注意:
1.mCollapsedStatus.put(mPosition, isFold); 此处是当在列表使用时用于记录展开收起的状态
2.展开/收起的高度计算(代码中有详细注释)

用法
  • 普通使用expandableTextView.setText("content");
  • 列表使用expandableTextView.setText("content",item的下标);
github地址
参考ExpandableTextView

Android 文字的收起与展开功能相关推荐

  1. 多行文本收起/展开功能

    多行文本收起/展开功能 参考文档 https://juejin.cn/post/6963904955262435336 http://www.webkaka.com/tutorial/html/202 ...

  2. android 字体跑马灯,Android文字跑马灯功能的实现(自定义跑马灯控件)

    文字跑马灯效果这个功能挺常见的,网上也有很多的介绍,大多是说使用普通的TextView加上几条属性即可实现.不过我在使用时发现并不能实现滚动,可能是因为我的页面中使用到的布局及控件比较复杂,被别的控件 ...

  3. android矩形输入框,Android中实现在矩形框中输入文字显示剩余字数的功能

    虽然这两个功能都比较简单,但是在实际app开发中真的很常见,特别是显示字数或剩余字数这个功能 如下图: 要实现上面的功能,需要做到三点: 1.实现矩形框布局 思路就是矩形框作为整个布局的一个backg ...

  4. android可折叠窗口,Android Studio使用recyclerview实现展开和折叠功能(在之前的微信页面基础之上)...

    Android中RecyclerView点击item展开列表详细内容 效果如下: 依然是xml文件的设计,使用了两个RelativeLayout,zu作为主布局和副布局,里面都加入textview显示 ...

  5. Android 开源项目分类汇总 APP功能汇总

    Android 开源项目第一篇--个性化控件(View)篇   包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.Progr ...

  6. 利用 Android 系统原生 API 实现分享功能

    对于 App 的分享功能,基本上是一个刚需,本文主要介绍运用系统原生分享功能时候需要注意的一些问题.对于某些特定平台的一些高级分享特性,比如微信或者微博之类的分享来源标注,需要在其开放平台注册应用再接 ...

  7. php展开收缩bom表_WordPress实现文章内容收缩和展开功能

    我们经常在浏览有些网站的时候看到内容只展示部分内容,如果需要阅读全文的话需要点击内容按钮才可以展现全部内容.这样的好处就是不至于一次将文字页面全部打开,使得页面不至于一次加载太长.这个功能到底如何实现 ...

  8. android 文字反转_多文字共享信息系统

    欧阳贵林 www.HeZi.net 首发表于2016年03月23日 " 处在信息时代的开端,信息技术不应有特殊的文字性,需要创建多文字共享信息系统,给各国文字一个公平的参与信息与科技创新发展 ...

  9. java小程序显示多种按钮_微信小程序 多行文本显示...+显示更多按钮和收起更多按钮功能...

    看了很多帖子,但是效果都不是很好.还是找微信小程序官方文档,自己写比较方便.自己动手丰衣足食!话不多说,上代码! 先来个效果图 html {{item.text}} 查看更多 收起 wxss .box ...

最新文章

  1. 20159208 《网络攻防实践》第七周学习总结
  2. Android涂鸦技术及刮刮乐示例分析
  3. put the eye care sticker on the neck is relief
  4. LeetCode——16. 3Sum Closest
  5. 数据库选项--ALTER DATABASE WITH 选项
  6. oracle分区表编程,Oracle分区表详解
  7. javascript php 界面,js实现卡片式项目管理界面UI设计效果_javascript技巧
  8. Unity教程之-Unity Attribute的使用总结
  9. Java虚拟机之装载(加载、连接、初始化)
  10. Python version 3.3 required, which was not found in the registry
  11. js引用类型和基本类型、隐式类型转换以及强制类型转换面试题
  12. c语言是非结构化程序语言_1、C语言是一种结构化程序设计语言
  13. 三国历史上最不该被埋没的十大人才!
  14. 阿里天池--宫颈癌检测(基于fastRCNN)新手初次尝试
  15. 退役帖:再见ACM/ICPC!再见算法竞赛!
  16. 暴露在公网环境下主机的安全防护
  17. K-means聚类详解
  18. 计算机测控专业主要课程,大连海事大学测控技术与仪器专业要学哪些课程,好学吗?...
  19. 洛谷 P1118 [USACO06FEB]数字三角形Backward Digit Su…
  20. 十年的成长历程!十年的回顾!

热门文章

  1. JDBC Connection [com.mysql.jdbc.Connection@2bbf4094] will not be managed by Spring 的一个可能错误
  2. 中国第四个南极科考站
  3. 解决C# WPF的xaml突然报错XDG000 标签全不识别
  4. 秉承极简美学设计:Polestar 2 登陆中国后会威胁到谁?
  5. 015:Scrapy获取淘车网十七万二手车数据
  6. 数据结构----二叉树已知先序和中序遍历序列求后序遍历
  7. IOS数据库操作SQLite3使用详解
  8. Java若伊是啥_java运行环境和运行机制
  9. Web应用程序系统的多用户权限控制设计及实现-首页模块【5】
  10. 大学以来到大二的自我评价