在一個(gè)列表顯示消息時(shí)帝洪,文本過(guò)多需要進(jìn)行收縮顯示,點(diǎn)擊顯示全部時(shí)在展開(kāi)辩涝!先看下效果圖
文本內(nèi)容我是便輸入的,當(dāng)點(diǎn)擊查看全部時(shí)會(huì)顯示全部?jī)?nèi)容勘天,這邊我是設(shè)置做多顯示三行怔揩!主要一個(gè)類(lèi),如下
```
importandroid.animation.Animator;
importandroid.animation.ValueAnimator;
importandroid.content.Context;
importandroid.content.res.TypedArray;
importandroid.graphics.Bitmap;
importandroid.graphics.BitmapFactory;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.support.annotation.Nullable;
importandroid.text.Layout;
importandroid.text.SpannableString;
importandroid.text.Spanned;
importandroid.text.StaticLayout;
importandroid.text.TextPaint;
importandroid.text.method.LinkMovementMethod;
importandroid.text.style.ClickableSpan;
importandroid.text.style.ForegroundColorSpan;
importandroid.util.AttributeSet;
importandroid.util.TypedValue;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.widget.RelativeLayout;
importandroid.widget.TextView;
importcom.mocoo.ezc.R;
importcom.mocoo.ezc.utils.DensityUtil;
/**
* Created by necer on 2017/4/10.
*/
public classExpandTextViewextendsRelativeLayoutimplementsView.OnClickListener {
privateTextViewmTextView;
privateTextPaintmTextPaint;//textView的畫(huà)筆
private intmTextColor;//顏色
private floatmTextSize;//大小
private intmShowLineNum=3;//顯示的最大行數(shù)
privateBitmapmUpBitmap,mDownBitmap;//指示箭頭
private intbitmapTop;//bitmap距頂部的距離
private intbitmapWith;//bitmap寬
private intbitmaphith;//bitmap寬
privatePaintmPain;//畫(huà)指示箭頭
private intfoldHeight;//折疊后的高度
private inttrueHeight;//真實(shí)高度
private intlineHeight;//Textview行數(shù)行高
private intlineCount;//Textview行數(shù)
privateStringmText;//原始數(shù)據(jù)
privateStringmFoldText;//折疊的數(shù)據(jù)
private booleanisFoldEnable=false;//是否可以折疊
private booleanisFold=true;//是否折疊
private booleanisEnough=true;//最后一行是否能容納箭頭
private booleanisDown;//箭頭指向
private floatbitmapRightOffset;//箭頭距離view右邊的距離
private intmDuration;//動(dòng)畫(huà)時(shí)間,默認(rèn)300
publicExpandTextView(Context context) {
this(context, null);
}
publicExpandTextView(Context context,@NullableAttributeSet attrs) {
this(context,attrs,0);
}
publicExpandTextView(Context context,@NullableAttributeSet attrs, intdefStyleAttr) {
super(context,attrs,defStyleAttr);
TypedArray ta = context.obtainStyledAttributes(attrs,R.styleable.ExpandTextview);
mDuration= ta.getInteger(R.styleable.ExpandTextview_duration,300);
bitmapRightOffset= ta.getDimension(R.styleable.ExpandTextview_bitmapRightOffet,DensityUtil.dip2px(getContext(),10));
mTextColor= ta.getColor(R.styleable.ExpandTextview_textColor,Color.parseColor("#000000"));
mTextSize= ta.getDimension(R.styleable.ExpandTextview_textSize,DensityUtil.dip2px(getContext(),14));
mShowLineNum= ta.getInteger(R.styleable.ExpandTextview_showLine,3);
ta.recycle();
mTextView=newTextView(getContext());
mTextView.setTextSize(TypedValue.COMPLEX_UNIT_PX,mTextSize);
mTextView.setTextColor(mTextColor);
mTextPaint=mTextView.getPaint();
addView(mTextView);
mTextView.setOnClickListener(this);
mPain=newPaint();
mPain.setColor(getResources().getColor(R.color.theme_color));
mPain.setTextSize(40f);
mUpBitmap= BitmapFactory.decodeResource(getResources(),R.drawable.abc);
mDownBitmap= BitmapFactory.decodeResource(getResources(),R.drawable.abc);
bitmapWith=mUpBitmap.getWidth();
bitmaphith=mUpBitmap.getHeight();
}
public voidsetText(String text) {
this.mText= text;
post(newRunnable() {
@Override
public voidrun() {
dealText();
}
});
}
//要在post里面進(jìn)行脯丝,不然getWidth()得不到view的寬商膊,就無(wú)法正確得到字符串的行數(shù)
private voiddealText() {
StaticLayout staticLayout =newStaticLayout(mText,mTextPaint,getWidth() - getPaddingLeft() - getPaddingRight(),Layout.Alignment.ALIGN_NORMAL,1.0f,0f, true);
lineCount= staticLayout.getLineCount();
lineHeight= staticLayout.getHeight() /lineCount;
isFoldEnable=lineCount>mShowLineNum;
if(isFoldEnable) {
intstart = staticLayout.getLineStart(mShowLineNum-1);
intend = staticLayout.getLineEnd(mShowLineNum-1);
//獲取最后一行的內(nèi)容
String endText =mText.substring(start,end);
mFoldText=mText.substring(0,start) + endText.substring(0,endText.length() -5) +"···";
intlineWidth = (int) staticLayout.getLineWidth(lineCount-1);
isEnough= getWidth() - lineWidth - getPaddingLeft() - getPaddingRight() > (bitmapWith+bitmapRightOffset);
//能容納真實(shí)高度為textview的高度,不能容納宠进,真實(shí)高度為textview高度+一個(gè)行高晕拆,放箭頭
trueHeight=isEnough? staticLayout.getHeight() : staticLayout.getHeight() +lineHeight;
foldHeight=lineHeight*mShowLineNum;
if(isFold) {
bitmapTop=foldHeight-lineHeight/2;//bitmap開(kāi)始的位置,讓箭頭在一行的中間
String str=mFoldText+"查看全部";
mTextView.setText(getClickableSpan(str,mFoldText));
//此行必須有
mTextView.setMovementMethod(LinkMovementMethod.getInstance());
}else{
bitmapTop=trueHeight-lineHeight/2;
mTextView.setText(mText);
}
}else{
mTextView.setText(mText);
}
}
@Override
protected voidonDraw(Canvas canvas) {
super.onDraw(canvas);
if(!isFoldEnable) {
return;
}
}
public voidstartAnim(intstarHeight, intendHeight,Animator.AnimatorListener animatorListener) {
finalViewGroup.LayoutParams layoutParams =mTextView.getLayoutParams();
ValueAnimator valueAnimator = ValueAnimator.ofInt(starHeight,endHeight);
valueAnimator.addUpdateListener(newValueAnimator.AnimatorUpdateListener() {
@Override
public voidonAnimationUpdate(ValueAnimator valueAnimator) {
layoutParams.height= (int) valueAnimator.getAnimatedValue();
mTextView.setLayoutParams(layoutParams);
bitmapTop= (int) valueAnimator.getAnimatedValue() -lineHeight/2;
}
});
valueAnimator.addListener(animatorListener);
valueAnimator.setDuration(mDuration);
valueAnimator.start();
}
privateSpannableStringgetClickableSpan(String str1,String str2) {
//監(jiān)聽(tīng)器
View.OnClickListener listener =newView.OnClickListener() {
@Override
public voidonClick(View v) {
if(!isFoldEnable) {
return;
}
if(ButtonUtils.isFastClick(mDuration)) {
return;
}
if(isFold) {
isFold=false;
mTextView.setText(mText);
startAnim(foldHeight,trueHeight, newAnimator.AnimatorListener() {
@Override
public voidonAnimationStart(Animator animator) {
isDown=true;
}
@Override
public voidonAnimationEnd(Animator animator) {
}
@Override
public voidonAnimationCancel(Animator animator) {
}
@Override
public voidonAnimationRepeat(Animator animator) {
}
});
}
}
};
SpannableString spanableInfo =newSpannableString(str1);
intstart = str2.length();//超鏈接起始位置
intend = str1.length();//超鏈接結(jié)束位置
//可以為多部分設(shè)置超鏈接
spanableInfo.setSpan(newClickable(listener),start,end,Spanned.SPAN_MARK_MARK);
spanableInfo.setSpan(newForegroundColorSpan(getResources().getColor(R.color.theme_color)),start,end,Spanned.SPAN_MARK_MARK);
returnspanableInfo;
}
@Override
public voidonClick(View view) {
}
classClickableextendsClickableSpanimplementsView.OnClickListener {
private finalView.OnClickListenermListener;
publicClickable(View.OnClickListener listener) {
mListener= listener;
}
@Override
public voidonClick(View view) {
mListener.onClick(view);
}
@Override
public voidupdateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);
}
}
實(shí)現(xiàn)方法主要用超鏈接的方法實(shí)現(xiàn)的,對(duì)“查看全部”這四個(gè)字進(jìn)行監(jiān)聽(tīng)點(diǎn)擊時(shí)材蹬,展開(kāi)全部?jī)?nèi)容
public classButtonUtils {
private static longlastClickTime;
public synchronized static booleanisFastClick(longduration) {
longtime = System.currentTimeMillis();
if(time -lastClickTime< duration) {
return true;
}
lastClickTime= time;
return false;
}
}
```