我浏览了源代码,但尚未测试以下代码。据我所知,您想onGlobalLayout()
在动画期间阻止调用。以下应该实现:
onAnimationStart():
mPhotoView.getViewTreeObserver()
.removeOnGlobalLayoutListener((PhotoViewAttacher)mPhotoView.getIPhotoViewImplementation());
onAnimationEnd():
mPhotoView.getViewTreeObserver()
.addOnGlobalLayoutListener((PhotoViewAttacher)mPhotoView.getIPhotoViewImplementation());
请注意,这removeOnGlobalLayoutListener(OnGlobalLayoutListener)
适用于 API 版本 >=16。在此之前,您将使用removeGlobalOnLayoutListener(OnGlobalLayoutListener)
.
onAnimationStart()
并且onAnimationEnd()
可以通过将 a 添加ValueAnimator.AnimatorUpdateListener
到您的ValueAnimator
.
同样,我不知道这是否可行 - 看起来应该。
编辑:
以下独立于上面的代码。
您可以为其&属性设置动画,而不是为height
of设置动画。在我的测试中,为这些属性设置动画并没有重置位置,或者更改 scaleX/scaleY 值:PhotoView
top
bottom
y
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
将无济于事。在这种情况下,使用 aFrameLayout
来托管PhotoView
& otherViews
并控制它们的可见性可能是一种选择。