能够自定义后缀的TextView

废话不多说。
此文章大部分参考了 https://github.com/TheCodeYard/EllipsizedTextView/blob/master/ellipsizedtextview/src/main/java/com/thecodeyard/ellipsizedtextview/EllipsizedTextView.kt 。改了一个小问题。
废话不多说上代码。
package com.example.testapplication;

import android.content.Context;
import android.content.res.TypedArray;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.text.style.ForegroundColorSpan;
import android.util.AttributeSet;

import androidx.appcompat.widget.AppCompatTextView;

/**

  • see https://github.com/TheCodeYard/EllipsizedTextView/blob/master/ellipsizedtextview/src/main/java/com/thecodeyard/ellipsizedtextview/EllipsizedTextView.kt

  • 通过kt改造
    */
    public class EllipsizedTextView extends AppCompatTextView {
    private SpannableString ellipsisSpannable;
    private SpannableStringBuilder spannableStringBuilder = new SpannableStringBuilder();
    String ellipsis;
    int ellipsisColor;
    private static final String ELLIPSIS_NORMAL = “\u2026”; // (…)

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

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

    public EllipsizedTextView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init(context, attrs, defStyleAttr);

    }

    private void init(Context context, AttributeSet attrs, int defStyleAttr) {
    ellipsis = getDefaultEllipsis().toString();
    ellipsisColor = getDefaultEllipsisColor();
    if (attrs != null) {
    TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.EllipsizedTextView, 0, 0);
    ellipsis = typedArray.getString(R.styleable.EllipsizedTextView_ellipsis);
    ellipsisColor = typedArray.getColor(R.styleable.EllipsizedTextView_ellipsisColor, getDefaultEllipsisColor());
    typedArray.recycle();
    }

     ellipsisSpannable = new SpannableString(ellipsis);
     ellipsisSpannable.setSpan(new ForegroundColorSpan(ellipsisColor), 0, ellipsis.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    

    }

    @Override
    public void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    float availableScreenWidth = getMeasuredWidth() - getCompoundPaddingLeft() - getCompoundPaddingRight();
    float availableTextWidth = availableScreenWidth * getMaxLines();
    String ellipsizedText = TextUtils.ellipsize(getText(), getPaint(), availableTextWidth, getEllipsize()).toString();
    //如果裁剪后文字跟TextView文字不一致。需要执行替换逻辑。
    if (ellipsizedText.toString() != getText().toString()) {
    // If the ellipsizedText is different than the original text, this means that it didn’t fit and got indeed ellipsized.
    // Calculate the new availableTextWidth by taking into consideration the size of the custom ellipsis, too.
    //此处计算错误。应该是最后一行才有Ellipsize
    // availableTextWidth = (availableScreenWidth - getPaint().measureText(ellipsis)) * getMaxLines();
    if(getMaxLines()>=1) {
    availableTextWidth = availableScreenWidth * (getMaxLines() - 1) + (availableScreenWidth - getPaint().measureText(ellipsis));
    ellipsizedText = TextUtils.ellipsize(getText(), getPaint(), availableTextWidth, getEllipsize()).toString();
    int defaultEllipsisStart = ellipsizedText.indexOf(getDefaultEllipsis());
    int defaultEllipsisEnd = defaultEllipsisStart + 1;

             spannableStringBuilder.clear();
    
             // Update the text with the ellipsized version and replace the default ellipsis with the custom one.
             setText(spannableStringBuilder.append(ellipsizedText).replace(defaultEllipsisStart, defaultEllipsisEnd, ellipsisSpannable));
         }
     }
    

    }

    private String getDefaultEllipsis() {
    return ELLIPSIS_NORMAL;
    }

    private int getDefaultEllipsisColor() {
    return getTextColors().getDefaultColor();
    }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值