当视图超出屏幕时,Android视图动画停止

时间:2014-11-17 18:46:32

标签: android xml animation view

我有一个带有几个视图的recyclerView,一个是动画视图,它有一个动画应用于它。一旦视图离开屏幕,动画就不再有效,即使动画仍然存在。

数据:

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>

应用动画:

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

当动画中断时,我找不到任何方法来捕捉事件,所以我可以在动画离开屏幕后重新启动动画。

4 个答案:

答案 0 :(得分:4)

仅当您将视图动画应用于该视图时,当视图从屏幕中退出时,RecyclerView会错误地停止视图上的动画。如果您将使用Property Animation,一切正常。因此,以下解决方案将起作用:

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

答案 1 :(得分:2)

如果要对ViewAnimation项使用RecyclerView,则必须使用RecyclerView - onViewAttachedToWindow(ItemViewHolder holder)的覆盖方法恢复动画,像:

@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);
    }
}

答案 2 :(得分:0)

我现在正在做同样的事情,并且遇到完全相同的问题。所以问题是如何在视图回到屏幕后重新启动动画。

我通过调用“loadingRotatingCircleIV.startAnimation(animation);”解决了99%的问题。每次调用我的动画视图的位置时,都会在onBindViewHolder中。

但是剩下一点点问题。如果向下滚动一点,那么视图就会离开屏幕,但它的视图持有者不会被回收,当你向后滚动时,onBindViewHolder显然不再被调用,但动画停止了。所以我是仍然试图修复那个......

所以,我目前的解决方案:

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

如果有人有更好的解决方案,请帮助。

答案 3 :(得分: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
}

//将位置值作为整数使用 holder.getLayoutPosition()