无法通过ViewPropertyAnimator更改视图大小?

时间:2014-11-06 04:23:53

标签: android animation zoom android-imagebutton

我想通过Property Animation在ImageButton上实现缩放功能。例如,当我单击按钮时,它将缩小。当我再次点击它时,它会放大。

以下是我的代码的一部分:

    OnClickListener clickPlayButtonHandler = new OnClickListener() {

        @Override
        public void onClick(View v) {
            final ImageButton clickedButton = (ImageButton) v;

            if((Boolean) v.getTag()) {
                // zoom out
                clickedButton.animate().setInterpolator(new AnticipateInterpolator()).setDuration(500).scaleXBy(-0.4f).scaleYBy(-0.4f).setListener(new Animator.AnimatorListener() {
                    @Override
                    public void onAnimationStart(Animator animation) {
                        clickedButton.setImageResource(R.drawable.bg_pause);
                        System.out.println(clickedButton.getWidth()); // output the width of the button for checking
                    }
                    @Override
                    public void onAnimationEnd(Animator animation) {
                        clickedButton.setTag(false);
                        int d = clickedButton.getWidth();
                        System.out.println(clickedButton.getWidth());// output the width of the button for checking

                    }
                    @Override
                    public void onAnimationCancel(Animator animation) {}
                    @Override
                    public void onAnimationRepeat(Animator animation) { }
                });

            } else {
              // process zoom in 
            }
        }
    };

在动画开始和动画结束之前,我打印了按钮的宽度。但是,我发现它们是一样的。我认为当缩小动画完成后,按钮宽度应该比以前小。但事实并非如此。

无法通过ViewPropertyAnimator更改视图大小?

2 个答案:

答案 0 :(得分:1)

clickedButton.getWidth()不会发生变化,因为视图的宽度不受缩放影响。您可以将getWidth()视为获取视图的未缩放宽度的方法。要更改视图的宽度,需要新的度量/布局传递。

ViewPropertyAnimator不会更改View的宽度/高度或任何可能触发另一个布局传递的内容。这只是因为布局过程很昂贵,因此可能导致跳帧,这是我们想要在动画中看到的最后一件事。

如果您需要缩放按钮的宽度,可以执行getScaleX() * clickedButton.getWidth()

答案 1 :(得分:0)

试试ObjectAnimator

    ObjectAnimator xAnimator =
            ObjectAnimator.ofFloat(clickedButton, "scaleX", 1.0f, -0.4f);
    ObjectAnimator yAnimator = 
            ObjectAnimator.ofFloat(clickedButton, "scaleY", 1.0f, -0.4f);
    AnimatorSet animatorSet = new AnimatorSet();
    animatorSet.setDuration(500);
    animatorSet.playTogether(xAnimator, yAnimator);
    animatorSet.setInterpolator(new AnticipateInterpolator());
    animatorSet.addListener(new Animator.AnimatorListener() {
                @Override
                public void onAnimationStart(Animator animation) {
                    clickedButton.setImageResource(R.drawable.bg_pause);
                    System.out.println(clickedButton.getWidth());
                }

                @Override
                public void onAnimationEnd(Animator animation) {
                    clickedButton.setTag(false);
                    int d = clickedButton.getWidth();
                    System.out.println(clickedButton.getWidth());
                }

                @Override
                public void onAnimationCancel(Animator animation) {

                }

                @Override
                public void onAnimationRepeat(Animator animation) {

                }
    });
    animatorSet.start();