折叠TextView

736 阅读1分钟

简介:

折叠TextView不是特别难实现,并且Github已经有好多已经实现好的。

这个控件很常用,所以特别写篇博客。

问题:

  1. 怎么判断是否需要折叠?
  2. 怎么获取折叠后的文本?
  3. 如何把展开的提示文本拼接上去?
  4. 如何设置点击事件?

思路

怎么判断是否需要折叠?

  1. 通过layout.getLineCount()获取要显示的文本的行数和最大行数想比较。判断是否需要折叠。

  2. 通过StaticLayout判断。

特别注意:

需要在onLayout之后调取layout.getLineCount()方法才能获取到。

代码实现:

getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        getViewTreeObserver().removeOnGlobalLayoutListener(this);
        translateText(getLayout(), type);
    }
});

怎么获取折叠后的文本?

int start=layout.getLineStart(i); 
int end=layout.getLineEnd(i);
text.subSequence();
  1. 通过layout.getLineEnd()获取最后一个字符的下标。

  2. 通过String.subSequence(0, end)进行截取。

如何把展开的提示文本拼接上去?

  1. 通过paint.measureText(builder.toString())要拼接的文本的宽度。
  2. 通过paint.breakText(mOriginalText, start, end, false, paint.measureText(builder.toString())获取要截取的字符个数。
  3. 字符串拼接。

如何设置点击事件?

通过ClickableSpan

    final SpannableStringBuilder style = new SpannableStringBuilder();

    //设置文字
    style.append("关于本活动更多规则,请点我查看");

    //设置部分文字点击事件
    ClickableSpan clickableSpan = new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            Toast.makeText(MainActivity.this, "触发点击事件!", Toast.LENGTH_SHORT).show();
        }
    };
    style.setSpan(clickableSpan, 11, 15, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    tv.setText(style);

    //设置部分文字颜色
    ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.parseColor("#0000FF"));
    style.setSpan(foregroundColorSpan, 11, 15, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

    //配置给TextView
    tv.setMovementMethod(LinkMovementMethod.getInstance());
    tv.setText(style);

参考: