Я пошел через исходный код, но не тестировал следующий код. Из того, что я могу сказать, вы хотите заблокировать вызов до onGlobalLayout()
на время анимации. Следующие должны достичь этого:
onAnimationStart():
mPhotoView.getViewTreeObserver()
.removeOnGlobalLayoutListener((PhotoViewAttacher)mPhotoView.getIPhotoViewImplementation());
onAnimationEnd():
mPhotoView.getViewTreeObserver()
.addOnGlobalLayoutListener((PhotoViewAttacher)mPhotoView.getIPhotoViewImplementation());
Заметьте, что removeOnGlobalLayoutListener(OnGlobalLayoutListener)
доступен для версий API> = 16. Перед этим вы будете использовать removeGlobalOnLayoutListener(OnGlobalLayoutListener)
.
onAnimationStart()
и onAnimationEnd()
обратные вызовы можно получить, добавив ValueAnimator.AnimatorUpdateListener
к вашему ValueAnimator
.
Опять же, я не знаю, будет ли это работать - похоже, должно.
Edit:
После независим от кода выше.
Вместо того, чтобы анимировать height
из PhotoView
, вы могли бы оживить его top
& bottom
свойства. В моих тестах, анимировать эти свойства не сбросить y
позиции, или изменить Scalex/значение ScaleY:
int mOrigImageViewTop, mOrigImageViewBottom;
void crunchImageView() {
// Hold on to original values
if (mOrigImageViewTop == 0) {
mOrigImageViewTop = mImageView.getTop();
mOrigImageViewBottom = mImageView.getBottom();
}
// Top
ObjectAnimator objectAnimatorTop = ObjectAnimator.ofInt(mImageView,
"top", mOrigImageViewTop,
mOrigImageViewTop + 200 /*should be calculated dynamically*/);
// Bottom
ObjectAnimator objectAnimatorBottom = ObjectAnimator.ofInt(mImageView,
"bottom", mOrigImageViewBottom,
mOrigImageViewBottom - 200 /*should be calculated dynamically*/);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.playTogether(objectAnimatorTop, objectAnimatorBottom);
animatorSet.setDuration(5000L);
animatorSet.start();
}
Если вы оживляющий height
, чтобы освободить место для других точек зрения выше или ниже PhotoView
, оживляющего top
/bottom
не поможет. В этом случае использование FrameLayout
для размещения PhotoView
& другого Views
и контроль за их видимостью может быть опцией.
Вы можете разместить код анимации? –