1.效果图
2.文本颜色等属性设置(在Values文件夹下创建attrs.xml文件)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="FolderTextView">
<attr name="foldText" format="string"/>
<attr name="unFoldText" format="string"/>
<attr name="foldLine" format="integer"/>
<attr name="tailTextColor" format="color"/>
<attr name="canFoldAgain" format="boolean"/>
</declare-styleable>
</resources>
3.自定义View实现(FolderTextView类)
package com.wd.sockettcpdemo.service;
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.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 com.wd.sockettcpdemo.R;
/**
* 结尾带“查看全部”的TextView,点击可以展开文字,展开后可收起。
* <p/>
* 目前存在一个问题:外部调用setText()时会造成界面该TextView下方的View抖动;
* <p/>
* 可以先调用getFullText(),当已有文字和要设置的文字不一样才调用setText(),可降低抖动的次数;
* <p/>
* 通过在onMeasure()中设置高度已经修复了该问题了。
* <p/>
* Created by moxiaobo on 16/8/9.
*/
public class FolderTextView extends android.support.v7.widget.AppCompatTextView {
// TAG
private static final String TAG = "xiaobo";
// 默认打点文字
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 = 3;
// 默认收起和展开文字颜色
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 String mFullText;
// 行间距倍数
private float mLineSpacingMultipl