Roate3dAnimation 實現了圍繞y軸豎直方向 或者繞x軸方向旋轉的3d動畫效果。這個例子來
自Android APIDemo中的一個自定義View動畫。他的實現展示自定義View動畫的基本步驟。
主要是重寫initialize方法,applyTransformation方法。
分析:
在Roate3dAnimation中,我們使用Android.graphic.Camera實現3d效果。
對Camera不熟悉的可看看 android.graphic.Camera 。
public classRotate3dAnimationextendsAnimation {
???//開始角度
???private floatstartDegree;
???//結束角度
???private floatendDegree;
/**
* 這個旋轉動畫圍繞在2D空間的中心點執行.你可以用X軸坐標(叫做centerX)和Y軸(叫做centerY)
* 坐標來定義這個中心點
*/
???private floatcenterX;
???private floatcenterY;
/**
* 控制鏡頭景深,不需要的話給0值即可
* mReverse 為true,表示反方向,false 表示正方向
*/
???private floatdeepZ;
???private booleanmReverse;
//用于輔助實現3d效果。
???privateCameramCamera;
//X軸方向,或Y軸方向
???enumDIRECTION {
??????X,Y
???}
???DIRECTIONdirection= DIRECTION.Y;
???Rotate3dAnimation(floatfromDegree,floattoDegree,floatcenterX,
???floatcenterY,floatdeepZ,booleanreverse) {
???this.startDegree= fromDegree;
???this.endDegree= toDegree;
???this.centerX= centerX;
???this.centerY= centerY;
???this.deepZ= deepZ;
???this.mReverse= reverse;
}
???Rotate3dAnimation(floatfromDegree,floattoDegree,floatcenterX,
???floatcenterY,floatdeepZ,booleanreverse, DIRECTION direction) {
???this.startDegree= fromDegree;
???this.endDegree= toDegree;
???this.centerX= centerX;
???this.centerY= centerY;
???this.deepZ= deepZ;
???this.mReverse= reverse;
???this.direction= direction;
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
???super.initialize(width, height, parentWidth, parentHeight);
???mCamera=newCamera();
}
@Override
protected void applyTransformation( float int erpolatedTime, Transformation t) {
???super.applyTransformation(interpolatedTime, t);
???float fromDegree =startDegree;
???float degree = fromDegree + (endDegree-startDegree) * interpolatedTime;
???finalMatrix matrix = t.getMatrix();
???mCamera.save();
???if(mReverse) {
??????mCamera.translate(0, 0, deepZ* interpolatedTime);
???}else{
??????mCamera.translate(0, 0, deepZ* (1- interpolatedTime));
???}
???if(direction== DIRECTION.Y) {
??????mCamera.rotateY(degree);
???}else{
??????mCamera.rotateX(degree);
???}
???mCamera.getMatrix(matrix);
???mCamera.restore();
???matrix.preTranslate(-centerX, -centerY);
???matrix.postTranslate(centerX,centerY);
???}
}
應用:
iv_content.post(new Runnable() {
@Override
public void run() {
???Rotate3dAnimation rotate3dAnimation = new Rotate3dAnimation(0, 360, iv_content.getWidth()/2,
???0, 0, true, Rotate3dAnimation.DIRECTION.Y);
???rotate3dAnimation.setDuration(3000);
???iv_content.setAnimation(rotate3dAnimation);
???rotate3dAnimation.start();
???}
});
原文鏈接: