Android 애니메이션 효과 구현 클릭 하여 TextView 펼 치기
7373 단어 Android클릭 하여 펼 치기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) {
}
}
}
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.