GridView的动画

时间:2014-07-10 12:44:01

标签: android gridview android-animation

任何人都知道,删除1个条目后如何为GridView设置动画?我想要这样的东西:

GridView

第一个是我的普通gridview,有8个项目。如果我删除了一个项目,我想要一个动画开始,已删除项目的颜色将向上滑动并填充空闲位置。 有人有想法吗? 感谢您的帮助:)

1 个答案:

答案 0 :(得分:3)

实现这一目标的一种可能方法可以是按给定顺序执行以下一系列步骤:

1)删除前保存所有网格子项的左/上位置。这里需要注意的一点是,左/上位置应该不映射到gridview中的子位置(删除后会改变),而是映射到适配器中的itemId,即使删除后每个子节点也是如此。为此,适配器应支持stableIds;

2)从适配器中删除网格子项并调用notifyDataSetChanged();

3)在上一步之后,将OnPreDrawListener添加到gridview。这是初始化动画的好地方,因为布局已准备好但尚未绘制到屏幕上。现在我们可以在删除后访问所有孩子的坐标。在第一个onPreDraw()回调中,移除侦听器并计算每个子项的diffXdiffY值。并将translationXtranslationY值设置为diffXdiffY,并开始将每个孩子设置为0转换值。

伪代码可能如下所示:

// Step 1
saveTopLeftPositions(gridView);

// Step 2
adapter.removeAt(deletedPosition);
adapter.notifyDataSetChanged();

// Step 3
gridView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {

    @Override
    public boolean onPreDraw() {
        gridView.getViewTreeObserver().removeOnPreDrawListener(this);

        int firstVisiblePos = grid.getFirstVisiblePosition();
        int childCount = grid.getChildCount();
        for (int i=0; i<childCount; i++) {
            View child = grid.getChildAt(i);

            long itemId = adapter.getItemId(i + firstVisiblePos);
            float diffX = child.getX() - getOldXPos(itemId);
            float diffY = child.getY() - getOldYPos(itemId);
            child.setTranslationX(diffX);
            child.setTranslationY(diffY);

            child.animate().translationX(0).translationY(0);
        }
        return false;
    }
});