6

https://github.com/chrisbanes/PhotoViewを使用して、その高さをアニメーション化しようとしています。

レイアウトの高さを使用して更新するとValueAnimator、内部がトリガーされ、マトリックスが変換されます。PhotoViewAttacheronGlobalLayout

画像の Y 位置と scaleX/scaleY を変更しないように自分でマトリックスを更新できるように、スケールと y 位置が変更されないようにする回避策はありますか? 現在、これらはスケール 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();
4

2 に答える 2

3

ソース コードを確認しましたが、次のコードはテストしていません。私が知る限り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 をアニメーション化する代わりに、その&プロパティをアニメーションheightPhotoViewできます。私のテストでは、これらのプロパティをアニメーション化しても位置がリセットされず、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

于 2015-12-01T06:11:55.647 に答える