自定義伸縮TextView效果圖 如下:
伸縮效果的思路
1.設(shè)置初始的高度 2.設(shè)置展開(kāi)的高度 3.伸縮的動(dòng)畫(huà)效果
創(chuàng)建R.layout.cookdetail_item_desc布局
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/framelayout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:lineSpacingMultiplier="1.1"
android:text="內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容內(nèi)容"
android:textSize="@dimen/res_textsize_15sp"
android:layout_marginBottom="18dp"
/>
<ImageView
android:id="@+id/detail_desc_folding_imageview"
android:layout_width="18dp"
android:layout_height="18dp"
android:layout_gravity="bottom|center|right"
android:background="@drawable/ic_public_arrow_down" />
</FrameLayout>
創(chuàng)建一個(gè)FoldingTextView 繼承 LinearLayout 做一次初始化
public class FoldingTextView extends LinearLayout implements View.OnClickListener {
private TextView tv_content;
private ImageView folding_imageview;
public FoldingTextView(Context context) {
this(context, null);
}
public FoldingTextView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public FoldingTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
private void initView(Context context) {
setOrientation(VERTICAL);
View view = View.inflate(context, R.layout.cookdetail_item_desc, null);
tv_content = view.findViewById(R.id.tv_content);
folding_imageview = view.findViewById(R.id.detail_desc_folding_imageview);
folding_imageview.setOnClickListener(this);
addView(view);
}
按照剛剛的思路 第一步先設(shè)置開(kāi)始的高度
public int initHeight() {
int measuredWidth = tv_content.getMeasuredWidth();
TextView textView = new TextView(getContext());
textView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 15);
int width = MeasureSpec.makeMeasureSpec(measuredWidth, MeasureSpec.EXACTLY);
textView.setMaxLines(3);
textView.setLines(3);
int height = MeasureSpec.makeMeasureSpec(2000, MeasureSpec.AT_MOST);
textView.measure(width, height);
return textView.getMeasuredHeight();
}
通過(guò)new TextView,得到textView,設(shè)置setMaxLines(3),setLines(3),
設(shè)置初始的高度,獲取textview的高度要先通過(guò)測(cè)量textView.measure(width, height);才能獲取textView.getMeasuredHeight()的值俭嘁,不然為空
第二步 設(shè)置伸開(kāi)的高度
public int maxHeight() {
int measuredWidth = tv_content.getMeasuredWidth();
int width = MeasureSpec.makeMeasureSpec(measuredWidth, MeasureSpec.EXACTLY);
int height = MeasureSpec.makeMeasureSpec(2000, MeasureSpec.AT_MOST);
tv_content.measure(width, height);
return tv_content.getMeasuredHeight();
}
為什么不使用tv_content,而要?jiǎng)?chuàng)建一個(gè)TextView來(lái)設(shè)置開(kāi)始的高度劲室?
如果使用tv_content設(shè)置開(kāi)始的高度仿耽,設(shè)置的最大行數(shù)岩榆。到展開(kāi)的時(shí)候也要再次設(shè)置一次setMaxline色徘,還有一個(gè)可能伸縮的效果產(chǎn)生影響
第三步 通過(guò)動(dòng)畫(huà)ValueAnimator來(lái)完成伸縮效果
public void expand() {
int startHeight = 0;
int endHeight = 0;
if (!isExpand) {
startHeight = initHeight();
endHeight = maxHeight();
isExpand = true;
} else {
startHeight = maxHeight();
endHeight = initHeight();
isExpand = false;
}
final ViewGroup.LayoutParams params = tv_content.getLayoutParams();
ValueAnimator animator = ValueAnimator.ofInt(startHeight, endHeight);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int value = (int) animation.getAnimatedValue();
params.height = value;
tv_content.setLayoutParams(params);
}
});
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
if (isExpand) {
folding_imageview.setBackgroundResource(R.drawable.ic_public_arrow_up);
} else {
folding_imageview.setBackgroundResource(R.drawable.ic_public_arrow_down);
}
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
animator.setDuration(300);
animator.start();
}
完成恭金,收工!9硬摺横腿!