在Android原生的TextView的基础上,可收缩/扩展的TextView:PhilExpandableTextView。
实现原理:核心是控制TextView的max lines。在TextView的初始化阶段但尚未绘制出View的时候,使用ViewTreeObserver,监听onPreDraw事件,获取TextView正常显示需要显示的总行数,但只给TextView设置最大运行的行数(小于总行数),从而造成TextView的收缩摘要效果,当用户通过按钮或其他方式扩展时候,把TextView的最大行数设置为正常显示完全的行数+1(+1是保持余量,避免不足)。
public class MainActivity extends Activity {
private String str = "";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
for (int i = 0; i < 200; i++) {
str = str + i + " ";
}
final ExpandableTextView etv = (ExpandableTextView) findViewById(R.id.etv);
etv.setText(str);
Button btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
boolean b = etv.getExpandablestatus();
b = !b;
etv.setExpandable(b);
}
});
}
}
PhilExpandableTextView.java:
package com.ganchuanpu.ExpandableTextView;
import android.content.Context;
import android.util.AttributeSet;
import android.view.ViewTreeObserver;
import android.view.ViewTreeObserver.OnPreDrawListener;
import android.widget.TextView;
import android.widget.Toast;
public class ExpandableTextView extends TextView {
// 最大行,默认显示3行
private final int MAX = 3;
// 完全展开需要的行数
private int lines;
private ExpandableTextView mExpandableTextView;
private boolean expandablestatus = false;
// 构造方法用两个参数的
public ExpandableTextView(Context context, AttributeSet attrs) {
super(context, attrs);
mExpandableTextView = this;
init();
}
private void init() {
// 在view绘制之前的时候执行,在onDraw之前
ViewTreeObserver mViewTreeObserver = this.getViewTreeObserver();
mViewTreeObserver.addOnPreDrawListener(new OnPreDrawListener() {
@Override
public boolean onPreDraw() {
// 避免重复监听
mExpandableTextView.getViewTreeObserver().removeOnPreDrawListener(this);
// 获得内容行数
lines = getLineCount();
return true;
}
});
setExpandable(false);
}
// 是否展开或者收缩,
// true,展开;
// false,不展开
public void setExpandable(boolean isExpand) {
if (isExpand) {
setMaxLines(lines + 1);
} else
setMaxLines(MAX);
expandablestatus = isExpand;
}
public boolean getExpandablestatus() {
return expandablestatus;
}
}
您可能感兴趣的文章:Android中TextView实现分段显示不同颜色的字符串Android中TextView显示圆圈背景或设置圆角的方法Android TextView实现多文本折叠、展开效果Android textview 实现长按自由选择复制功能的方法Android中TextView实现垂直滚动和上下滚动效果Android中使用TextView实现文字跑马灯效果浅析Android TextView常用属性