ソース コードを確認しましたが、次のコードはテストしていません。私が知る限り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。
繰り返しますが、これが機能するかどうかはわかりません。
編集:
以下は、上記のコードとは無関係です。
of をアニメーション化する代わりに、その&プロパティをアニメーションheight化PhotoViewできます。私のテストでは、これらのプロパティをアニメーション化しても位置がリセットされず、scaleX/scaleY の値も変更されませんでした。topbottomy
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アニメートしても役に立ちません。この場合、 a を使用して& otherをホストし、それらの可視性を制御することがオプションになる場合があります。topbottomFrameLayoutPhotoViewViews