Поскольку ответы на этот вопрос довольно устарели, вот более современное решение, основанное на ValueAnimators.
В этом решении реализован настоящий, визуально привлекательный 3D-переворот, потому что он не только переворачивает изображение, но и масштабирует его во время переворачивания (это то, как это делает Apple).
Сначала мы настроили ValueAnimator:
mFlipAnimator = ValueAnimator.ofFloat(0f, 1f);
mFlipAnimator.addUpdateListener(new FlipListener(frontView, backView));
И соответствующий слушатель обновлений:
public class FlipListener implements ValueAnimator.AnimatorUpdateListener {
private final View mFrontView;
private final View mBackView;
private boolean mFlipped;
public FlipListener(final View front, final View back) {
this.mFrontView = front;
this.mBackView = back;
this.mBackView.setVisibility(View.GONE);
}
@Override
public void onAnimationUpdate(final ValueAnimator animation) {
final float value = animation.getAnimatedFraction();
final float scaleValue = 0.625f + (1.5f * (value - 0.5f) * (value - 0.5f));
if(value <= 0.5f){
this.mFrontView.setRotationY(180 * value);
this.mFrontView.setScaleX(scaleValue);
this.mFrontView.setScaleY(scaleValue);
if(mFlipped){
setStateFlipped(false);
}
} else {
this.mBackView.setRotationY(-180 * (1f- value));
this.mBackView.setScaleX(scaleValue);
this.mBackView.setScaleY(scaleValue);
if(!mFlipped){
setStateFlipped(true);
}
}
}
private void setStateFlipped(boolean flipped) {
mFlipped = flipped;
this.mFrontView.setVisibility(flipped ? View.GONE : View.VISIBLE);
this.mBackView.setVisibility(flipped ? View.VISIBLE : View.GONE);
}
}
Вот и все!
После этой настройки вы можете перевернуть виды, позвонив по номеру
mFlipAnimator.start();
и переверните флип, позвонив по номеру
mFlipAnimator.reverse();
Если вы хотите проверить, перевернуто ли представление, внедрите и вызовите эту функцию:
private boolean isFlipped() {
return mFlipAnimator.getAnimatedFraction() == 1;
}
Вы также можете проверить, переворачивается ли представление в данный момент, реализовав этот метод:
private boolean isFlipping() {
final float currentValue = mFlipAnimator.getAnimatedFraction();
return (currentValue < 1 && currentValue > 0);
}
Вы можете объединить вышеупомянутые функции, чтобы реализовать красивую функцию для переключения флип, в зависимости от того, перевернут он или нет:
private void toggleFlip() {
if(isFlipped()){
mFlipAnimator.reverse();
} else {
mFlipAnimator.start();
}
}
Вот и все! Просто и легко. Наслаждайтесь!