2012-04-10 37 views
10

Tôi đang cố gắng "chuỗi" hai hoạt ảnh lại với nhau, vì vậy khi hoàn thành, hình ảnh động khác bắt đầu. Điều này đang hoạt động ngoại trừ một vấn đề. Sau khi hoạt ảnh đầu tiên hoàn thành, nó sẽ chuyển về vị trí ban đầu của nó. Tôi đang đặt điền sau khi thành sự thật. Tôi còn thiếu gì nữa?Hoạt ảnh chuỗi Android

Đây là mã tôi đang sử dụng. Lưu ý, đây là một lớp đang mở rộng LinearLayout.

// FIRST ANIMATION 
mAnimation = new TranslateAnimation(0, PANEL_END_X, 0, 0); 
mAnimation.setDuration(PANEL_TRANSITION_TIME); 
mAnimation.setFillAfter(true); 

mAnimation.setAnimationListener(new Animation.AnimationListener() { 
    public void onAnimationEnd(Animation animation) { 

     // FIRST ANIMATION COMPLETE, CALL THE SECOND ANIMATION 
     startAnimation(mAlphaAnimation); 
    } 
}); 

// SECOND ANIMATION  
mAlphaAnimation = new AlphaAnimation(1.0f, 0.0f); 
mAlphaAnimation.setDuration(PANEL_ALPHA_TRANSITION_TIME); 
mAlphaAnimation.setFillAfter(true); 

Giải pháp:

Cách duy nhất tôi có thể có được điều này làm việc để sự hài lòng của tôi là sử dụng một AnimationSet, nhưng thiết lập thời gian bắt đầu bù đắp của phim hoạt hình thứ hai để bắt đầu bù đắp + thời gian của phim hoạt hình đầu tiên, cộng với một chút đệm. Họ không phải hoàn toàn chính xác trong trường hợp của tôi.

Tôi đã thử phát các giá trị khác nhau như CommonsWare được đề xuất, nhưng tôi sẽ luôn nhận được một số loại hiệu ứng "snapping" trong đó các giá trị sẽ hoàn nguyên về giá trị ban đầu trước khi lấy giá trị mới.

Trả lời

5

Sau khi hoạt ảnh đầu tiên hoàn tất, nó sẽ chuyển về vị trí ban đầu. Tôi đang đặt điền sau khi thành sự thật. Tôi còn thiếu gì nữa?

Hoạt ảnh là hiệu ứng thoáng qua. Nếu bạn muốn các hiệu ứng là vĩnh viễn, bạn phải tự làm điều đó trong onAnimationEnd(). Trong trường hợp của TranslateAnimation, bạn cần phải thay đổi LayoutParams hoặc nội dung nào đó của tiện ích bị ảnh hưởng để giữ vĩnh viễn nó ở vị trí cuối cùng của nó. Hoặc, nếu bạn dịch nó ra khỏi màn hình, hãy đặt chế độ hiển thị thành View.GONE.

+2

liên tiếp AnimationSet.Builder cuối cùng là những gì tôi cần: http://developer.android.com/reference/android/animation/AnimatorSet.Builder.html. – Steve

2

Thử kết hợp chúng thành AnimationSet.

+0

không mà thực hiện cả hai cùng một lúc mặc dù? Tôi muốn một hình động bắt đầu sau khi hình ảnh khác hoàn tất. – Steve

+0

Vâng, bạn nói đúng, xin lỗi. Tôi hiểu lầm cụm từ này trong Javadoc: "Các biến đổi của hình động trẻ em được áp dụng theo thứ tự mà chúng đã được thêm vào" –

+0

Câu đó khó hiểu, và dường như ngụ ý rằng nó làm những gì tôi muốn. Dù sao cũng cảm ơn. – Steve

8

Tôi đã tìm thấy những gì tôi tin là giải pháp lý tưởng ở cấp API 11 trở lên bằng cách sử dụng lớp AnimationSet.Builder.

Đối tượng Builder là lớp tiện ích để tạo điều kiện thêm hoạt ảnh vào AnimatorSet cùng với các mối quan hệ giữa các hoạt ảnh khác nhau. Mục đích của các phương thức Builder, cùng với phương thức play() của AnimatorSet là làm cho nó có thể thể hiện mối quan hệ phụ thuộc của các hoạt ảnh một cách tự nhiên. Các nhà phát triển cũng có thể sử dụng các phương thức playTogether() và playSequentially() nếu chúng phù hợp với nhu cầu, nhưng có thể dễ dàng hơn trong một số tình huống để thể hiện AnimatorSet hoạt ảnh theo cặp

Ví dụ, thiết lập AnimatorSet để phát anim1 và anim2 cùng một lúc, anim3 để chơi khi anim2 kết thúc, và anim4 để chơi khi anim3 kết thúc:

AnimatorSet s = new AnimatorSet(); 
s.play(anim1).with(anim2); 
s.play(anim2).before(anim3); 
s.play(anim4).after(anim3); 
+0

Lưu ý rằng tính năng này chỉ khả dụng ở cấp API 11 trở lên, vì vậy thiết bị Android 1.x/2.x không thể sử dụng nó. – CommonsWare

Các vấn đề liên quan