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