1. 程式人生 > >縮放文本框ExpandTextView

縮放文本框ExpandTextView

span value pda ron ddl protect private ssi rac

效果圖:

技術分享

代碼:

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.DecelerateInterpolator;
import
android.widget.LinearLayout; import android.widget.TextView; /** * Created by pengkv on 16/1/11. */ public class ExpandTextView extends TextView implements View.OnClickListener { private int mMaxCount;//記錄文本框的最大行數 private boolean isSinleLine = true;//是否是單行顯示 private boolean isFitst = true;//是否是第一次測量
public ExpandTextView(Context context) { super(context); setOnClickListener(this); } public ExpandTextView(Context context, AttributeSet attrs) { super(context, attrs); setOnClickListener(this); } public ExpandTextView(Context context, AttributeSet attrs, int
defStyleAttr) { super(context, attrs, defStyleAttr); setOnClickListener(this); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (isFitst) {//假設是第一次測量,記錄最大行數。測量後設置成單行 mMaxCount = getLineCount(); setEllipsize(TextUtils.TruncateAt.END); setSingleLine(); isFitst = false; } } @Override public void onClick(View v) { ValueAnimator animator; final LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) getLayoutParams(); if (isSinleLine) {//設置展開動畫的位移 setSingleLine(false); animator = ValueAnimator.ofInt(getLineHeight(), mMaxCount * getLineHeight()); } else {//設置收縮動畫的位移 animator = ValueAnimator.ofInt(mMaxCount * getLineHeight(), getLineHeight()); } //屬性動畫的使用方法 animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { params.height = (int) animation.getAnimatedValue(); setLayoutParams(params); } }); animator.setInterpolator(new DecelerateInterpolator()); animator.setDuration(300); animator.setTarget(this); animator.start(); animator.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); if (!isSinleLine) {//在動畫結束後設置成單行,避免效果異常 setSingleLine(); } isSinleLine = !isSinleLine; } }); } }

XML使用:

//註意:不要在xml的view.ExpandTextView裏面定義singleLine、ellipsize屬性,否則會異常
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="10dp">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:text="@string/str1"
        android:textSize="18sp" />

    <view.ExpandTextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="10dp"
        android:text="@string/str2"
        android:textColor="#edd206"
        android:textSize="18sp" />

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/str3"
        android:textSize="18sp" />

</LinearLayout>

Tip:

代碼中涉及到的屬性動畫建議參考這裏。

優化:

//點擊事件的處理能夠換成以下這樣的更簡潔的方式。

    @Override
    public void onClick(View v) {

        final ObjectAnimator animator;
        if (isSinleLine) {
            setSingleLine(false);
            animator = ObjectAnimator.ofInt(this, "height", getLineHeight(), mMaxCount * getLineHeight());
        } else {
            animator = ObjectAnimator.ofInt(this, "height", mMaxCount * getLineHeight(), getLineHeight());
        }

        animator.setDuration(300).start();
        animator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                if (!isSinleLine) {//在動畫結束後設置成單行,避免效果異常
                    setSingleLine();
                }
                isSinleLine = !isSinleLine;
            }
        });
    }

縮放文本框ExpandTextView