Text文本折叠

第一种

导入依赖

dependencies {
        compile 'com.hymane.expandtextview:library:1.0.2'
        }

简单粗暴 

定义xml布局

<com.hymane.expandtextview.ExpandTextView
        android:id="@+id/etv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:paddingBottom="8dp"
        android:paddingLeft="@dimen/activity_horizontal_margin"
        android:paddingRight="@dimen/activity_horizontal_margin"
        android:paddingTop="8dp"
        app:contentTextSize="14sp"
        app:expandHint="点击展开"
        app:foldHint="点击收回"
        app:textContentColor="?android:attr/textColorPrimary"
        app:textHintColor="?android:attr/textColorPrimary"
        app:textTitleColor="?android:attr/textColorSecondary"
        app:titleText="标题党"
        app:titleTextSize="16sp">

自定义设置

etv.setIndicateImage(R.drawable.ic_arrow_down_light_round);
        etv.setMinVisibleLines(5);
        etv.setContentTextSize(15);
        etv.setTitleTextSize(16);
        etv.setHintTextSize(12);
        etv.setContent("text");
        etv.setHintTextColor(Color.parseColor("#913242"));
        etv.setOnReadMoreListener(new OnReadMoreClickListener() {
            @Override
            public void onExpand() {
                Toast.makeText(MainActivity.this, "expand", Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onFold() {
                Toast.makeText(MainActivity.this, "fold", Toast.LENGTH_SHORT).show();
            }
        });

可选项

//设置标题
    public void setTitle(String title);
    //设置内容文本
    public void setContent(String content);
    //展开后显示的文字
    public void setFoldHint(String foldHint);
    //折叠起来后显示的文字
    public void setExpandHint(String expandHint) ;
    //标题颜色
    public void setTitleTextColor(@ColorInt int titleTextColor);
    //内容字体颜色
    public void setContentTextColor(@ColorInt int contentTextColor);
    //查看更多字体颜色
    public void setHintTextColor(@ColorInt int hintTextColor);
    //查看更多前面小图标(夜间模式请更换对应图标,或者使用兼容主题的图标)
    public void setIndicateImage(@DrawableRes Drawable indicateImage);
    public void setIndicateImage(@DrawableRes int indicateImageRes);
    //最小显示行数
    public void setMinVisibleLines(int minVisibleLines);
    /**
     * 设置字体大小
     * @param titleTextSize 单位为sp
     */
    public void setTitleTextSize(float titleTextSize);
    /**
     * 设置字体大小
     * @param contentTextSize 单位为sp
     */
    public void setContentTextSize(float contentTextSize);
}
/**
 * 设置字体大小
 * @param hintTextSize 单位为sp
 */
public void setHintTextSize(float hintTextSize);
/**
 * 动画执行时间
 * @param animationDuration 单位毫秒
 */
public void setAnimationDuration(int animationDuration);
/**
 * 设置监听
 * @param mListener 展开和收缩按钮点击时回调
 */
public void setOnReadMoreListener(OnReadMoreClickListener mListener);

第二种

1先定义一个XML布局

<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="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="4.0dip"
        android:gravity="right"

        android:singleLine="true"
        android:textColor="#ff576b95"
        android:textSize="14.0dip"
        android:visibility="gone" />

</LinearLayout>

2再定义一个工具类

public class CollapsibleTextView extends LinearLayout implements View.OnClickListener {

    //默认展示几行
    private static final int DEFAULT_MAX_LINE_COUNT = 3;

    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);
        shrinkup="收起";
        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);
    }
    /**
     1.
     2. 对外提供暴漏的方法,为文本提供数据
     3. @param charSequence  文本内容是什么
     4. @param bufferType
     */
    public final void setDesc(CharSequence charSequence, TextView.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;
            }
        }
    }
}

3使用

<com.guorentong.learn.myapplication.CollapsibleTextView
    android:id="@+id/desc_collapse_tv"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
     />

4使用

CollapsibleTextView tv = (CollapsibleTextView) findViewById(R.id.desc_collapse_tv);
tv.setDesc("文本", TextView.BufferType.NORMAL);

猜你喜欢

转载自my.oschina.net/u/3698786/blog/1801548