还是先描述一下需求,这个在其余的app中应该也经常看见,就是当一个段文字很长的时候,我们往往为了展示的时候节约展示的空间,需要将我们的文字折叠起来,如果用户想看里面的详细内容话,则需要用户去点击一下改控件,然后TextView展开,显示全部的内容。由于我在本次的项目中有这个需求,所以我将其独立成了一个自定义控件,方便在以后的开发中能直接使用。下面是效果图

先来说说大致思路,其实也是很简单的一个控件,首先该控件是继承LinearLayout的,其中的布局文件包括一个TextView和一个下拉三角的ImageView,当用户在单击这个LinearLayout的时候,我会开一个子线程,让改线程睡20ms,睡完后再向主线程中发送一个handler,在主线程中重新设置一下TextView的显示行数,一次循环,直到显示全部内容为止,在折叠起来的时候设计思路也是一样的,当然在该控件中我用了一个isExp来标记该控件是否展开是否折叠。好了,大致的设计思路就是这样,很简单,接下来贴代码了,可以复制粘贴后直接使用

下面是布局文件

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="center_horizontal"android:orientation="vertical" ><TextViewandroid:id="@+id/tvFold"android:layout_width="match_parent"android:layout_height="wrap_content"android:ellipsize="end"android:lineSpacingExtra="5dp"android:textColor="#666666"android:textSize="14sp" /><ImageViewandroid:id="@+id/ivFold"android:layout_width="wrap_content"android:layout_height="wrap_content"android:padding="5dp"android:src="@drawable/company_desc_expansion_icon"android:visibility="gone" /></LinearLayout>

下面是页面处理的逻辑代码

