我正在使用https://github.com/chrisbanes/PhotoView并尝试设置其高度的动画。
我使用ValueAnimator
并更新布局高度,以便触发内部PhotoViewAttacher
和onGlobalLayout
来转换矩阵。
有什么解决方法可以防止缩放比例和y位置保持不变,例如我可以自己更新矩阵以使图像Y位置和scaleX/scaleY保持不变吗?现在,将它们重置为比例尺1.0和图像的y位置中心。
动画代码:
ValueAnimator animator = ValueAnimator.ofInt(start, end).setDuration(300);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
mImageView.getLayoutParams().height = (int) animation.getAnimatedValue();
mImageView.requestLayout();
}
});
animator.start();
最佳答案
我遍历了源代码,但尚未测试以下代码。据我所知,您想在动画期间阻止对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
回调。再次,我不知道这是否行得通-看起来应该如此。
编辑:
以下内容与上面的代码无关。
除了可以为
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
之上或之下的其他 View 腾出空间,则对top
/bottom
进行动画处理将无济于事。在这种情况下,可以使用FrameLayout
托管PhotoView
和其他Views
并控制其可见性。