按照此页面上的教程并稍微修改代码,我已经设法(几乎)得到了我想要的工作。
我想做的是从文本视图的中心围绕 y 轴将文本视图从 0 度翻转到 90 度。一旦 textview 是屏幕上的一条垂直线,为 textview 设置一些文本并从 -90 旋转回 0。基本上给出的效果是您已经将 textview 翻转并显示了它后面的文本。
我试图做到这一点的方法是定义一个从 x 度旋转到 y 度的翻转动画。第一次调用它时,我将其设置为 0 到 90 并设置了一个动画侦听器。动画完成后,动画侦听器在 textview 上设置文本并从 -90 到 0 开始一个新动画。
第二个动画看起来像预期的那样工作,但第一个动画似乎围绕 textview 的左边缘旋转。下面的插图(所有自上而下的视图):
粗黑线表示 textview 开始的位置(自上而下视图)。红色箭头线表示文本视图旋转的方向,虚线显示动画后文本视图的位置。
我正在使用的代码如下:
FlipAnimation(直接取自教程):
public class FlipAnimation extends Animation {
private final float mFromDegrees;
private final float mToDegrees;
private final float mCenterX;
private final float mCenterY;
private Camera mCamera;
public FlipAnimation(float fromDegrees, float toDegrees, float centerX, float centerY) {
mFromDegrees = fromDegrees;
mToDegrees = toDegrees;
mCenterX = centerX;
mCenterY = centerY;
}
@Override
public void initialize(int width, int height, int parentWidth, int parentHeight) {
super.initialize(width, height, parentWidth, parentHeight);
mCamera = new Camera();
}
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
final float fromDegrees = mFromDegrees;
float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);
final float centerX = mCenterX;
final float centerY = mCenterY;
final Camera camera = mCamera;
final Matrix matrix = t.getMatrix();
camera.save();
camera.rotateY(degrees);
camera.getMatrix(matrix);
camera.restore();
matrix.preTranslate(-centerX, -centerY);
matrix.postTranslate(centerX, centerY);
}
翻转动画监听器:
public final class FlipAnimationListener implements AnimationListener {
private TextView flippingView;
private String newText;
public FlipAnimationListener(TextView flippingView, String newText) {
this.flippingView = flippingView;
this.newText = newText;
}
public void onAnimationEnd(Animation animation) {
flippingView.setText(newText);
final float centerX = flippingView.getWidth() / 2.0f;
final float centerY = flippingView.getHeight() / 2.0f;
final FlipAnimation rotation = new FlipAnimation(-90, 0, centerX, centerY);
rotation.setDuration(2000);
rotation.setFillAfter(true);
rotation.setInterpolator(new DecelerateInterpolator());
flippingView.startAnimation(rotation);
}
public void onAnimationRepeat(Animation animation) {}
public void onAnimationStart(Animation animation) {}
}
我在活动中的翻转代码:
private void startFlips() {
TextView viewToChange = (TextView) findViewById(R.id.viewToChange);
final float centerX = viewToChange.getWidth() / 2.0f;
final float centerY = viewToChange.getHeight() / 2.0f;
final FlipAnimation rotation = new FlipAnimation(0, 90, centerX, centerY);
rotation.setDuration(2000);
rotation.setFillAfter(true);
rotation.setInterpolator(new AccelerateInterpolator());
rotation.setAnimationListener(new FlipAnimationListener(viewToChange, "test"));
viewToChange.startAnimation(rotation);
}
很抱歉这篇长文,希望我没有错过任何东西!谢谢你看:)
编辑:如果有更好的方法来处理这种类型的动画,也请告诉我!问候。