(转)可收缩、扩展的TextView
在一些应用中,比如腾讯的应用市场APP应用宝,关于某款应用的介绍文字,如果介绍文字过长,那么不是全部展现出来,而是显示三四行的开始部分(摘要),预知全部的内容,用户点击展开按钮即可查阅全部内容。
这样的设计有一定的优越性,毕竟用户的时间有限,注意力和关注力也有限,在使用APP时候,用户需要在最短时间内尽可能快速浏览和查阅到更主要内容,而不是一大堆泛泛而谈的文字内容。
在Android原生的TextView的基础上,我自己写了一个可收缩/扩展的TextView:PhilExpandableTextView。
实现原理:核心是控制TextView的max lines。在TextView的初始化阶段但尚未绘制出View的时候,使用ViewTreeObserver,监听onPreDraw事件,获取TextView正常显示需要显示的总行数,但只给TextView设置最大运行的行数(小于总行数),从而造成TextView的收缩摘要效果,当用户通过按钮或其他方式扩展时候,把TextView的最大行数设置为正常显示完全的行数+1(+1是保持余量,避免不足)。
最终,如图,图1是收缩状态:

图2是当用户点击了Button按钮后展开后的状态:

给出测试及全部源代码。
测试的主Activity MainActivity.java:
package zhangphil.textview; import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button; public class MainActivity extends Activity { private String test_str = ""; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); // 测试的字符串
for (int i = 0; i < 100; i++)
test_str = test_str + " " + i; final PhilExpandableTextView text = (PhilExpandableTextView) findViewById(R.id.text);
text.setText(test_str); Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
boolean b=text.getExpandableStatus();
b=!b;
text.setExpandable(b);
}
});
}
}
MainActivity.java需要的布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="zhangphil.textview.MainActivity" > <zhangphil.textview.PhilExpandableTextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:background="#03a9f4" /> <Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="Button" /> </RelativeLayout>
核心的PhilExpandableTextView.java:
package zhangphil.textview; import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewTreeObserver;
import android.widget.TextView; public class PhilExpandableTextView extends TextView { // 最大的行,默认只显示3行
private final int MAX = 3; // 如果完全伸展需要多少行?
private int lines; private PhilExpandableTextView mPhilTextView; // 标记当前TextView的展开/收缩状态
// true,已经展开
// false,以及收缩
private boolean expandableStatus = false; public PhilExpandableTextView(Context context, AttributeSet attrs) {
super(context, attrs); mPhilTextView = this; init();
} private void init() { // ViewTreeObserver View观察者,在View即将绘制但还未绘制的时候执行的,在onDraw之前
final ViewTreeObserver mViewTreeObserver = this.getViewTreeObserver(); mViewTreeObserver.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { @Override
public boolean onPreDraw() {
// 避免重复监听
mPhilTextView.getViewTreeObserver().removeOnPreDrawListener(this); lines = getLineCount();
// Log.d(this.getClass().getName(), lines+""); return true;
}
}); setExpandable(false); //setEllipsize(TextUtils.TruncateAt.END);
} // 是否展开或者收缩,
// true,展开;
// false,不展开
public void setExpandable(boolean isExpand) {
if (isExpand) {
setMaxLines(lines + 1);
} else
setMaxLines(MAX); expandableStatus = isExpand;
} public boolean getExpandableStatus() {
return expandableStatus;
}
}
本人转载于:http://blog.csdn.net/zhangphil/article/details/50088465

(转)可收缩、扩展的TextView的更多相关文章
- 站在巨人的肩膀上---重新自定义 android- ExpandableListView 收缩类,实现列表的可收缩扩展
距离上次更新博客,时隔略长,诸事繁琐,赶在去广州答辩之前,分享下安卓 android 中的一个 列表收缩 类---ExpandableListView 先上效果图: 如果想直接看实现此页面的代码请下滑 ...
- 用开源项目ExpandableTextView打造可以下拉扩展的TextView
这次还是用开源项目来实现效果,我个人觉得上面的这个效果还是很赞的.于是就记录下如何实现这个效果,其实相当简单.这就是开源项目写的好的例子,整个开源项目的代码十分清晰,逻辑和代码结构都很棒,接入自己的工 ...
- 可伸缩的textview。
在一些应用中,比如腾讯的应用市场APP应用宝,关于某款应用的介绍文字,如果介绍文字过长,那么不是全部展现出来,而是显示三四行的开始部分(摘要),预知全部的内容,用户点击展开按钮即可查阅全部内容. 这样 ...
- Android之——自己定义TextView
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47082241 在这一篇博文中,将向大家介绍怎样以最简单的方式,来自己定义Andro ...
- 用TextPaint来绘制文字
TextPaint是paint的子类,用它可以很方便的进行文字的绘制,一般情况下遇到绘制文字的需求时,我们一般用TextPaint所提供的方法.开始学习如何绘制文字之前,我们必须要先了解下androi ...
- 我的Android 4 学习系列之创建用户基本界面
目录 使用视图和布局 理解Fragment 优化布局 创建分辨率无关的用户界面 扩展.分组.创建和使用视图 使用适配器将数据绑定到视图 使用视图和布局 1. Android UI 几个基本概念 视图: ...
- Android01-布局篇
在Android中,共有五种布局方式,分别是:LinearLayout(线性布局),FrameLayout(帧布局),AbsoluteLayout(绝对布局),RelativeLayout(相对布局) ...
- Android实现ExpandableTextView可扩展TextView
介绍 在应用开发中,总会遇到一些类似于公告,说明等长文本的TextView,但是为了排版美观等因素,我们通常是要隐藏后半部的文本,只显示部分文字,然后在尾部会提供用户一个扩展/收缩的按钮,使得文本框可 ...
- 可收缩的TextView
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=&quo ...
随机推荐
- 查找字符对应Unicode码的十进制数字
//将字符转换为Unicode码中字符对应十进制数字 int byte0 = 'A' & 0xff;//byte0=65 参考文档:http://baike.baidu.com/view/26 ...
- java 输入输出 函数对象构造
/*********************输入输出*******************/ //输入字符串 不包括最后的换行符'\n' import java.io.BufferedRe ...
- springMVC+hibernate构建项目
这几天要用到springMVC+spring+hibernate构建框架,使用的是eclipse今天闲下来把这些记录下来 首先要导入spring 的jar包和hibernate的jar包
- Hessian矩阵
http://baike.baidu.com/link?url=o1ts6Eirjn5mHQCZUHGykiI8tDIdtHHOe6IDXagtcvF9ncOfdDOzT8tmFj41_DEsiUCr ...
- 基本API-StdIn.java
/************************************************************************* * Compilation: javac StdI ...
- 剑指Offer30 从1到n整数出现1的个数
/************************************************************************* > File Name: 30_NumerO ...
- freeCodeCamp:Where art thou
写一个 function,它遍历一个对象数组(第一个参数)并返回一个包含相匹配的属性-值对(第二个参数)的所有对象的数组.如果返回的数组中包含 source 对象的属性-值对,那么此对象的每一个属性- ...
- codevs1011 数的计算 2001年NOIP全国联赛普及组
题目描述 Description 我们要求找出具有下列性质数的个数(包含输入的自然数n): 先输入一个自然数n(n<=1000),然后对此自然数按照如下方法进行处理: 1. 不 ...
- Sql 求比率 类型 影响 结果
- sqlserver关于对列的权限控制
-- 脚本新建登录数据库的用户 USE [master]GOCREATE LOGIN [sa1] WITH PASSWORD=N'123456', DEFAULT_DATABASE=[master], ...