110.Android简单的自定义折叠文本,展开与隐藏TextView,自定义视图CollapsibleTextView,自定义View,文本展示

导读:本篇文章讲解 110.Android简单的自定义折叠文本,展开与隐藏TextView,自定义视图CollapsibleTextView,自定义View,文本展示,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

如图:

110.Android简单的自定义折叠文本,展开与隐藏TextView,自定义视图CollapsibleTextView,自定义View,文本展示

110.Android简单的自定义折叠文本,展开与隐藏TextView,自定义视图CollapsibleTextView,自定义View,文本展示

 

110.Android简单的自定义折叠文本,展开与隐藏TextView,自定义视图CollapsibleTextView,自定义View,文本展示

 

110.Android简单的自定义折叠文本,展开与隐藏TextView,自定义视图CollapsibleTextView,自定义View,文本展示

 

 

 1.第一步,新建CollapsibleTextView类继承LinearLayout:

/**
 * @author CJF
 */
public class CollapsibleTextView extends LinearLayout {

    /**
     * 默认(展开与隐藏)文本颜色 蓝色
     */
    private ForegroundColorSpan expandAndHideColorSpan = new ForegroundColorSpan(Color.parseColor("#3b76ec"));

    /**
     * 默认(内容文本)文本颜色 黑色
     */
    private ForegroundColorSpan textColorSpan = new ForegroundColorSpan(Color.parseColor("#000000"));

    /**
     * 文本显示最大行数,默认为1
     */
    private int maxLines = 1;

    /**
     * 标记
     */
    private boolean flag, flag2, flag3;

    /**
     * 文本
     */
    private String text;

    /**
     * 文本长度
     */
    private int length;

    private TextView mCollapsibleTextView;

    public CollapsibleTextView(Context context) {
        super(context);
    }

