我创建了一个应用程序,其中的按钮在按下时会缩小,以模拟物理按钮被按下的情况。按钮的功能符合预期,但在用户的实际测试中,我们发现有时按钮不会恢复到原来的大小(发生率约为5%)。
这种意外行为的原因尚不清楚,希望您能提供任何见解。我们目前的假设是ACTION_UP || ACTION_CANCEL
在一些罕见的情况下不会被触发,但我们不确定。
public class MainActivity extends CustomActivity
{
public AppCompatButton myButton;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myButton = (AppCompatButton) findViewById(R.id.my_button);
myButton.setOnClickListener(myClickListener); // handle the actual click
myButton.setOnTouchListene(myTouchListener); // simulate press down
}
...
private View.OnTouchListener myTouchListener = new View.OnTouchListener()
{
@Override
public boolean onTouch(View v, MotionEvent event)
{
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN)
{
ObjectAnimator scaleDownX = ObjectAnimator.ofFloat(v, "scaleX", 0.7f);
ObjectAnimator scaleDownY = ObjectAnimator.ofFloat(v, "scaleY", 0.7f);
scaleDownX.setDuration(120);
scaleDownY.setDuration(120);
AnimatorSet scaleDown = new AnimatorSet();
scaleDown.play(scaleDownX).with(scaleDownY);
scaleDown.start();
}
if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL)
{
ObjectAnimator scaleUpX = ObjectAnimator.ofFloat(v, "scaleX", 1);
ObjectAnimator scaleUpY = ObjectAnimator.ofFloat(v, "scaleY", 1);
scaleUpX.setDuration(100);
scaleUpY.setDuration(100);
AnimatorSet scaleUp = new AnimatorSet();
scaleUp.play(scaleUpX).with(scaleUpY);
scaleUp.start();
}
return false;
}
};
}
2条答案
按热度按时间t8e9dugd1#
问题已解决。发现正在调用
ACTION_UP
和ACTION_CANCEL
,但问题出在scaleDown.start();
和scaleUp.start();
之间的交互。如果两个动画同时执行,
scaleUp.start();
不会自动取消scaleDown.start();
的动画,按钮会停留在“向下”的位置。这个问题通过使用Facebook的Spring库得到了解决。rsaldnfx2#
我测试了你的代码。它对我来说工作得很完美。如果你仍然有问题,我建议你使用Rebound - Spring animations for android