Android 텍스트 뒤 집기 애니메이션 효과 구현
7469 단어 android뒤 집기 애니메이션
먼저 효과 도 는 다음 과 같다.
요청:
Y 축의 정방 향 을 따라 보면 수치 가 1 을 줄 일 때 애니메이션 이 시계 반대 방향 으로 회전 하고 수치 가 1 을 더 하면 애니메이션 이 시계 반대 방향 으로 회전 합 니 다.
애니메이션 을 실현 하 는 구체 적 인 세부 사항 은'RotateAnimation.Java'를 보십시오.애니메이션 회전 방향 을 편리 하 게 보기 위해 RotateAnimation.DEBUG 값 을 true 로 설정 하면 됩 니 다.
RotateAnimation 은 APIDemos 의 Rotate3DAnimation 을 참고 합 니 다.
RotateAnimation 의 구조 함 수 는 애니메이션 구성 요소 의 중심 점 위치 와 회전 방향 을 설명 하 는 세 가지 매개 변수 가 필요 합 니 다.
RotateAnimation.initialize()는 애니메이션 구성 요소 와 부모 용기 의 폭 을 초기 화 합 니 다.일반적으로 다른 초기 화 작업 도 할 수 있 으 며,이 예 는 camera 에 대한 예화 대 가 를 수행 하 는 데 사 용 됩 니 다.
RotateAnimation.apply Transformation()의 첫 번 째 매개 변 수 는 애니메이션 의 진도 시간 값 이 고 수치 범 위 는[0.0f,1.0f]이 며 두 번 째 매개 변 수 는 Transformation 은 애니메이션 의 특정한 프레임 에서 변 형 된 원시 데 이 터 를 기록 하고 있다.이 방법 은 애니메이션 의 모든 프레임 디 스 플레이 과정 에서 호출 된다.
뒤 집기 과정 에서 애니메이션 의 후반 부분 에서 이미지 가 거울 효과 로 인해 숫자의 읽 기 에 영향 을 주지 않도록 뒤 집기 각 도 를 180 도 줄 여야 한다.코드
RotateAnimation.applyTransformation() :
if (overHalf) {
// , , 180 。
degree = degree - 180;
}
애니메이션 을 반 으로 뒤 집 으 면 숫자 내용 을 업데이트 해 야 합 니 다.반전 진 도 를 알 기 위해 Rotate Animation 에서 내부 정적 인터페이스 류 인'Interpolated TimeListener'를 설계 합 니 다.이 인 터 페 이 스 는'interpolated Time(float interpolated Time)'만 이 애니메이션 진 도 를 감청 발기인 에 게 전달 할 수 있 습 니 다.자바 코드 는 다음 과 같 습 니 다.XML 은 효과 도 에 따라 자체 적 으로 실현 하 십시오.
ActRotate.java
package lab.sodino.rotate;
import lab.sodino.rotate.RotateAnimation.InterpolatedTimeListener;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;
/**
* @author Sodino E-mail:[email protected]
* @version Time:2012-6-27 07:32:00
*/
public class ActRotate extends Activity implements OnClickListener, InterpolatedTimeListener {
private Button btnIncrease, btnDecrease;
private TextView txtNumber;
private int number;
/** TextNumber 。 */
private boolean enableRefresh;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnIncrease = (Button) findViewById(R.id.btnIncrease);
btnDecrease = (Button) findViewById(R.id.btnDecrease);
txtNumber = (TextView) findViewById(R.id.txtNumber);
btnIncrease.setOnClickListener(this);
btnDecrease.setOnClickListener(this);
number = 3;
txtNumber = (TextView) findViewById(R.id.txtNumber);
txtNumber.setText(Integer.toString(number));
}
public void onClick(View v) {
enableRefresh = true;
RotateAnimation rotateAnim = null;
float cX = txtNumber.getWidth() / 2.0f;
float cY = txtNumber.getHeight() / 2.0f;
if (v == btnDecrease) {
number--;
rotateAnim = new RotateAnimation(cX, cY, RotateAnimation.ROTATE_DECREASE);
} else if (v == btnIncrease) {
number++;
rotateAnim = new RotateAnimation(cX, cY, RotateAnimation.ROTATE_INCREASE);
}
if (rotateAnim != null) {
rotateAnim.setInterpolatedTimeListener(this);
rotateAnim.setFillAfter(true);
txtNumber.startAnimation(rotateAnim);
}
}
@Override
public void interpolatedTime(float interpolatedTime) {
// , txtNumber 。
if (enableRefresh && interpolatedTime > 0.5f) {
txtNumber.setText(Integer.toString(number));
Log.d("ANDROID_LAB", "setNumber:" + number);
enableRefresh = false;
}
}
}
RotateAnimation.java
import android.view.animation.Animation;
import android.view.animation.Transformation;
/**
* @author Sodino E-mail:[email protected]
* @version Time:2012-6-27 07:32:00
*/
public class RotateAnimation extends Animation {
/** true 。 */
public static final boolean DEBUG = false;
/** Y , 1 。 */
public static final boolean ROTATE_DECREASE = true;
/** Y , 1 。 */
public static final boolean ROTATE_INCREASE = false;
/** Z 。 */
public static final float DEPTH_Z = 310.0f;
/** 。 */
public static final long DURATION = 800l;
/** 。 */
private final boolean type;
private final float centerX;
private final float centerY;
private Camera camera;
/** 。 txtNumber 。 */
private InterpolatedTimeListener listener;
public RotateAnimation(float cX, float cY, boolean type) {
centerX = cX;
centerY = cY;
this.type = type;
setDuration(DURATION);
}
public void initialize(int width, int height, int parentWidth, int parentHeight) {
// 、getTransformation() 。
super.initialize(width, height, parentWidth, parentHeight);
camera = new Camera();
}
public void setInterpolatedTimeListener(InterpolatedTimeListener listener) {
this.listener = listener;
}
protected void applyTransformation(float interpolatedTime, Transformation transformation) {
// interpolatedTime: , [0.0f,10.f]
if (listener != null) {
listener.interpolatedTime(interpolatedTime);
}
float from = 0.0f, to = 0.0f;
if (type == ROTATE_DECREASE) {
from = 0.0f;
to = 180.0f;
} else if (type == ROTATE_INCREASE) {
from = 360.0f;
to = 180.0f;
}
float degree = from + (to - from) * interpolatedTime;
boolean overHalf = (interpolatedTime > 0.5f);
if (overHalf) {
// , , 180 。
degree = degree - 180;
}
// float depth = 0.0f;
float depth = (0.5f - Math.abs(interpolatedTime - 0.5f)) * DEPTH_Z;
final Matrix matrix = transformation.getMatrix();
camera.save();
camera.translate(0.0f, 0.0f, depth);
camera.rotateY(degree);
camera.getMatrix(matrix);
camera.restore();
if (DEBUG) {
if (overHalf) {
matrix.preTranslate(-centerX * 2, -centerY);
matrix.postTranslate(centerX * 2, centerY);
}
} else {
//
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
}
/** 。 */
public static interface InterpolatedTimeListener {
public void interpolatedTime(float interpolatedTime);
}
}
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Kotlin의 기초 - 2부지난 글에서는 Kotlin이 무엇인지, Kotlin의 특징, Kotlin에서 변수 및 데이터 유형을 선언하는 방법과 같은 Kotlin의 기본 개념에 대해 배웠습니다. 유형 변환은 데이터 변수의 한 유형을 다른 데이터...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.