显示更多和收起

自定义隐藏字体View

前言

转载请 标注地址:http://blog.csdn.net/sinat_17314503/article/details/51867813
今天我需要做一个关于隐藏字体的View但是如何做呢?

我觉得需要一步一步的进行分析

需求

当字体大于3行的时候就会隐藏超过3行的字体就会进行隐藏并且显示一个按钮——“显示全部”,如果点击这个就可以显示全部的字体,并且这个按钮的字体变为“收起”

起始我觉的这个会很简单 但是我错了

遇到的坑
一 怎为才为一行 我认为一行25个字。但是“3d”这个算两个字而且宽度等于一个汉字。那么用字体数判断 行数失败。

二 我怎么获到TextView的行数 看了一下TextView的方法看见了getLineCount() 哎 可以喔 可以获取到TextView的行数。但是获取时调用了多次这个方法。第一次可以获取到行数 而第二次却获取不了行数。
(至于为什么调用 是因为每个构造函数都设置有这个方法)解决方法让他只调用一次就可以了。

代码如下

代码还是挺简单的

/**
 * Created by Administrator on 2016/7/8.
 * 作者:wu
 */
public class MYTextShow extends LinearLayout{
    private String mess="";
    private TextView mTv;
    private TextView mClick;
    private Boolean mIscheck;

    public MYTextShow(Context context) {
        super(context);
        init();
    }

    public MYTextShow(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

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

    private void init() {
        setOrientation(VERTICAL);
        LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        setLayoutParams(params);
        mTv = new TextView(getContext());
        mTv.setMaxLines(3);
        mTv.setTextSize(12);
        mTv.setMaxWidth(120);
        mTv.setLayoutParams(params);
        mClick = new TextView(getContext());
        mClick.setGravity(Gravity.CENTER_HORIZONTAL);
        mClick.setVisibility(GONE);
        addView(mTv);
        addView(mClick);

    }

    public void setText(String text){
        mess = text;
        mTv.setText(text);
        Log.d("zero", text.length() + "");
        mIscheck = false;
        mTv.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                if(!mIscheck){
                    showornot(mTv.getLineCount());
                    mIscheck = true;
                }
                mTv.getViewTreeObserver().removeOnPreDrawListener(this);
                return true;
            }
        });
    }


    private void showornot(int count){
        Log.d("zero", count+"line");
        if(count>3){
            mClick.setClickable(true);
            mClick.setText("查看全部");
            mTv.setEllipsize(TextUtils.TruncateAt.END);
            mClick.setVisibility(VISIBLE);
            mClick.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if (mClick.getText().toString().equals("查看全部")) {
                        mTv.setMaxLines(10000);
                        mClick.setText("收起");
                    } else {
                        mTv.setMaxLines(3);
                        mClick.setText("查看全部");
                    }
                }
            });
        }else {
            mClick.setVisibility(GONE);
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值