我們想旋轉嘛,讓每個View都在ValueAnimator裡改變setRotationY不就行了。
final ValueAnimator animator = ValueAnimator.ofInt(0, 180);
animator.setDuration(2000);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator valueAnimator) {
int animatedValue = (int) valueAnimator.getAnimatedValue();
for (View view : listViews) {
view.setRotationY(animatedValue);
}
}
});
複製程式碼
幾行程式碼迅速搞定
這裡我們就談談這個rotationY的旋轉原理了 View的rotationY方法以View的中心點的Y方向為旋轉軸旋轉。 camera則在該中心點的z軸正方向。 那麼可以看見每個View都有自己的camera形成旋轉投影效果,所以就會出現多View一起旋轉混亂的情況。有沒有辦法統一呢?有。那就是設定一個統一的camera位置,讓所有View的camera都移動到該位置上,則就相當於一個camera投影不同的View。這個時候旋轉View就可以達到整體的效果。
通過setPivotY和setPivotX可以調整camera所在位置。那麼這個PivotY和PivotX參考的座標系到底是在哪?PivotY和PivotX的參考座標系是View的左上角。
現在思路很清晰了。就是設定一個camera的Y位置,然後通過setPivotY()讓所有view的camera都移動到該位置。
具體做法:
- 以第一個view左上角為參考座標系,得到camera的Y位置。 cameraY=所有view的height和/2
- Y值對映到各自的座標系上。
PivotY=cameraY-上個view的height
if (isFirst) {
isFirst = false;
//計算總高度
float allHeight = 0;
for (View item : listViews) {
allHeight += item.getHeight();
}
//得到camera的Y值
float cameraY = allHeight / 2;
//將camera的Y值對映到每個View上,並移動到該位置
for (int i = 0; i < listViews.size(); i++) {
View itemView = listViews.get(i);
cameraY = cameraY - (i < 1 ? 0 : listViews.get(i - 1).getHeight());
itemView.setPivotY(cameraY);
}
}
animator.start();
複製程式碼