2012-02-22 45 views
16

Tôi đã rà soát qua nhiều chủ đề về chủ đề này mà tôi có thể tìm thấy trên nhấp nháy phát sinh trong Android 2.2 khi giao dịch với AnimationListeners, nhưng tôi không thể giải quyết được vấn đề của mình.Android Animation Flicker

Tôi đã có một cửa sổ bật lên 'LinearLayout' mà người dùng chạm để di chuyển xuống khoảng 100 pixel và chạm lại để di chuyển nó trở lại. Cuối cùng, tôi đã làm việc trên phần đầu tiên mà không có bất kỳ nhấp nháy nào (nhờ lời đề nghị gọi clearAnimation() trên chế độ xem đang hoạt hình), nhưng khi thực hiện ngược lại (nghĩa là di chuyển chế độ xem lên), có một nhấp nháy tại bắt đầu. Tôi không thể gọi clearAnimation() trong phương thức onAnimationStart() vì nó sẽ không hoạt ảnh! Tất nhiên, tất cả hoạt ảnh hoạt động hoàn hảo nếu tôi sử dụng setFillAfter() mà không có bất kỳ trình nghe hoạt hình nào, nhưng vùng cảm ứng của khung nhìn sẽ không di chuyển (vì chính chế độ xem đó không thực sự được di chuyển).

Mọi trợ giúp sẽ được đánh giá cao.

this.popoverTab.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
     popoverTab.setClickable(false); 
     popoverTab.setFocusable(false); 
     if (popoverHidden) { 
      Log.d(TAG, "About to show popover"); 
      // the popover is currently hidden, show it. 
      TranslateAnimation animation = new TranslateAnimation(0, 0, 100, 0); 
      animation.setDuration(700); 
      animation.setFillBefore(true); 
      animation.setAnimationListener(new AnimationListener() { 
       public void onAnimationEnd(Animation animation) { 

       } 

       public void onAnimationRepeat(Animation animation) { 

       } 

       public void onAnimationStart(Animation animation) { 
        footer.layout(footer.getLeft(), (footer.getTop() - 100), footer.getRight(), footer.getBottom()); 
       } 
      }); 
      footer.startAnimation(animation); 
     } else { 
      Log.d(TAG, "About to hide popover"); 
      // the popover is showing, hide it. 
      TranslateAnimation animation = new TranslateAnimation(0, 0, 0, 100); 
      animation.setDuration(700); 
      animation.setFillAfter(true); 
      animation.setAnimationListener(new AnimationListener() { 
       public void onAnimationEnd(Animation animation) { 
        footer.clearAnimation(); 
        footer.layout(footer.getLeft(), (footer.getTop() + 100), footer.getRight(), footer.getBottom()); 
       } 

       public void onAnimationRepeat(Animation animation) { 

       } 

       public void onAnimationStart(Animation animation) { 

       } 
      }); 
      footer.startAnimation(animation); 
     } 
     // invert. 
     popoverHidden = !popoverHidden; 
     popoverTab.setClickable(true); 
     popoverTab.setFocusable(true); 
    } 

}); 

Trả lời

50

tôi đã cùng một vấn đề và sau vài ngày tôi tìm thấy giải pháp ... thanx:

http://www.mail-archive.com/[email protected]/msg67535.html

Tôi đã tìm ra giải pháp cho vấn đề này. Các đầu mối đến từ một thực tế rằng khi hiển thị xem, tất cả mọi thứ đã làm việc tốt. Rõ ràng, khi hoạt ảnh đang chạy, bản cập nhật sẽ là bị buộc phải hiển thị ở chế độ nền và không gây ra lỗi nhấp nháy . Thêm một hoạt ảnh ngắn vào đầu sau của onAnimationEnd() khi chúng tôi ẩn chế độ xem làm cho nhấp nháy mất .

Đây là onAndimationEnd mới() trong đoạn code làm việc

public void onAnimationEnd(Animation animation) { 
      animation = new TranslateAnimation(0.0f, 0.0f, 0.0f, 0.0f); 
      animation.setDuration(1); 
      mPlayer0Panel.startAnimation(animation); 
    } 
+0

Điều này cần được đánh dấu là câu trả lời. +1 –

+0

Cảm ơn bạn rất nhiều vì đã giải quyết vấn đề này! –

+1

Cảm ơn rất nhiều. Đã cho tôi quá lâu để tìm thấy điều này. – braden

3

Bạn không cần phải sử dụng clearAnimation() trên onAnimationEnd().

Hãy thử điều này:

  1. Sử dụng setFillBefore(true)setFillAfter(true) trên cả hình ảnh động
  2. Đặt các thuộc tính bố trí đúng khi bắt đầu và khi kết thúc cả hình ảnh động
+0

Tôi vẫn kết thúc với một nhấp nháy khi di chuyển bảng điều khiển sao lưu. Tôi đã giải quyết vấn đề bằng cách đặt chế độ xem giả đằng sau nó chứa nội dung giống như nội dung ở phía trước nó. – JRod

+0

Tôi đang gặp vấn đề tương tự, có vẻ như điều chỉnh view.layout() gây ra nhấp nháy. – Jeroen

0

Alrite, tôi đã cùng một vấn đề mà khiến tôi tìm kiếm nó, tôi đã kết thúc trong bài viết này. Tìm thấy một giải pháp cho vấn đề của tôi, nghĩ để chia sẻ giải pháp của tôi.

Tôi đã có nhiều hoạt ảnh chạy nhưng nhấp nháy bắt đầu gần đây, nhưng khi tôi truy tìm vấn đề, nhấp nháy xảy ra sau khi vẽ danh sách hoạt ảnh theo số cho vòng lặp. (array List)

Tôi chỉ cần thêm cố gắng nắm bắt để tránh vấn đề sau khi định vị nó, vấn đề; một số hoạt ảnh đã bị loại bỏ nhưng không có đủ thời gian để cập nhật, vì vậy vòng lặp vẫn cố gắng và không thành công nhưng không được hiển thị thay vì nó nhấp nháy, nhưng theo thử và nắm bắt được danh sách mảng đã khắc phục được sự cố của tôi.

2

Tôi đã tìm kiếm tất cả các bài đăng stackoverflow cho vấn đề hoạt ảnh (nhấp nháy và chậm chạp). Tôi không tìm thấy câu trả lời hoàn hảo nào. Nhưng tôi đã tìm thấy các giải pháp cho cùng, đó là như dưới đây,

onStart của Animation sử dụng,

view_you_want_to_animate.setDrawingCacheEnabled(true); 

onEnd sử dụng Animation,

view_you_want_to_animate.setDrawingCacheEnabled(false); 

Bây giờ quan điểm của tôi không có nhấp nháy hoặc hành vi chậm chạp khi chế độ xem của tôi hoạt ảnh. Nó hoạt động tốt cho tôi.

+0

Điều này làm việc cho tôi .. Cảm ơn !! –

+0

Điều này cũng phù hợp với tôi, cả với hoạt ảnh alpha độc lập và bộ hoạt ảnh dịch + tỷ lệ. – BVB

11
@Override 
public void onAnimationEnd(Animation animation) 
{ 
    footer.clearAnimation(); 
} 

Điều này phù hợp với tôi.

+1

Cảm ơn bạn rất nhiều .. – Sayka