我有一个带有几个视图的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);
当动画中断时,我找不到任何方法来捕捉事件,所以我可以在动画离开屏幕后重新启动动画。
答案 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()