2014-11-17 26 views
7

Tôi đang sử dụng recyclerView với một số chế độ xem và một là chế độ xem hoạt ảnh có hình động được áp dụng cho chế độ xem đó. Khi chế độ xem ở ngoài màn hình, hoạt ảnh không còn hoạt động nữa, mặc dù hoạt ảnh vẫn tồn tại.Hoạt ảnh chế độ xem trên Android dừng khi chế độ xem ngoài màn hình

Dữ liệu:

rotate_around_center_point.xml

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="false" > 

    <rotate 
     android:duration="2500" 
     android:interpolator="@android:anim/linear_interpolator" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:repeatCount="infinite" 
     android:repeatMode="restart" 
     android:toDegrees="360" /> 

</set> 

Áp dụng hình ảnh động:

   animation = AnimationUtils.loadAnimation(this.getContext(), 
         R.anim.rotate_around_center_point); 
       loadingRotatingCircleIV.startAnimation(animation); 

tôi không thể tìm thấy bất cứ cách nào để bắt một sự kiện khi hoạt hình bị gián đoạn vì vậy tôi có thể khởi động lại hoạt ảnh khi nó đã được ra khỏi màn hình.

Trả lời

0

Tôi đang làm chính xác điều tương tự ngay bây giờ và có cùng một vấn đề chính xác. Vì vậy, câu hỏi là làm thế nào để khởi động lại các hình ảnh động một lần xem là trở lại trên màn hình.

Tôi đã giải quyết được sự cố 99% chỉ bằng cách gọi "loadingRotatingCircleIV.startAnimation (hoạt ảnh);" bên trong onBindViewHolder mỗi khi nó được gọi cho vị trí xem của tôi.

Nhưng chỉ còn lại một chút vấn đề nhỏ. Nếu bạn di chuyển xuống chỉ một chút, vì vậy khung nhìn tắt màn hình, nhưng người giữ khung nhìn không được tái chế, khi bạn cuộn ngược lên, onBindViewHolder rõ ràng không được gọi lại, nhưng hoạt ảnh bị dừng lại. vẫn đang cố gắng khắc phục điều đó một ..

Vì vậy, giải pháp hiện tại của tôi:

public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
... 
     if (position=="animated_view_position") view.startAnimation(animation); 
... 
} 

Nếu ai đó có một giải pháp tốt hơn, xin vui lòng giúp đỡ.

3

RecyclerView dừng hoạt ảnh không chính xác trên chế độ xem khi chế độ xem chỉ thoát ra khỏi màn hình nếu bạn áp dụng Chế độ xem hoạt ảnh cho chế độ xem đó. Nếu bạn sử dụng Property Animation, mọi thứ sẽ hoạt động bình thường. Vì vậy, các giải pháp sau đây sẽ làm việc:

ObjectAnimator animator = ObjectAnimator.ofFloat(loadingRotatingCircleIV, "rotation", 0.0f, 360.0f); 
animator.setDuration(1000L); 
animator.setRepeatCount(ObjectAnimator.INFINITE); 
animator.setInterpolator(new LinearInterpolator()); 
animator.start(); 
2

Nếu bạn muốn sử dụng một ViewAnimation cho một mục RecyclerView, bạn phải khôi phục hình ảnh động trong phương pháp overriden của RecyclerView - onViewAttachedToWindow (giữ ItemViewHolder), như:

@Override 
public void onViewAttachedToWindow(ItemViewHolder holder) { 
    super.onViewAttachedToWindow(holder); 

    if (holder.animated) 
    { 
     Animation anim = new ScaleAnimation(0.8f, 1.2f, 
      0.8f, 1.2f, 
      Animation.RELATIVE_TO_SELF, 0.5f, 
      Animation.RELATIVE_TO_SELF, 0.5f); 
     anim.setFillAfter(true); 
     anim.setInterpolator(new BounceInterpolator()); 
     anim.setDuration(1100); 
     anim.setRepeatCount(Animation.INFINITE); 
     anim.setRepeatMode(Animation.REVERSE); 
     holder.animatedView.startAnimation(anim); 
    } 
} 
0
create **HashMap<Integer, Boolean>** for saving each items animation loaded status 

construct(){ 
for(int c = 0; c < adapterDataList.size(); c++){ 
//Here is create default status of animation loaded status used Boolean to saving 
} 
} 

//Call Start Animation with onViewAttachedToWindow 
@Override 
public void onViewAttachedToWindow(ItemViewHolder holder) { 
    super.onViewAttachedToWindow(holder); 

// get HashMap of each items Animation status like this 
if(!HashMap.get(position)){ //FALSE means animation not loaded yet 
//Here should call start Animation method; 
} else { 
//Here call no animation method, like setImageDrawable etc... 
} 

    //create an AnimationListener for each item, when an animation is End, Listener should call a method to change HashMap above which you just created, like this **HashMap.put(position, Boolean.valueOf(true))** //TRUE means animation loaded 
} 

// để có được giá trị vị trí như Integer sử dụng holder.getLayoutPosition()

+0

Sử dụng phương pháp holder.setTag cũng có thể giải quyết vấn đề này, Chỉ cần chọn một trong những bạn nghĩ dễ dàng hơn. – chundk

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