Android 애니메이션 효과 구현 클릭 하여 TextView 펼 치기

본 고 는 안 드 로 이 드 가 애니메이션 효 과 를 실현 하 는 클릭 으로 TextView 제작 코드,효과 도 를 공유 했다.
닫 기(기본)효과:
这里写图片描述
클릭 하여 펼 친 효과:

원본 코드:
레이아웃:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 android:id="@+id/activity_main"
 xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
 >

 <ScrollView
  android:id="@+id/sv"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  >

  <LinearLayout
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="#f6f6f6"
   android:orientation="vertical"
   android:padding="5dp">

   <TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"

    android:maxLines="1"
    android:text="  "
    android:textColor="#000000"
    android:textSize="20sp"/>

   <TextView
    android:id="@+id/tv_des"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textColor="#666666"
    android:textSize="18sp"/>

   <RelativeLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="5dp"
    android:gravity="center_vertical"
    android:orientation="horizontal">

    <ImageView
     android:id="@+id/iv_des_arrow"
     android:layout_width="20dp"
     android:layout_height="20dp"
     android:layout_alignParentEnd="true"
     android:background="@mipmap/arrow_down"/>
   </RelativeLayout>

  </LinearLayout>

 </ScrollView>
</LinearLayout>

기능 구현:

package com.cnfol.demo;

import android.animation.Animator;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.ImageView;
import android.widget.ScrollView;
import android.widget.TextView;

public class MainActivity extends Activity implements View.OnClickListener {

 private TextView tv_des;

 private ImageView iv_des_arrow;

 private boolean isExpandDes = false;//        

 private int minHeight = 0;
 private int maxHeight = 0;

 private ScrollView scrollView;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  scrollView = (ScrollView) findViewById(R.id.sv);

  tv_des = (TextView) findViewById(R.id.tv_des);
  tv_des.setOnClickListener(this);

  iv_des_arrow = (ImageView) findViewById(R.id.iv_des_arrow);
  iv_des_arrow.setOnClickListener(this);

  String s = "       ,    ,      ,     ,         、                      。
" + "
" + "1949 ( )10 1 , , 《 》 , 、 、 , , 23 、5 、4 、2 , , 56 , 91.51%。
" + "
" + " ,1953 , 1956 , 。 , 。 960 , 1.8 , 1.4 , 470 。 7600 , , 35798 。 14 , 8 。 , 。 , , 、 、 、 。
" + "
" + " , , , , 。"; tv_des.setText(s); tv_des.setMaxLines(3); tv_des.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // , tv_des.getViewTreeObserver().removeGlobalOnLayoutListener(this); minHeight = tv_des.getMeasuredHeight();// 3 tv_des.setMaxLines(Integer.MAX_VALUE);// tv_des.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() { @Override public void onGlobalLayout() { // , tv_des.getViewTreeObserver().removeGlobalOnLayoutListener(this); maxHeight = tv_des.getMeasuredHeight();// if (minHeight == maxHeight) { // 。 , iv_des_arrow.setVisibility(View.GONE); } tv_des.getLayoutParams().height = minHeight; tv_des.requestLayout();// tv_des 3 } }); } }); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.tv_des: case R.id.iv_des_arrow: ValueAnimator desAnimator = null; if (isExpandDes) { desAnimator = ValueAnimator.ofInt(maxHeight, minHeight); } else { desAnimator = ValueAnimator.ofInt(minHeight, maxHeight); } desAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animator) { int currentHeight = (Integer) animator.getAnimatedValue(); tv_des.getLayoutParams().height = currentHeight; tv_des.requestLayout(); // , if (!isExpandDes) { int scrollY = currentHeight - minHeight; scrollView.scrollBy(0, scrollY); } } }); desAnimator.setDuration(300); desAnimator.addListener(new DesAnimListener()); desAnimator.start(); break; } } /** * * * @author Administrator */ class DesAnimListener implements Animator.AnimatorListener { @Override public void onAnimationCancel(Animator arg0) { } @Override public void onAnimationEnd(Animator arg0) { isExpandDes = !isExpandDes; iv_des_arrow.setBackgroundResource(isExpandDes ? R.mipmap.arrow_up : R.mipmap.arrow_down); } @Override public void onAnimationRepeat(Animator arg0) { } @Override public void onAnimationStart(Animator arg0) { } } }
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기