Android中可展开收起内容的TextView

android开发中,我们常常会有一些需求,也不得不去实现它,一方面是提升自己的技术水平,再者是实现自己的价值,对一个阶段性的自己有个评估,自己是否又进步了多少,又掌握了多少,如果遇到想跳槽时,面对面试官,是否有货拿出来.............

今天我们就来说说,在android开发中,实现一个可以折叠,展开收起内容的Textview,这个效果,代码呢也相对比较简单,相信大家一定在QQ空间或者社交,资讯平台看过,我们先来看一下展示效果:            

                                                                                         

 

如图,我们看见当我们点击箭头,textView会展开或者收起,并且附带动画效果渲染,使展开收起效果不单调,好了,废话不说,直接上代码和实现原理

1. 新建一个MoreTextViwe 继承 LinearLayout,实现CheckBox的checked事件 onCheckedChangeListener, view观察器 OnPreDrawListener

public class MoreTextView extends LinearLayout implements CompoundButton.OnCheckedChangeListener,ViewTreeObserver.OnPreDrawListener{


    private int mMoreSwitchTextSize = 12;

    private int mMoreTextSize = 12;

    private int mMoreTextColor = Color.parseColor("#3c3c40");

    private int mMoreSwitchTextColor = Color.parseColor("#fc9400");

    private int mMaxHeight,mMinHeight,mMaxLine;

    private int mMinLine = 3;

    private int mLineHeight = -1;


    private TextView mTextView;
    private CheckBox mCheckBox;
}

 

2 , 第二步,计算TextView的高度,当然我们得给出一个TextView内容超出时默认的高度,列入超出三列我们的高度是多少,这个时候我们就需要计算,我们通过onPreDraw方法在view绘制之前获取内容并且设置高度,minHeight,和maxHeight

    @Override
    public boolean onPreDraw() {
        mTextView.getViewTreeObserver().removeOnPreDrawListener(this);
        mMaxLine = mTextView.getLineCount(); //获取当前最大的line

        if (mMaxLine != 0) { // view初始化时  这个值肯定为0
            //计算最大的高度
            //得到行高
            int tempLineHeight = mTextView.getHeight() / mMaxLine;

            if (mLineHeight == -1 || tempLineHeight > mLineHeight) {
                mLineHeight = tempLineHeight;
            }
        }

        // 求出最大的高度
        mMaxHeight = mLineHeight * mMaxLine;

        //如果点击了展开  此时更新数据时 我们不想自动关闭它

        if (mCheckBox.isChecked()) {
            mTextView.setHeight(mMaxHeight);
            return false;
        }


        if (mMaxLine > mMinLine) {

            mTextView.setLines(mMinLine); //设置为最小的行数

            //获取最小行的高度
            mTextView.post(new Runnable() {
                @Override
                public void run() {
                    mMinHeight = mTextView.getHeight();
                }
            });

            if (noDrawable()) {
                mCheckBox.setText(mMoreSwitchHints[0]);
            }

            mCheckBox.setVisibility(VISIBLE);
            return false;
        }else {
            if (noDrawable()) {
                mCheckBox.setText(mMoreSwitchHints[1]);
            }
            mCheckBox.setVisibility(GONE);
        }

        return true;
    }

3, 我们设置好了高度,那么我们要如何触发这个展开收起呢,还记得我们实现了onCheckedChangeListener 的回调吗,当然我们肯定要去实现方法里面填充内容

    @Override
    public void onCheckedChanged(CompoundButton compoundButton, boolean b) {

        mTextView.clearAnimation();

        final int deltaValue;
        final int startValue = mTextView.getHeight();
        if (b) {
            //展开
            deltaValue = mMaxHeight - startValue;
        } else {
            //缩进
            deltaValue = mMinHeight - startValue;
        }
        setMoreSwichHints();
        Animation animation = new Animation() {
            protected void applyTransformation(float interpolatedTime, Transformation t) {
                mTextView.setHeight((int) (startValue + deltaValue * interpolatedTime));
                if (interpolatedTime == 0) {
                    t.clear();
                }
            }
        };
        animation.setDuration(350);
        mTextView.startAnimation(animation);
    }

好了,以上就是MoreTextView的核心代码了

MoreTextView : 源代码

如果有帮助到你,记得在github上面点击star一下,作者便有更多动力创造更好的轮子啦

欢迎android爱好者加群    420221427

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值