写在前面
由于项目需要,需要实现展示固定文本行数且可以展开和收起多余部分。所以这里通过实现自定义Textview来达到产品和交互预期
效果图
功能
- 支持设置展开折叠点击文本
- 展开折叠始终在右下角
- 支持设置XML设置颜色
- 支持自定义默认显示行数
代码
package com.test.plx.views;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.text.Layout;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.text.TextUtils;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
import rk.plx.android.R;
/**
* Created by plx on 17/11/12.
*/
public class FolderTextView extends TextView {
// TAG
private static final String TAG = "FolderTextView";
// 默认打点文字
private static final String DEFAULT_ELLIPSIZE = "...";
// 默认收起文字
private static final String DEFAULT_FOLD_TEXT = "[收起]";
// 默认展开文字
private static final String DEFAULT_UNFOLD_TEXT = "[查看全部]";
// 默认固定行数
private static final int DEFAULT_FOLD_LINE = 2;
// 默认收起和展开文字颜色
private static final int DEFAULT_TAIL_TEXT_COLOR = Color.GRAY;
// 默认是否可以再次收起
private static final boolean DEFAULT_CAN_FOLD_AGAIN = true;
// 收起文字
private String mFoldText;
// 展开文字
private String mUnFoldText;
// 固定行数
private int mFoldLine;
// 尾部文字颜色
private int mTailColor;
// 是否可以再次收起
private boolean mCanFoldAgain = false;
// 收缩状态
private boolean mIsFold = false;
// 绘制,防止重复进行绘制
private boolean mHasDrawn = false;
// 内部绘制
private boolean mIsInner = false;
// 全文本
private CharSequence mFullText;
// 行间距倍数
private float mLineSpacingMultiplier = 1.0f;
// 行间距额外像素
private float mLineSpacingExtra = 0.0f;
// 统计使用二分法裁剪源文本的次数
private int mCountBinary = 0;
// 统计使用备用方法裁剪源文本的次数
private int mCountBackUp = 0;
// 统计onDraw调用的次数
private int mCountOnDraw = 0;
// 点击处理
private ClickableSpan clickSpan = new ClickableSpan() {
@Override
public void onClick(View widget) {
mIsFold = !mIsFold;
mHasDrawn = false;
invalidate();
}
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(mTailColor);
}
};
/**
* 构造
*
* @param context 上下文
*/
public FolderTextView