我想通过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更改视图大小?
答案 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();