ExtendTextView 展开收缩textview

直接上代码 

public class ExtendTextView extends AppCompatTextView {
    private static final String TAG = ExtendTextView.class.getSimpleName();

    private boolean shouldShowEllipse = false;
    private int maxLineCount = 4;
    private int collapseTxtColor;
    private int showMoreTxtColor;
    private float collapseTxtSize = 14;
    private float showMoreTxtSize = 14;


    public ExtendTextView(Context context) {
        this(context, null);
    }

    public ExtendTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ExtendTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initData(context, attrs, defStyleAttr);
        initView();

    }

    private void initData(Context context, AttributeSet attrs, int defStyleAttr) {
        TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.ExtendTextView, defStyleAttr, 0);
        collapseTxtColor = typedArray.getColor(R.styleable.ExtendTextView_collapseTxtColor, Color.parseColor("#ff5600"));
        showMoreTxtColor = typedArray.getColor(R.styleable.ExtendTextView_showMoreTxtColor, Color.parseColor("#ff5600"));
        collapseTxtSize = typedArray.getDimension(R.styleable.ExtendTextView_collapseTxtSize, Utils.dip2px(getContext(), 14));
        showMoreTxtSize = typedArray.getDimension(R.styleable.ExtendTextView_showMoreTxtSize, Utils.dip2px(getContext(), 14));
        shouldShowEllipse = typedArray.getBoolean(R.styleable.ExtendTextView_shouldShowEllipse, true);
    }

    private final Runnable computeLineCountRunnable = new Runnable() {
        @Override
        public void run() {
            float textSize = getTextSize();
            Log.e("test","textsize---"+textSize);
            int originalLineCount = getLineCount();
            if (originalLineCount > maxLineCount) {
                setTxtForCollapse();
            }
        }
    };

    private void setTxtForCollapse() {
        TextPaint paint = getPaint();
        int width = getWidth();
        CharSequence text = getText();
        StaticLayout staticLayout = new StaticLayout(text, paint, width, Layout.Alignment.ALIGN_NORMAL, 1, 0, false);
        int lineEnd = staticLayout.getLineEnd(maxLineCount - 1);//return的是参数+1行的第一个字符的索引
        String showMoreTxt = shouldShowEllipse ? "...更多" : "更多";
        String sourceMoreTxt = text.subSequence(0, lineEnd - showMoreTxt.length()+2).toString();
        String showMoreTxtAll = sourceMoreTxt + showMoreTxt;
        final SpannableString showMoreSpannableString = new SpannableString(showMoreTxtAll);
        String collapseTxt = "收起";
        String collapseTxtAll = text.toString() + collapseTxt;

        final SpannableString collapseSpannableString = new SpannableString(collapseTxtAll);
        collapseSpannableString.setSpan(new ClickableSpan() {
            @Override
            public void updateDrawState(TextPaint ds) {
                super.updateDrawState(ds);
                ds.setUnderlineText(false);
                ds.setAntiAlias(true);
                ds.setColor(collapseTxtColor);
                ds.setTextSize(collapseTxtSize);
            }

            @Override
            public void onClick(View widget) {
                setOnClickListener(null);
                setText(showMoreSpannableString);
            }
        }, collapseTxtAll.length() - 2, collapseTxtAll.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        showMoreSpannableString.setSpan(new ClickableSpan() {
            @Override
            public void updateDrawState(TextPaint ds) {
                super.updateDrawState(ds);
                ds.setUnderlineText(false);
                ds.setAntiAlias(true);
                ds.setColor(showMoreTxtColor);
                ds.setTextSize(showMoreTxtSize);
            }

            @Override
            public void onClick(View widget) {
                setOnClickListener(null);
                setText(collapseSpannableString);
            }
        }, sourceMoreTxt.length()+3, showMoreTxtAll.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        setMovementMethod(LinkMovementMethod.getInstance());
        setText(showMoreSpannableString);
    }

    private void initView() {
        //TextView行数的计算,必须放到runnable或者监听中进行,否则获取不到,因为此时正在layout
        post(computeLineCountRunnable);
    }
    public void setMaxStart(){
        post(computeLineCountRunnable);
    }

}

style里的文件

 

 

<declare-styleable name="ExtendTextView">
    <attr name="shouldShowEllipse" format="boolean"/>
    <attr name="maxLineCount" format="integer"/>
    <attr name="collapseTxtColor" format="color"/>
    <attr name="showMoreTxtColor" format="color"/>
    <attr name="collapseTxtSize" format="dimension"/>
    <attr name="showMoreTxtSize" format="dimension"/>
</declare-styleable>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值