Android变形(Transform) 之 3D Animation

引言
了解MatrixCamera的使用,本章主要总结自定义动画(Animation),最后通过一个3D动画来综合应用。对于Animation的基本使用以及种类不做细讲,希望
 
Animation
动画说白了就是在一个时间段,改变一个目标的视图状态。
---
example:1秒钟内,让一个图片的透明度从1编程0.5
1.设置时间-1秒钟,对于抽象类Animation直接提供setDuration(long milis)方法进行设置
2.执行目标,View提供startAnimation(Animation anim)方法执行动画
3.改变状态视图,动画的多样化就是改变视图的各种状态,可以分为透明度,坐标矩阵俩种,坐标矩阵就可以引申出位移,旋转,缩放等等变形了。
---
Animation里面提供一个自定义动画行为的方法 applyTransformation (float interprolatedTime, Transformation t)
float型参数interprolatedTime代表动画的插值,动画开始为0,动画结束为1,所有的动画行为可以从这个值的变化引申出自定义的各种动画
Transformation类型的参数t表示当前动画目标的行为状态,可以通过getMatrix和setMatrix方法对目标的坐标矩阵进行获取和设置,通过setAlpha对其透明度进行设置
---
下面是example的代码实现:
 1  public  class CustomAnimation  extends Animation {
 2 
 3      float mFromAlpha, mToAlpha;
 4     
 5      public CustomAnimation( float fromAlpha,  float toAlpha) {
 6         mFromAlpha = fromAlpha;
 7         mToAlpha = toAlpha;
 8     }
 9     
10     @Override
11      protected  void applyTransformation( float interpolatedTime, Transformation t) {
12         t.setAlpha(mFromAlpha + (mToAlpha - mFromAlpha) * interpolatedTime);
13          super.applyTransformation(interpolatedTime, t);
14     }
15 }
调用代码:
1             CustomAnimation anim =  new CustomAnimation(0.5f, 1f);
2             anim.setDuration(300);
3             anim.setInterpolator( new AccelerateInterpolator());
4             img.startAnimation(anim);
setInterpolator方法为设置动画行为控制器,例如线性运动,加速运动,曲线运动等等。
上述一个简单的自定义动画就完成。
 
3D Animation
看下3D动画的实现
 1  public  class Custom3DAnimation  extends Animation {
 2      public  static  final  int AXIS_Y = 0;
 3      public  static  final  int AXIS_X = 1;
 4 
 5      float mCenterX, mCenterY;
 6      float mFromDegree, mToDegree, mDistanceZ;
 7      int mAxis = AXIS_Y;
 8 
 9      public Custom3DAnimation(
10              float centerX,
11              float centerY,
12              float fromDegree,
13              float toDegree,
14              float distanceZ,
15              int axis) {
16         mCenterX = centerX;
17         mCenterY = centerY;
18         mFromDegree = fromDegree;
19         mToDegree = toDegree;
20         mDistanceZ = distanceZ;
21         mAxis = axis;
22     }
23 
24     @Override
25      protected  void applyTransformation( float interpolatedTime, Transformation t) {
26          float degree = mFromDegree + (mToDegree - mFromDegree) * interpolatedTime;
27          float distanceZ = mDistanceZ * interpolatedTime;
28         
29         Matrix matrix = t.getMatrix();
30         Camera camera =  new Camera();
31         camera.save();
32          if (mDistanceZ != 0) {
33             camera.translate(0.0f, 0.0f, distanceZ);
34         }
35          if (mAxis == AXIS_X) {
36             camera.rotateX(degree);
37         }  else  if (mAxis == AXIS_Y) {
38             camera.rotateY(degree);
39         }
40         camera.getMatrix(matrix);
41         camera.restore();
42         
43          // 设置旋转中心
44          matrix.preTranslate(-mCenterX, -mCenterY);
45         matrix.postTranslate(mCenterX, mCenterY);
46         
47          super.applyTransformation(interpolatedTime, t);
48     }
49 }
3D动画的参数:中心点X,中心点Y,旋转开始角度,旋转结束角度,旋转是X轴还是Y轴,Z轴动画距离
调用如下:
 1             Custom3DAnimation anim =  new Custom3DAnimation(
 2                     img.getWidth() / 2, 
 3                     img.getHeight() / 2,
 4                     0,
 5                     180,
 6                     100,
 7                     Custom3DAnimation.AXIS_Y);
 8             anim.setDuration(1000);
 9             anim.setInterpolator( new AccelerateInterpolator());
10             img.startAnimation(anim);
 
扩展
一般3D的使用,都是分正反俩面,当View翻转90度以后,View的内容或者View本身编程变换,然后完成另外90度的选中,来达到翻面的效果。
 1 Custom3DAnimation anim =  new Custom3DAnimation(
 2                 img.getWidth() / 2, 
 3                 img.getHeight() / 2,
 4                 0,
 5                 90,
 6                 0,
 7                 Custom3DAnimation.AXIS_Y);
 8         anim.setDuration(500);
 9         anim.setInterpolator( new AccelerateInterpolator());
10         anim.setAnimationListener( new AnimationListener() {
11             @Override
12              public  void onAnimationStart(Animation animation) {    }        
13             @Override
14              public  void onAnimationRepeat(Animation animation) {}
15             @Override
16              public  void onAnimationEnd(Animation animation) {
17                 img.setImageResource(R.drawable.logo_l2);
18                 Custom3DAnimation anim1 =  new Custom3DAnimation(
19                         img.getWidth() / 2, 
20                         img.getHeight() / 2,
21                         -90,
22                         0,
23                         0,
24                         Custom3DAnimation.AXIS_Y);
25                 anim1.setDuration(500);
26                 anim1.setInterpolator( new AccelerateInterpolator());
27                 img.startAnimation(anim1);
28             }
29         });
30         img.startAnimation(anim);
涉及到的内容比较简单,只是起到总结作用,便于以后使用备忘。
 

转载于:https://www.cnblogs.com/TavenWang/archive/2013/02/22/2921213.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值