如果我想为ItemAnimator
的内容设置动画,我正试图绕过要使用的RecyclerView
课程。
此处我的问题非常具体:我不明白更改动画的工作方式,我不使用移动/添加/删除动画:仅更改。
我一直在寻找像this project的BaseItemAnimator
这样的示例,看看它如何使用 android支持库中定义的SimpleItemAnimator
在调用runPendingAnimation()
方法后实际运行更改动画时,有两个ViewHolders
包含相同的视图但不完全(我检查了不同的ID,但是相同内容!)和两者都使用翻译和alpha值进行动画处理。
我尝试添加我自己的动画,比如缩放以查看我是否得到它,但是没有,因为有时它会工作一段时间它没有。我只是不明白RecyclerView
在有这样的动画时如何使用他的观点持有人。
任何人都可以告诉我应该如何使用这些视图持有者,以便每次都能正常播放我自己的动画吗?我想运行一个调整单元格大小的动画。
谢谢!
PS:
Adapater#notifyItemChange(position)
方法触发动画RecyclerView
时触发动画setSupportsChangeAnimations(true)
以便触发更改动画我希望显示代码,我尝试在现有动画旁边添加自己的动画。请记住,我们在runPendingChanges()
内。
if (changesPending) {
final List<CustomChangeInfo> changes = new ArrayList<>(this.mPendingChangesCustom.size());
changes.addAll(this.mPendingChangesCustom);
this.mPendingChangesCustom.clear();
final Runnable changer = new Runnable() {
@Override
public void run() {
for (final CustomChangeInfo customChangeInfo : changes) {
final ChangeInfo changeInfo = customChangeInfo.changeInfo;
final RecyclerView.ViewHolder holder = changeInfo.oldHolder;
final View oldView = holder == null ? null : holder.itemView;
final RecyclerView.ViewHolder newHolder = changeInfo.newHolder;
final View newView = newHolder != null ? newHolder.itemView : null;
if (oldView != null) {
mChangeAnimations.add(changeInfo.oldHolder);
final ViewPropertyAnimatorCompat oldViewAnim =
ViewCompat.animate(oldView).setDuration(2500);
oldViewAnim.scaleX(1.5f).scaleY(1.5f);
oldViewAnim.translationX(changeInfo.toX - changeInfo.fromX);
oldViewAnim.translationY(changeInfo.toY - changeInfo.fromY);
oldViewAnim.alpha(1).setListener(new VpaListenerAdapter() {
@Override public void onAnimationStart(View view) {
dispatchChangeStarting(changeInfo.oldHolder, true);
Log.d(TAG, "Start Old View id = " + view.getId());
}
@Override public void onAnimationEnd(View view) {
Log.d(TAG, "End Old View id = " + oldView.getId());
oldViewAnim.setListener(null);
ViewCompat.setAlpha(view, 1);
ViewCompat.setTranslationX(view, 0);
ViewCompat.setTranslationY(view, 0);
ViewCompat.setScaleX(view, 1f);
ViewCompat.setScaleY(view, 1f);
dispatchChangeFinished(changeInfo.oldHolder, true);
mChangeAnimations.remove(changeInfo.oldHolder);
dispatchFinishedWhenDone();
}
}).start();
}
if (newView != null) {
mChangeAnimations.add(changeInfo.newHolder);
final ViewPropertyAnimatorCompat newViewAnimation = ViewCompat.animate(newView);
newViewAnimation.translationX(0).translationY(0).setDuration(2500)
.scaleX(1.5f).scaleY(1.5f)
.alpha(1).setListener(new VpaListenerAdapter() {
@Override public void onAnimationStart(View view) {
dispatchChangeStarting(changeInfo.newHolder, false);
Log.d(TAG, "Start New View id = " + view.getId());
}
@Override public void onAnimationEnd(View view) {
Log.d(TAG, "End New View id = " + newView.getId());
newViewAnimation.setListener(null);
ViewCompat.setAlpha(newView, 1);
ViewCompat.setTranslationX(newView, 0);
ViewCompat.setTranslationY(newView, 0);
ViewCompat.setScaleX(newView, 1f);
ViewCompat.setScaleY(newView, 1f);
dispatchChangeFinished(changeInfo.newHolder, false);
mChangeAnimations.remove(changeInfo.newHolder);
dispatchFinishedWhenDone();
}
}).start();
}
}
}
};
如您所见,我添加了一些日志来检查ID,看看我们是否正在处理不同的观点,确实如此!
结果不一致: 1.有时我可以看到两个视图缩放,有时只有一个 2.有一段时间它是另一个被缩放的单元格(当我在动画后滚动时) 3.有时候没有动画运行......