안드로이드 비주얼 최적화 - 스트레칭 애니메이션
블로그를 배우기 시작한 것은 한 BAT 대신이 쓴 글을 보고 느낀 데서 비롯되었다. 지금까지 머리를 쓰지 않고 필기를 했기 때문에 이것이 사실이라는 것을 인정하지 않을 수 없었기 때문에 생각해 보면 옳다.본인은 총명한 편은 아니니, 부지런하면 졸렬함을 보충할 수 있기를 바랍니다.왜 애니메이션을 씁니까?
일을 처음 접한 많은 학우들도 감명을 받았다고 믿는다. 애니메이션이라는 것은 멋있어 보이고 자기가 쓰기가 어려워진다. 마지막에 자신이 도대체 기술적인 문제인지 심미적인 문제인지 의심해야 한다.어쨌든 구덩이를 밟았다는 믿음도 적지 않다.이 아이도 피해자 중 한 명이니 쓸데없는 말 없이 바로 본론으로 들어간다.
먼저, Android 애니메이션은 트윈 애니메이션, 속성 애니메이션, 프레임 애니메이션 등 크게 세 가지로 나눌 수 있습니다.후자가 사용하는 장면은 매우 적다.가장 많이 사용된 것은 앞의 두 가지인데 그 중에서 속성 애니메이션은 공식 API에서 API 14, 즉 안드로이드 4.0까지만 지원한다.물론 유대신은 API14 이하의 호환 패키지를 제시했고 사용법은 거의 일치했다.가장 많이 사용된 것은 앞의 두 가지인데 그 중에서 속성 애니메이션은 공식 API에서 API 14, 즉 안드로이드 4.0까지만 지원한다.물론 유대신은 API14 이하의 호환 패키지를 제시했고 사용법은 거의 일치했다.NineOldAndroids 속성 애니메이션.
그러면 개발 중 어떤view의 높이를 다시 설정하려면 일반적인 방법은
ViewGroup.LayoutParams params = content.getLayoutParams();
params.height=value;
content.setLayoutParams(params);
콘텐츠 리셋의 높이를 실현하지만, 실제 기기에서는 효과가 그리 좋지 않다. 환상적이고 딱딱한 느낌이 든다.그러면 여기서 속성 애니메이션을 사용하여 이 문제를 해결할 수 있다.
왜 모션 트윈을 사용하지 않습니까?모션 트윈을 사용하는 경우 스트레칭도 가능합니다.이때 두 가지 문제가 발생한다.
첫째, 트윈 애니메이션은 시각적으로 당신이 원하는 애니메이션 효과를 얻었지만 실행하는 과정에서 프로그램 내부에서 onmeasure()와 onlayout()를 호출하지 않았고 ondraw()만 호출했다. 즉, 이때 당신이 본 것은 당신이 본 것이 아니라 속성이 변하지 않았다는 것이다.view의 top,left,right.bottom 네 개의 속성은 변하지 않았습니다.
둘째, 이 문제의 출현도 첫 번째 원인이다. 애니메이션을 하는view 주위의 모든view는 그 위치가 애니메이션view의 위치나 모양의 변화에 따라 바뀌지 않는다. 이것은 큰 문제이기 때문에 트윈 애니메이션을 사용하지 않고 속성 애니메이션을 사용한다.
네, BB 그만하세요. 코드 드셔보세요...
메인 인터페이스는 activitymain.xml은LinearLayout으로 3개의 View, 제목 View, 스트레칭 내용 View, 끝부분 View를 감싸고 있습니다.
<pre name="code" class="html"><?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent"
tools:context="com.demotest.testdemo.MainActivity">
<RelativeLayout
android:id="@+id/toggle"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="40dp"
android:gravity="center_vertical"
android:background="#cccccc"
android:text=" "/>
<ImageView
android:id="@+id/arrow"
android:layout_width="20dp"
android:layout_centerVertical="true"
android:layout_alignParentRight="true"
android:layout_marginRight="10dp"
android:layout_height="20dp"
android:src="@drawable/down_arrow"/>
</RelativeLayout>
<LinearLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:background="#666666"
android:textColor="#ffffff"
android:text="Hello World!"
android:orientation="horizontal"/>
<TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center_vertical"
android:background="#ff0000"
android:textColor="#ffffff"
android:text=" "/>
</LinearLayout>
</pre><pre>
4
在MainActivity的onCreate方法中,初始化view,初始化动画content的初始状态。点击标题,content响应:애니메이션 프로세스 감청기를 등록하고 LayoutParams의 Height 속성을 끊임없이 설정한다.스트레칭 효과 구현.private void toggleContent(boolean animation) { content.measure(0, 0); // int measuredHeight = content.getMeasuredHeight(); if (isOpen) { //1. if (animation) { // -- int start = measuredHeight; int end = 0; ValueAnimator animator = ValueAnimator.ofInt(start, end); animator.setDuration(400); animator.addUpdateListener(animationListener); animator.start(); //2. ObjectAnimator.ofFloat(arrow, "rotation", -180, 0).setDuration(400).start(); } else { // ViewGroup.LayoutParams params = content.getLayoutParams(); params.height = 0; content.setLayoutParams(params); arrow.setRotation(0); } } else { //1. if (animation) { // -- int start = 0; int end = measuredHeight; ValueAnimator animator = ValueAnimator.ofInt(start, end); animator.setDuration(400); animator.addUpdateListener(animationListener); animator.start(); //2. ObjectAnimator.ofFloat(arrow, "rotation", 0, 180).setDuration(400).start(); } else { // ViewGroup.LayoutParams params = content.getLayoutParams(); params.height = measuredHeight; content.setLayoutParams(params); arrow.setRotation(180); } } isOpen = !isOpen; }
private ValueAnimator.AnimatorUpdateListener animationListener = new android.animation.ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { int value = (int) animation.getAnimatedValue(); ViewGroup.LayoutParams params = content.getLayoutParams(); params.height = value; content.setLayoutParams(params); } };
효과 보기:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
SwiftUI에서 Lottie를 사용하여 풍부한 애니메이션을 쉽게 실현해보세요이하의 기사를 이전 썼지만, 최근 SwiftUI를 사용해 Lottie를 이용했으므로 그 방법에 대해서 써 간다. Lottie에 관한 설명은 여러가지 기사에서도 되고 있으므로 여기서는 언급하지 말고, SwiftUI상에...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.