    public CollapsibleTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
        View view = inflate(context, R.layout.layout_collapsible_textview, this);
        mCollapsibleTextView = (TextView) view.findViewById(R.id.mCollapsibleTextView);
        //设置textView可点击
        mCollapsibleTextView.setMovementMethod(LinkMovementMethod.getInstance());
    }

    /**
     * 对外提供暴露的方法,为设置文本内容、文本显示最大行数、(内容文本)文本颜色、(展开与隐藏)文本颜色
     *
     * @param text               设置文本内容
     * @param maxLines           设置文本显示最大行数
     * @param textColor          (内容文本)文本颜色
     * @param expandAndHideColor (展开与隐藏)文本颜色
     */
    public void setText(String text, int maxLines, int textColor, int expandAndHideColor) {
        this.text = text;
        //赋值文本显示最大行数,最小是1
        this.maxLines = Math.max(maxLines, 1);
        //得到字符串的长度
        length = text.length();
        //setText调用就设置flag为true
        flag = true;
        //flag3为false时 设置一次最大行数
        if (!flag3) {
            //设置默认最大行数
            mCollapsibleTextView.setMaxLines(maxLines);
        }
        //设置文本
        mCollapsibleTextView.setText(text);
        //设置(内容文本)文本颜色
        textColorSpan = new ForegroundColorSpan(ContextCompat.getColor(getContext(), textColor));
        //设置(展开与隐藏)文本颜色
        expandAndHideColorSpan = new ForegroundColorSpan(ContextCompat.getColor(getContext(), expandAndHideColor));
        //重新请求布局
        requestLayout();
    }

    /**
     * 文本设置
     * 设置展开或隐藏
     *
     * @param count
     * @param str
     * @return
     */
    private SpannableString getClickableSpan(int count, String str) {
        //新建一个spannableString(设置字体颜色,监听点击,字体大小)
        SpannableString span = new SpannableString(str);
        //count == 0时设置文本颜色并返回
        if (count == 0) {
            //内容文本 设置字体大小
            span.setSpan(new RelativeSizeSpan(1f), 0, str.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            //内容文本 设置字体可点击并监听
            span.setSpan(new TextListener(), 0, str.length(), Spanned.SPAN_MARK_MARK);
            //内容文本 设置字体颜色
            span.setSpan(textColorSpan, 0, str.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            //返回span
            return span;
        }
        int maxLines = mCollapsibleTextView.getMaxLines();
        if (maxLines == this.maxLines) {
            //内容文本 设置字体大小
            span.setSpan(new RelativeSizeSpan(1f), 0, count - 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            //内容文本 设置字体可点击并监听
            span.setSpan(new TextListener(), 0, count - 5, Spanned.SPAN_MARK_MARK);
            //内容文本 设置字体颜色
            span.setSpan(textColorSpan, 0, count - 5, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            //展开与隐藏 设置字体大小
            span.setSpan(new RelativeSizeSpan(1.1f), count - 5, count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            //展开与隐藏 设置字体可点击并监听
            span.setSpan(new ExpandAndHideListener(), count - 5, count, Spanned.SPAN_MARK_MARK);
            //展开与隐藏 设置字体颜色
            span.setSpan(expandAndHideColorSpan, count - 5, count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            //内容文本 设置字体大小
            span.setSpan(new RelativeSizeSpan(1f), 0, count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            //内容文本 设置字体可点击并监听
            span.setSpan(new TextListener(), 0, count, Spanned.SPAN_MARK_MARK);
            //内容文本 设置字体颜色
            span.setSpan(textColorSpan, 0, count, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

            //展开与隐藏 设置字体大小
            span.setSpan(new RelativeSizeSpan(1.1f), count, count + 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
            //展开与隐藏 设置字体可点击并监听
            span.setSpan(new ExpandAndHideListener(), count, count + 3, Spanned.SPAN_MARK_MARK);
            //展开与隐藏 设置字体颜色
            span.setSpan(expandAndHideColorSpan, count, count + 3, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        //返回span
        return span;
    }

    /**
     * 1.展开与隐藏的点击事件
     * 2.(内容文本的点击事件 与 展开与隐藏文本的点击事件  可全部使用也可只使用一个 这里全部使用)
     */
    private class ExpandAndHideListener extends ClickableSpan implements View.OnClickListener {
        //文字点击事件
        @Override
        public void onClick(@NonNull View widget) {
            //flag设置并重新请求布局
            flagSetting();
        }

        @Override
        public void updateDrawState(@NonNull TextPaint ds) {
            super.updateDrawState(ds);
            ds.setUnderlineText(false);
        }
    }

    /**
     * 1.内容文本的点击事件
     * 2.(内容文本的点击事件 与 展开与隐藏文本的点击事件  可全部使用也可只使用一个 这里全部使用)
     */
    private class TextListener extends ClickableSpan implements View.OnClickListener {
        //文字点击事件
        @Override
        public void onClick(@NonNull View widget) {
            //flag设置并重新请求布局
            flagSetting();
        }

        @Override
        public void updateDrawState(@NonNull TextPaint ds) {
            super.updateDrawState(ds);
            ds.setUnderlineText(false);
        }
    }

    /**
     * flag设置并重新请求布局
     */
    private void flagSetting() {
        flag = true;
        if (flag3) {
            //mCollapsibleTextView.getLineCount() <= defaultMaxLines返回true 反之false
            flag2 = mCollapsibleTextView.getLineCount() <= maxLines;
            //重新请求布局
            requestLayout();
        }
    }

    /**
     * 布局设置
     *
     * @param changed
     * @param l
     * @param t
     * @param r
     * @param b
     */
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        //flag为false返回
        if (!flag) {
            return;
        }
        //设置为false
        flag = false;

        //flag2为true展开
        if (flag2) {
            //展开状态
            mCollapsibleTextView.setMaxLines(Integer.MAX_VALUE);
            //在原字符串后面加上“ 隐藏”
            String allText = text + " 隐藏";
            SpannableString clickableSpan = getClickableSpan(length, allText);
            mCollapsibleTextView.setText(clickableSpan);
            flag3 = true;
        } else {
            //flag2为false 判断mCollapsibleTextView.getLineCount() > defaultMaxLines
            if (mCollapsibleTextView.getLineCount() > maxLines) {
                //收起状态
                mCollapsibleTextView.setMaxLines(maxLines);
                //得到第一行最后一个字符的位置
                int lineEnd = mCollapsibleTextView.getLayout().getLineEnd(maxLines - 1);
                //截取第一行的字符 替换最后五个字符为“...展开”
                String hiddenString = text.substring(0, lineEnd - 5) + "...展开";
                SpannableString clickableSpan = getClickableSpan(lineEnd, hiddenString);
                mCollapsibleTextView.setText(clickableSpan);
                flag3 = true;
            } else {
                SpannableString clickableSpan = getClickableSpan(0, text);
                mCollapsibleTextView.setText(clickableSpan);
            }
        }
    }

}

2.第二步,新建布局文件layout_collapsible_textview.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/mCollapsibleTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@android:color/transparent"
        android:text="内容"
        android:textSize="14sp" />

</LinearLayout>

3.第三步,在布局中引,com.tq.recorder.widget.customView.CollapsibleTextView是我的包名,替换成你自己的

<com.tq.recorder.widget.customView.CollapsibleTextView
    android:id="@+id/mCollapsibleView"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:gravity="top"
    android:textSize="14sp" />

4.第四步,代码中使用,在Activity和适配器中都可以:

CollapsibleTextView view =  findViewById(R.id.mCollapsibleView);
//传入文本内容、默认要显示的行数、(内容文本)文本颜色、(展开与隐藏)文本颜色
view.setText("传入文本内容", 1, Color.parseColor("#000000"), Color.parseColor("#3b76ec"));

—————————————————————-end——————————————————— 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/118284.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!