Android ViewPager删除带动画的项目

时间:2017-07-01 21:49:08

标签: android animation android-viewpager

我将viewpager的布局作为page.I尝试删除deleteBtn上带动画的项目。如果页面没有滚动(活动刚刚加载了viewpager),它几乎可以工作。 如果页面被更改,动画不会出现,但项目会像往常一样删除。 请帮我修复删除时的动画外观。

代码寻呼机适配器

body{
   height:100%;
}

1 个答案:

答案 0 :(得分:1)

我做了一些与众不同的事情,使工作顺利。想法是删除带有动画的当前项目(将其alpha设置为0),然后将左侧或右侧项目(带有动画)水平平移到现在不可见的项目位置。动画完成后,我将进行实际的数据删除和notfyDataSetChanged()调用。

我将这个remove()方法放入ViewPager的子类中

public void remove(int position, OnViewRemovedListener onViewRemovedListener) {

    final int childCount = getChildCount();
    if (childCount > 0) {
        View toRemove = getChildAt(position);
        int to = toRemove.getLeft();

        final PagerAdapter adapter = getAdapter();
        toRemove.animate()
                .alpha(0)
                .setDuration(getResources().getInteger(android.R.integer.config_shortAnimTime))
                .setListener(new SimpleAnimatorListener() {
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        if (childCount == 1) {
                            if (onViewRemovedListener != null) onViewRemovedListener.onRemoved(position, -1);
                            if (adapter!= null) adapter.notifyDataSetChanged();
                        }
                    }
                })
                .start();

        if (childCount > 1) {
            int newPosition = position + 1 <= childCount - 1 ? position + 1 : position - 1;
            View replacement = getChildAt(newPosition);
            int from = replacement.getLeft();
            replacement.animate()
                    .setInterpolator(new DecelerateInterpolator())
                    .setDuration(getResources().getInteger(android.R.integer.config_mediumAnimTime))
                    .translationX(to - from)
                    .setListener(new SimpleAnimatorListener() {
                        @Override
                        public void onAnimationEnd(Animator animation) {
                            if (onViewRemovedListener != null) onViewRemovedListener.onRemoved(position, newPosition);
                            if (adapter!= null) adapter.notifyDataSetChanged();
                        }
                    })
                    .start();
        }
    }
}

public interface OnViewRemovedListener {

    void onRemoved(int position, int newPosition);
}