RecyclerView - ItemAnimator - > animateChange不能正常工作?

时间:2016-11-09 13:22:30

标签: android animation android-recyclerview

如果我想为ItemAnimator的内容设置动画,我正试图绕过要使用的RecyclerView课程。

此处我的问题非常具体:我不明白更改动画的工作方式,我不使用移动/添加/删除动画:仅更改。

我一直在寻找像this projectBaseItemAnimator这样的示例,看看它如何使用 android支持库中定义的SimpleItemAnimator

在调用runPendingAnimation()方法后实际运行更改动画时,有两个ViewHolders包含相同的视图但不完全(我检查了不同的ID,但是相同内容!)和两者都使用翻译和alpha值进行动画处理。 我尝试添加我自己的动画,比如缩放以查看我是否得到它,但是没有,因为有时它会工作一段时间它没有。我只是不明白RecyclerView在有这样的动画时如何使用他的观点持有人。

任何人都可以告诉我应该如何使用这些视图持有者,以便每次都能正常播放我自己的动画吗?我想运行一个调整单元格大小的动画。

谢谢!

PS:

  1. 我使用Adapater#notifyItemChange(position)方法触发动画
  2. 我在未滚动RecyclerView时触发动画
  3. 我使用setSupportsChangeAnimations(true)以便触发更改动画
  4. 编辑1

    我希望显示代码,我尝试在现有动画旁边添加自己的动画。请记住,我们在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.有时候没有动画运行......

0 个答案:

没有答案