• Android编程之仿微信显示更多文字的View


    微信朋友圈中,如果好友发表的文字过长,会自动收缩起来,底下有提示,当点击“显示更多”时才会展开。

     

    首先定义布局文件(很简单,不解释):

    <?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="match_parent"
        android:orientation="vertical" >
    
        <TextView
            android:id="@+id/desc_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="4.0dip"
            android:gravity="center_vertical"
            android:textColor="#ff000000"
            android:textSize="14.0dip" />
    
        <TextView
            android:id="@+id/desc_op_tv"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="4.0dip"
            android:gravity="center"
            android:singleLine="true"
            android:textColor="#ff576b95"
            android:textSize="14.0dip"
            android:visibility="gone" />
    
    </LinearLayout>

    文字:

        <string name="desc_shrinkup">收起</string>
        <string name="desc_spread">显示更多</string>


     

    接下来就是对文字的处理,原理就是设置TextView最大行数。

    先判断文字是否超过了规定的行数,如果没超过,不显现“显示更多”的文字提示。当文字超过了,就显示“显示更多”的文字提示。用户点击“显示更多”后,设置最大行数为最大。

    补一句:微信的默认最大行数是10行,我这里设置是2行。你可以自行设置该值DEFAULT_MAX_LINE_COUNT。

    代码如下:

    public class CollapsibleTextView extends LinearLayout implements
            OnClickListener {
    
        /** default text show max lines */
        private static final int DEFAULT_MAX_LINE_COUNT = 2;
    
        private static final int COLLAPSIBLE_STATE_NONE = 0;
        private static final int COLLAPSIBLE_STATE_SHRINKUP = 1;
        private static final int COLLAPSIBLE_STATE_SPREAD = 2;
    
        private TextView desc;
        private TextView descOp;
    
        private String shrinkup;
        private String spread;
        private int mState;
        private boolean flag;
    
        public CollapsibleTextView(Context context, AttributeSet attrs) {
            super(context, attrs);
            shrinkup = context.getString(R.string.desc_shrinkup);
            spread = context.getString(R.string.desc_spread);
            View view = inflate(context, R.layout.collapsible_textview, this);
            view.setPadding(0, -1, 0, 0);
            desc = (TextView) view.findViewById(R.id.desc_tv);
            descOp = (TextView) view.findViewById(R.id.desc_op_tv);
            descOp.setOnClickListener(this);
        }
    
        public CollapsibleTextView(Context context) {
            this(context, null);
        }
    
        public final void setDesc(CharSequence charSequence, BufferType bufferType) {
            desc.setText(charSequence, bufferType);
            mState = COLLAPSIBLE_STATE_SPREAD;
            requestLayout();
        }
    
        @Override
        public void onClick(View v) {
            flag = false;
            requestLayout();
        }
    
        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            super.onLayout(changed, l, t, r, b);
            if (!flag) {
                flag = true;
                if (desc.getLineCount() <= DEFAULT_MAX_LINE_COUNT) {
                    mState = COLLAPSIBLE_STATE_NONE;
                    descOp.setVisibility(View.GONE);
                    desc.setMaxLines(DEFAULT_MAX_LINE_COUNT + 1);
                } else {
                    post(new InnerRunnable());
                }
            }
        }
    
        class InnerRunnable implements Runnable {
            @Override
            public void run() {
                if (mState == COLLAPSIBLE_STATE_SPREAD) {
                    desc.setMaxLines(DEFAULT_MAX_LINE_COUNT);
                    descOp.setVisibility(View.VISIBLE);
                    descOp.setText(spread);
                    mState = COLLAPSIBLE_STATE_SHRINKUP;
                } else if (mState == COLLAPSIBLE_STATE_SHRINKUP) {
                    desc.setMaxLines(Integer.MAX_VALUE);
                    descOp.setVisibility(View.VISIBLE);
                    descOp.setText(shrinkup);
                    mState = COLLAPSIBLE_STATE_SPREAD;
                }
            }
        }
    }


    效果图:

    代码工程:

    http://download.csdn.net/detail/xyz_fly/5625783

  • 相关阅读:
    在一个字符串中找到第一个只出现一次的字符
    查找最小的k个数
    动规:最大上升子序列
    平衡二叉树
    【笔记】php和mysql结合 搞了一个表出来
    设计模式心得(既设计模式篇终章):描述设计模式时的通用公式
    分享系列 之 linux IO原理与几种零拷贝机制的实现
    近期分享:BIO 与 NIO 的实质区别到底是什么?
    源码阅读笔记 之 ThreadLocal —— 不复杂,却有点绕的一个 per thread API
    小脑袋瓜充满了问号:为什么AMQP可以叫做 Advanced?JMS就要low一等吗?
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3165502.html
Copyright © 2020-2023  润新知