如果第二个动画开始,像Flip动画这样的Gmail会被中断

时间:2014-04-10 17:29:21

标签: java android animation

我已经实现了一个带有翻转复选框(GMail风格)的Android列表视图,如下所示:http://techiedreams.com/gmail-like-flip-animated-multi-selection-list-view-with-action-mode/

我遇到的问题(即使在源代码示例中):如果有多个项目我按快速顺序点击/检查,前一个动画将停止并将被重新显示。换句话说,前一个动画没有完成,并被第二个动画中断。

简单下载源代码并自行尝试。在comparisson中gmail所有动画,无论我点击的速度有多快,都是从开始到结束进行的。

我无法在演示源代码中找到这段代码来改变这种行为。

任何提示?

提前致谢:)

2 个答案:

答案 0 :(得分:2)

这是我最接近Gmail的翻转动画:

在getView()方法中(我使用上下文操作模式):

        holder.check.setOnClickListener(
                new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        if (mActionMode == null) {
                            checked = new SparseBooleanArray(alllists.size());
                            mActionMode = ((Activity) getActivity()).startActionMode(mActionModeCallback);
                            animateRow(position);
                            checked.put(position, true);
                            mActionMode.setTitle("1");
                            mActionMode.getMenu().getItem(0).setVisible(true);
                        } else {
                            animateRow(position);
                            if (checked.get(position)) {
                                checked.put(position, false);
                                if (checked.indexOfValue(true) < 0) {
                                    mActionMode.finish();

                                } else {
                                    mActionMode.setTitle(String.valueOf(getCheckedCount()));

                                }
                            } else {
                                checked.put(position, true);
                                mActionMode.setTitle(String.valueOf(getCheckedCount()));

                            }
                        }
                    }
                }
                                       );

然后是animateRow()方法:

private void animateRow(final int position) {
    if (position >= listView.getFirstVisiblePosition() && position <= listView.getLastVisiblePosition()) {
        Log.i("animateRow", String.valueOf(position));
        ScaleAnimation anim = new ScaleAnimation(1, 0, 1, 1, Animation.RELATIVE_TO_SELF, 0.5f, 0, 0);
        anim.setDuration(150);
        anim.setRepeatCount(1);
        anim.setRepeatMode(Animation.REVERSE);

        viewa = listView.getChildAt(position - listView.getFirstVisiblePosition());
        final Button chkButton = (Button) viewa.findViewById(R.id.logo);

        if (checked.get(position)) {
            anim.setAnimationListener(
                    new AnimationListener() {
                        @Override
                        public void onAnimationStart(Animation animation) {
                            Log.i("anim" + position, "Start");
                        }

                        @Override
                        public void onAnimationRepeat(Animation animation) {

                            Log.i("anim" + position, "Repeat" + animation.getRepeatCount());
                            viewa.setBackgroundResource(R.color.row_background);
                            chkButton.setBackgroundResource(R.color.button_background);
                            chkButton.setText(String.valueOf(alllists.get(position).itemsCount));
                        }

                        @Override
                        public void onAnimationEnd(Animation animation) {
                            Log.i("anim" + position, "END");

                        }
                    }
                                     );
            chkButton.startAnimation(anim);

        } else {

            anim.setAnimationListener(
                    new AnimationListener() {
                        @Override
                        public void onAnimationStart(Animation animation) {
                            Log.i("anim" + position, "Start");
                        }

                        @Override
                        public void onAnimationRepeat(Animation animation) {
                            viewa.setBackgroundResource(R.color.checked_row_background);
                            chkButton.setBackgroundResource(R.color.checked_button_background);
                            chkButton.setText("✓");
                        }

                        @Override
                        public void onAnimationEnd(Animation animation) {
                            Log.i("anim" + position, "END");

                        }
                    }
                                     );
            chkButton.startAnimation(anim);

        }
    }
}

我希望它有所帮助.. :)

答案 1 :(得分:0)

现在你可以忘记翻转视图的方法,因为我已经开发了一个完全可自定义的新库FlipView,这正是你想要的。您可以使用任何类型的动画交换任何类型的视图和布局。

请看一下。