2010-07-19 32 views
9

Tôi nên bắt đầu một số AnimationDrawable cần làm động nào khi hoạt động được hiển thị?Bắt đầu một AnimationDrawable trong Android

Hướng dẫn dành cho nhà phát triển recommends sử dụng onWindowFocusChanged, nhưng điều này không phải lúc nào cũng được gọi khi hoạt động là một phần của TabHost.

Tôi xin trích dẫn:

Điều quan trọng cần lưu ý là các start() phương pháp kêu gọi AnimationDrawable không thể được gọi trong phương pháp onCreate() của Hoạt động của bạn, bởi vì AnimationDrawable không phải là chưa đầy đủ gắn liền với cửa sổ. Nếu bạn muốn phát hoạt ảnh ngay lập tức, mà không cần tương tác, sau đó bạn có thể muốn gọi nó từ phương thức onWindowFocusChanged() trong hoạt động , sẽ được gọi khi Android đưa cửa sổ của bạn vào tiêu điểm.

Trả lời

6

Cách tiếp cận chủ đề song song có vẻ là một trong những phổ biến nhất, nhưng nó tăng 2 vấn đề lớn:

  • Theo các tài liệu, tất cả các giao diện người dùng liên quan đến mã nên chạy trên chính (hay còn gọi là "giao diện") chủ đề. Trong khi gọi .start() trên một AnimationDrawable có thể không được coi là một hoạt động UI thuần túy, tôi vẫn cảm thấy rằng nó phải tuân theo quy tắc đó.
  • Bạn không bao giờ có thể biết chính xác thời điểm hoạt ảnh của bạn bắt đầu. Tôi đã nhìn thấy mã với các giá trị độ dài "ma thuật" trễ được cho là sửa lỗi đó. Bạn nên biết tht Thiên Chúa giết chết một con mèo con mỗi khi một lập trình viên có cách tiếp cận đó.

Vì vậy, tôi khuyên bạn nên sử dụng phương thức runOnUiThread() rất khéo léo. Gọi nó trong onResume() sẽ đảm bảo với bạn rằng mã hoạt hình của bạn sẽ chạy trên luồng chính, nó sẽ chạy sau khi cửa sổ được đính kèm, bạn biết chính xác thông điệp sẽ được xử lý ở đâu và không cần chú mèo con mất cuộc sống:

@Override 
protected void onResume() 
{ 
    super.onResume(); 
    runOnUiThread(new Runnable() 
    { 
     @Override 
     public void run() 
     { 
      animation.start(); 
     } 
    }); 
} 
0

Hoạt động của onResume() luôn được gọi khi Hoạt động đến nền trước. Hãy thử bắt đầu nó trong đó.

+1

Không hoạt động. Có vẻ như AnimationDrawable chưa được gắn hoàn toàn vào cửa sổ. – hpique

7

Tôi biết câu hỏi này hơi cũ, nhưng điều này có thể hữu ích cho người nào đó xảy ra trên câu hỏi này như tôi đã làm. Một cách mà tôi bắt đầu của tôi AnimationDrawable của là bằng cách tạo ra một Runnable mới và sử dụng phương pháp bài từ ImageView.

Bạn có thể làm như sau:

ImageView spinner = (ImageView) findViewById(R.id.my_imageView); 
spinner.setBackgroundResource(R.drawable.spinner); 
spinner.post(new Runnable() { 
    public void run() { 
     AnimationDrawable anim = (AnimationDrawable) spinner.getBackground(); 
     anim.start(); 
    } 
}); 
+0

+1 cho câu trả lời công việc. Câu trả lời của Vaiden không có tác dụng với tôi. –

+1

không hoạt động đối với tôi –

0

Theo tài liệu, bạn phải đợi cho đến khi nhìn được gắn vào cửa sổ trước khi bắt đầu hoạt hình. Do đó, bạn nên thêm OnAttachStateChangeListener vào chế độ xem sẽ thực thi khi được đính kèm và bắt đầu hoạt ảnh từ đó.

ImageView loadingImg = (ImageView)v.findViewById(R.id.image); 
loadingImg.setBackgroundResource(R.drawable.progressdialog); 
loadingImg.addOnAttachStateChangeListener(new View.OnAttachStateChangeListener() { 
    @Override 
    public void onViewAttachedToWindow(View v) { 
    AnimationDrawable loadingAnimation = (AnimationDrawable) v.getBackground(); 
    loadingAnimation.start(); 
    } 

    @Override 
    public void onViewDetachedFromWindow(View v) { 
    } 
}); 
Các vấn đề liên quan