package com.renrui.job.widget;import com.renrui.job.R;import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.view.animation.Animation;
import android.view.animation.RotateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;/*** 可折叠的TextView*/
public class FoldTextView extends LinearLayout
{FoldTextViewHolder mFoldTextViewHolder;View myView;/*** 真实行数*/int realLineCounts = 0;/*** 默认行数*/int defaultLineCounts = 4;/*** 真实高度*/int realHeight = 0;/*** 折叠后的高度*/int foldHeight = 0;boolean isFirstLoad = true;/*** Icon状态 展开动画*/RotateAnimation expIconAnimation;/*** Icon状态 折叠动画*/RotateAnimation foldIconAnimation;/*** 当前是否展开*/boolean isExp = false;/*** 展开TextView*/final int TEXT_OPEN = 1;/*** 关闭TextView*/final int TEXT_CLOSE = 2;Handler mHander = new Handler(){LayoutParams layoutParma;public void handleMessage(android.os.Message msg){int lines = (Integer) msg.obj;switch (msg.what){case TEXT_OPEN:   //打开,增加高度mFoldTextViewHolder.tvFold.setMaxLines(lines);break;case TEXT_CLOSE://关闭,减少高度mFoldTextViewHolder.tvFold.setMaxLines(lines);break;}};};public FoldTextView(Context context){super(context);init();}public FoldTextView(Context context, AttributeSet attrs){super(context, attrs);init();}@TargetApi(Build.VERSION_CODES.HONEYCOMB)public FoldTextView(Context context, AttributeSet attrs, int defStyle){super(context, attrs, defStyle);init();}private void init(){LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);myView = inflater.inflate(R.layout.view_widget_foldtextview, null);this.addView(myView, layoutParams);//设置小箭头展开时的旋转动画expIconAnimation = new RotateAnimation(0f, 180f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);expIconAnimation.setDuration(300);expIconAnimation.setFillAfter(true);//设置小箭头关闭时的旋转动画foldIconAnimation = new RotateAnimation(180f, 0f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);foldIconAnimation.setDuration(300);foldIconAnimation.setFillAfter(true);mFoldTextViewHolder = new FoldTextViewHolder(this);}public void setText(String text){mFoldTextViewHolder.tvFold.setText(text);ViewTreeObserver vto = mFoldTextViewHolder.tvFold.getViewTreeObserver();vto.addOnGlobalLayoutListener(new OnGlobalLayoutListener(){@Overridepublic void onGlobalLayout(){if (!isFirstLoad){return;}//获取真实行数realLineCounts = mFoldTextViewHolder.tvFold.getLineCount();realHeight = mFoldTextViewHolder.tvFold.getMeasuredHeight();//如果真实行数大于默认的显示行数,则默认将其折叠起来  isExp为falseif (realLineCounts > defaultLineCounts){mFoldTextViewHolder.tvFold.setMaxLines(defaultLineCounts);mFoldTextViewHolder.tvFold.measure(0, 0);foldHeight = mFoldTextViewHolder.tvFold.getMeasuredHeight();mFoldTextViewHolder.ivFold.setVisibility(View.VISIBLE);mFoldTextViewHolder.tvFold.setOnClickListener(FoldOnclick);mFoldTextViewHolder.ivFold.setOnClickListener(FoldOnclick);isExp = false;}//如果真实行数小于默认行数,则直接展示出来。isExp为true;else{mFoldTextViewHolder.ivFold.setVisibility(View.GONE);isExp = true;}isFirstLoad = false;}});}View.OnClickListener FoldOnclick = new OnClickListener(){@Overridepublic void onClick(View v){if (isExp){new Thread(new Runnable(){@Overridepublic void run(){int endcount = realLineCounts;while(endcount-- > defaultLineCounts){Message msg = Message.obtain();msg.what = TEXT_CLOSE;msg.obj = endcount;mHander.sendMessage(msg);try{Thread.sleep(20);} catch (InterruptedException e){e.printStackTrace();}}}}).start();mFoldTextViewHolder.ivFold.setAnimation(foldIconAnimation);foldIconAnimation.startNow();isExp = false;} else{new Thread(new Runnable(){@Overridepublic void run(){int startcount = defaultLineCounts;while(startcount++ < realLineCounts){Message msg = Message.obtain();msg.what = TEXT_OPEN;msg.obj = startcount;mHander.sendMessage(msg);try{Thread.sleep(20);} catch (InterruptedException e){e.printStackTrace();}}}}).start();mFoldTextViewHolder.ivFold.setAnimation(expIconAnimation);expIconAnimation.startNow();isExp = true;}}};static class FoldTextViewHolder{TextView tvFold;ImageView ivFold;public FoldTextViewHolder(View v){tvFold = (TextView) v.findViewById(R.id.tvFold);ivFold = (ImageView) v.findViewById(R.id.ivFold);}}
}

好了  以上就是该控件的全部代码了,不多,但是有时候还是挺好用的

PS:由于本人技术有限,如果上面有错误的地方还希望大家指正,感激不尽

Android自定义控件之TextView的展开与折叠相关推荐

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

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

  2. Android Studio使用recyclerview实现展开和折叠(在之前的微信页面基础之上)

    Android Studio使用recyclerview实现展开和缩回(在之前的微信页面基础之上) Android中RecyclerView点击item展开列表详细内容 github源码地址: And ...

  3. Android自定义控件全览(一)

    Android自定义控件总结(一) 目的:收集和整理所有的Android自定义控件 文章目录 Android自定义控件总结(一) 前言 一.面包屑布局(BreadCrumbView) 1.自定义Bre ...

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

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

  5. android自定义伸缩框(展开效果)

    </pre>在android中往往在很多时候用到伸缩框也就是展开效果,或者说是折叠效果,当然在Android中系统也有个类似QQ好友的方式的View "ExpandableLis ...

  6. android里的editText怎么用,Android自定义控件EditText使用详解

    本文实例为大家分享了Android自定义控件EditText的具体代码,供大家参考,具体内容如下 自定义控件分三种: 1. 自绘控件 2. 组合控件 3. 继承控件 代码已上传到 github 以后的 ...

  7. Android自定义控件之流式布局

    效果图: 一.首先创建我 们的自定义流式布局 public class FlowLayoutView extends ViewGroup {public FlowLayoutView(Context ...

  8. Android自定义控件学习(一)-----属性

    Android中XML的命名空间.自定义属性 命名空间(namespace) XML 命名空间提供避免元素命名冲突的方法. 打个比方,A学校有名学生叫做林小明,B学校也有名学生叫林小明,那我们如何识别 ...

  9. android自定义省略号,Android开发自定义TextView省略号样式的方法

    本文实例讲述了Android开发自定义TextView省略号样式的方法.分享给大家供大家参考,具体如下: 在布局xml中设置textView的字段 android:maxLines="2&q ...

  10. Android自定义控件之RecyclerView打造万能ViewPager TabLayout(仿今日头条Tab滑动、Tab多布局、indicator蠕动、自定义indicator、文字颜色渐变)

    文章目录 GitHub:https://github.com/AnJiaoDe/TabLayoutNiubility 该轮子特异功能如下: 使用方法 注意:该轮子适用于androidx中的ViewPa ...

最新文章

  1. linux 内核 出错-HP 方案
  2. 海思osd+freetype+SDL+SDL_ttf编译成功后,Makefile的编写
  3. ejabberd mysql 搭建配置_ejabberd安装步骤+Mysql配置
  4. 骰子的妙用---课堂答题
  5. mysql replication 协议_深入解析MySQL replication协议
  6. Delphi2010 DataSnap 学习(一)
  7. web版本 开源压测工具_标星 1.3K 的 Web 框架压测库,助你更好的选择框架
  8. 中国社交产品十年记...
  9. 【Java多线程编程】选号程序
  10. 新闻标题 静态分页 (无刷新)
  11. 用标准C语言初始化线性表,C语言数据结构-顺序线性表的实现-初始化、销毁、长度、查找、前驱、后继、插入、删除、显示操作...
  12. 零氪科技与诺华达成战略合作 共同打造数字化医疗创新模式
  13. (2006, ‘MySQL server has gone away‘) 原因和解决方案
  14. 若要调试此模块,请将其项目生成配置更改为“调试”模式。若要取消显示此消息,请禁用“启动时若没有用户代码则发出警告”调试器选项。...
  15. 干货 | 携程平台化常态化数据治理之路
  16. 按照姓氏笔画排序数据、按照姓氏拼音排序数据
  17. 深入浅出了解AUTOSAR Adaptive平台
  18. android app 马甲包,关于Android多渠道打包和马甲包问题
  19. 卢卡斯定理扩展卢卡斯
  20. 革新科技的TI+ST+XILINX嵌入式异构多核开发平台教育市场应用

热门文章

  1. hadoop deployment
  2. OTSU大津法对图像二值化
  3. Caused by: java.lang.NumberFormatException: For input string: 18446744073709551615
  4. 06-ICMP: Internet 控制报文协议
  5. 图论画图有力工具 csacadmy app Graph Editor
  6. HDU 1512 Monkey King(左偏树模板题)
  7. mysql connections
  8. 操作系统--存储管理的任务
  9. Eclipse使用之添加字体
  10. python 和 iphone 通过socket传数据注意