自定义TextView,实现文本展开与收起

本文介绍如何自定义TextView实现文本的展开和收起功能,包括设置最大显示行数、自定义显示文字及颜色,并处理点击事件,如展开/收起点击、TextView局部点击和父容器点击事件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

1、功能

2、思路 / 方法

3、设计实现

 3.1 变量说明:

3.2 自定义View具体步骤

3.3 使用自定义View

 

4、参考


1、功能

(1)支持全文展开/收起(按钮紧跟着文本后面显示,非另起一行),见下图。
(2)可设置收起时最大显示行数;
(3) 可设置“展开/收起”的具体文字显示、字体颜色,是否带省略点等;
(4) 支持 “展开/收起”点击事件(即,后缀点击事件)、剩余区间点击事件(TextView点击事件)、父容器点击事件。

ps:实际开发中,TextView自身点击事件和 父容器点击事件基本不会同时存在。

效果图如下:设置代码见3.3

      

                                                     图1.  默认实现方式(带省略点)

                                              图2.  设置后缀文字等(不带省略点)

 

2、思路 / 方法

以后缀名“收起 / 展开”为例。

(1)点击“收起 / 展开”时,文字收起/展开

点击事件,使用ClickableSpan实现---需要设置setMovementMethod()

颜色设置,使用ForegroundColorSpan

(2)父容器点击事件 ,即点击该后缀文字以外的其他区域(非clickablespan设置区域),会响应ViewGroup的事件

          >> 点击时,判断当前点击的区域是否有ClickableSpan,如果有,则拦截TextView的onTouchEvent方法,交由viewgroup处

理(通过自定义LinkMovementMethod实现)

(3)TextView点击事件(注意事件冲突问题)

方法,同(1)。

注意:直接设置setOnClickListener,会导致clickableSpan响应的同时,响应onClick,所以需要避免。应该在局部点击之

外的文字区域响应onclick事件,但是判断点击区域是否有clickspan,已经用于父容器的点击事件之中,所以这里我们可采

用(1)中方案,同样用clickspan实现。

 

ps:实际开发中,(2)和(3)两种事件基本不会同时存在。

 

3、设计实现

 3.1 变量说明:

   /**
     * 最大显示行数,其余折叠
     */
    private int collapsedLines;
    /**
     * 折叠时后缀文字
     */
    private String collapsedText;
    /**
     * 展开时,后缀名字
     */
    private String expandedText;
    /**
     * 后缀字体颜色
     */
    private int suffixColor;

    final int defaultLines = 5;//默认显示5行
    final int defaultColor = Color.BLUE;//默认后缀颜色
    final String defaultExpandedText = "收起";//默认展开时的后缀文字
    final String defaultCollapsedText = "展开";//默认收起时的后缀文字

    final String tag = "...";
    /**
     * 文本内容
     */
    String mText;
    /**
     * 是否展开。默认收起
     */
    boolean mIsneedExpanded;


    /**
     * 局部点击事件: 展开 or 收起
     */
    ClickableSpan mClickSpanListener = new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            mIsneedExpanded = !mIsneedExpanded;

            updateUI(mIsneedExpanded);

            Toast.makeText(mContext, "点击了展开/收起", Toast.LENGTH_SHORT).show();


        }

        @Override
        public void updateDrawState(TextPaint ds) {
//            super.updateDrawState(ds);

            ds.setUnderlineText(false);//点击区域下方是否有下划线。默认true,会像超链接一样显示下划线
            setHighlightColor(Color.TRANSPARENT);//取消选中文字背景色高亮显示
        }
    };
    /**
     * TextView自身点击事件(除后缀外的部分)
     */
    ClickableSpan selfClickSpan=new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            if (onTextClickListener!=null)
                onTextClickListener.onTextClick(null);
        }

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


 /**
     * TextView自身点击事件,代替onClickListener
     */
OnTextClickListener onTextClickListener;

private CustomLinkMovementMethod customLinkMovementMethod;

private boolean isNeedEllipsis=true;//是否需要默认的省略点“...”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值