自定义隐藏字体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);
}
}
}