2013-04-26 24 views
22

Tôi gặp sự cố lạ với số AlphaAnimation. Nó được cho là chạy liên tục khi xử lý AsyncTask được gọi.Hoạt ảnh không bắt đầu cho đến khi cập nhật giao diện người dùng hoặc sự kiện chạm

Tuy nhiên, lần đầu tiên trình xử lý được gọi trong Activity, hoạt ảnh sẽ không bắt đầu trừ khi tôi chạm vào màn hình hoặc nếu giao diện người dùng được cập nhật (bằng cách nhấn nút trình đơn của điện thoại chẳng hạn).

Phần lạ là khi hoạt ảnh đã chạy ít nhất một lần, nó sẽ bắt đầu không có vấn đề nếu trình xử lý được gọi lại.

Đây là những gì mã trông giống như:

// AsyncTask handler 
public void onNetworkEvent() 
{ 
    this.runOnUiThread(new Runnable() { 
    @Override 
    public void run() 
    { 
     flashScreen(Animation.INFINITE); 
    } 
    }); 
} 

// Called method 
private void flashScreen(int repeatCount) 
{ 
    final View flashView = this.findViewById(R.id.mainMenuFlashView); 

    AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0); 
    alphaAnimation.setRepeatCount(repeatCount); 
    alphaAnimation.setRepeatMode(Animation.RESTART); 
    alphaAnimation.setDuration(300); 
    alphaAnimation.setInterpolator(new DecelerateInterpolator()); 
    alphaAnimation.setAnimationListener(new Animation.AnimationListener() { 
    @Override 
    public void onAnimationStart(Animation animation) 
    { 
     flashView.setVisibility(View.VISIBLE); 
    } 

    @Override 
    public void onAnimationEnd(Animation animation) 
    { 
     flashView.setVisibility(View.GONE); 
    } 

    @Override 
    public void onAnimationRepeat(Animation animation) { } 
    }); 

    flashView.startAnimation(alphaAnimation); 
} 

tôi đã nhận thấy rằng runOnUIThread là không cần thiết (kết quả tương tự xảy ra nếu tôi không sử dụng nó), nhưng tôi muốn giữ nó như tôi không trên chuỗi giao diện người dùng.

Bất kỳ ý tưởng nào về điều gì có thể gây ra điều này?

+0

Quá ít mã để hiểu chuỗi cuộc gọi của bạn là gì. Bạn có thể đăng một phần xung quanh việc thực thi Asynctask không? Ngoài ra, bạn đã thử đăng nhập mục nhập vào các phương pháp có liên quan để xem điều gì đang xảy ra chưa? – ilomambo

+0

Hãy thử trì hoãn hoạt ảnh sau vài giây lần đầu tiên. Đây có thể là trường hợp khi cố gắng chạy hoạt ảnh trước khi chế độ xem sẵn sàng. –

Trả lời

39

Một nghiên cứu nhỏ hơn cho thấy vấn đề của tôi là cùng một câu hỏi này: Layout animation not working on first run

tầm nhìn Các flashView 's đã được thiết lập để GONE theo mặc định (gây ra Animation không để bắt đầu ngay lập tức như View chưa từng render), vì vậy tôi chỉ cần đặt nó vào INVISIBLE trước khi gọi flashView.startAnimation()

+0

Xin cảm ơn, đã làm cho tôi vô cùng. – Vasanth

0

Đó không phải là điều dễ dàng. Cho đến khi bạn nhận được câu trả lời thực sự: Bắt đầu hoạt ảnh được kích hoạt bởi onNetworkEvent. Vì chúng ta không biết phần còn lại của mã, bạn nên tìm ở đó, cố gắng thay đổi onNetworkEvent bởi một sự kiện khác mà bạn có thể dễ dàng xác định, chỉ để gỡ lỗi nếu phần còn lại của mã là ok hoặc nếu nó chỉ là trigger chịu trách nhiệm cho nó.

+1

Tôi có thể kích hoạt thậm chí dễ dàng, và nó hoạt động. Gỡ lỗi cho thấy 'onAnimationStart' của' AnimationListener' không được gọi cho đến khi tôi tương tác với giao diện người dùng lần đầu tiên. – Jukurrpa

+0

@Jukurrpa vấn đề này có áp dụng cho tất cả các phiên bản Android hoặc một số phiên bản cụ thể không? – Kai

+0

@Kai Tôi chỉ có các thiết bị 4.1 và 4.2 để dùng thử, và nó hoạt động trên cả hai. – Jukurrpa

21

Nếu thiết lập View-VISIBLE sẽ không làm việc, cũng như trong trường hợp của tôi, nó giúp cho tôi để gọi requestLayout() trước khi bắt đầu ngày e Animation, như vậy:

Animation an = new Animation() { 
... 
view.requestLayout(); 
view.startAnimation(an); 

Trong trường hợp của tôi, tôi là View cao 0dip mà ngăn cản onAnimationStart khỏi bị gọi là, điều này giúp tôi giải quyết vấn đề đó.

+2

Trên một số phiên bản của Android, ngay cả khi nó không hoạt động nếu giá trị bắt đầu chiều cao hoặc chiều rộng của chế độ xem là 0dip. Trong một trong các trường hợp của tôi, tôi phải thực hiện giá trị ban đầu là 1dip và chế độ xem không hiển thị do lề. Và điều này đã giúp, hoạt hình hoạt động trên tất cả các phiên bản. – Oknesif

1

này đã làm việc cho tôi:

view.setVisibility(View.VISIBLE); 
view.startAnimation(animation); 

tôi phải thiết lập các view-VISIBLE (không INVISIBLE, không GONE), gây ra renderization nhìn cần thiết để animate nó.

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