1

按照此页面上的教程并稍微修改代码,我已经设法(几乎)得到了我想要的工作。

Android 动画 3D 翻转

我想做的是从文本视图的中心围绕 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);
}

很抱歉这篇长文,希望我没有错过任何东西!谢谢你看:)

编辑:如果有更好的方法来处理这种类型的动画,也请告诉我!问候。

4

0 回答 0