翻转硬币实际上就是翻转textview,众所周知Android有个动画类Animation.Java,RotateAnimation类继承自该类,构造函数需有三个参数,分别说明动画组件的中心点位置及旋转方向。
RotateAnimation.initialize()将初始化动画组件及其父容器的宽高;通常亦可进行另外的初始化工作,本例中用于执行对camera进行实例化赋值。
RotateAnimation.applyTransformation()第一个参数为动画的进度时间值,取值范围为[0.0f,1.0f],第二个参数Transformation记录着动画某一帧中变形的原始数据。该方法在动画的每一帧显示过程中都会被调用。
RotateAnimation.java具体代码如下:
```
'public classRotateAnimation extends Animation {
/** 值为true时可明确查看动画的旋转方向。 */
public static final booleanDEBUG =false;
/** 沿Y轴正方向看,数值减1时动画逆时针旋转。 */
public static final booleanROTATE_DECREASE =true;
/** 沿Y轴正方向看,数值减1时动画顺时针旋转。 */
public static final booleanROTATE_INCREASE =false;
/** Z轴上最大深度。 */
public static final floatDEPTH_Z =310.0f;
/** 动画显示时长。 */
public static final longDURATION =800l;
/** 图片翻转类型。 */
private final booleantype;
private final floatcenterX;
private final floatcenterY;
privateCamera camera;
/** 用于监听动画进度。当值过半时需更新txtNumber的内容。 */
privateInterpolatedTimeListener listener;
publicRotateAnimation(floatcX,floatcY,booleantype) {
centerX = cX;
centerY= cY;
this.type = type;
setDuration(DURATION);
}
public voidinitialize(intwidth,intheight,intparentWidth,intparentHeight) {
// 在构造函数之后、getTransformation()之前调用本方法。
super.initialize(width, height, parentWidth, parentHeight);
camera =newCamera();
}
public voidsetInterpolatedTimeListener(InterpolatedTimeListener listener) {
this.listener = listener;
}
protected voidapplyTransformation(floatinterpolatedTime, Transformation transformation) {
// interpolatedTime:动画进度值,范围为[0.0f,10.f]
if(listener !=null) {
listener.interpolatedTime(interpolatedTime);
}
floatfrom =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;
}
floatdegree = from + (to - from) * interpolatedTime;
booleanoverHalf = (interpolatedTime >0.5f);
if(overHalf) {
// 翻转过半的情况下,为保证数字仍为可读的文字而非镜面效果的文字,需翻转180度。
degree = degree -180;
}
// float depth = 0.0f;
floatdepth = (0.5f- Math.abs(interpolatedTime -0.5f)) * DEPTH_Z;
finalMatrix 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 interfaceInterpolatedTimeListener {
public voidinterpolatedTime(floatinterpolatedTime);
}
}
```
demo地址