tôi đã đi qua mã nguồn, nhưng đã không kiểm tra đoạn mã sau. Từ những gì tôi có thể nói, bạn muốn chặn cuộc gọi đến onGlobalLayout()
trong thời lượng hoạt ảnh. Sau đây nên đạt được điều đó:
onAnimationStart():
mPhotoView.getViewTreeObserver()
.removeOnGlobalLayoutListener((PhotoViewAttacher)mPhotoView.getIPhotoViewImplementation());
onAnimationEnd():
mPhotoView.getViewTreeObserver()
.addOnGlobalLayoutListener((PhotoViewAttacher)mPhotoView.getIPhotoViewImplementation());
Lưu ý rằng removeOnGlobalLayoutListener(OnGlobalLayoutListener)
hiện có sẵn cho các phiên bản API> = 16. Trước đó, bạn sẽ sử dụng removeGlobalOnLayoutListener(OnGlobalLayoutListener)
.
onAnimationStart()
và onAnimationEnd()
gọi lại có sẵn bằng cách thêm ValueAnimator.AnimatorUpdateListener
vào ValueAnimator
của bạn.
Một lần nữa, tôi không biết điều này có hiệu quả hay không - có vẻ như nó sẽ xảy ra.
Edit:
Sau đây là độc lập với mã ở trên.
Thay vì tạo hoạt ảnh height
trong số PhotoView
, bạn có thể tạo ảnh động top
& bottom
thuộc tính của mình. Trong các thử nghiệm của tôi, sinh động các đặc tính này không thiết lập lại vị trí y
, hoặc thay đổi scaleX/giá trị 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();
}
Nếu bạn đang hoạt cảnh height
để nhường chỗ cho quan điểm khác trên hoặc dưới PhotoView
, hiệu ứng động top
/bottom
sẽ không giúp ích gì. Trong trường hợp này, hãy sử dụng số FrameLayout
để lưu trữ PhotoView
& khác Views
và việc kiểm soát chế độ hiển thị của chúng có thể là một tùy chọn.
Bạn có thể gửi mã hoạt hình? –