我正在使用https://github.com/chrisbanes/PhotoView并尝试设置其高度的动画。

我使用ValueAnimator并更新布局高度,以便触发内部PhotoViewAttacheronGlobalLayout来转换矩阵。

有什么解决方法可以防止缩放比例和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.AnimatorUpdateListenerValueAnimator回调。

再次,我不知道这是否行得通-看起来应该如此。

编辑:

以下内容与上面的代码无关。

除了可以为heightPhotoView设置动画外,还可以为其topbottom属性设置动画。在我的测试中,设置这些属性的动画不会重置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并控制其可见性。

10-04 23:10
查看更多