android 有时未收到ACTION_UP或ACTION_CANCEL事件

jrcvhitl  于 2023-02-06  发布在  Android
关注(0)|答案(2)|浏览(348)

我创建了一个应用程序,其中的按钮在按下时会缩小,以模拟物理按钮被按下的情况。按钮的功能符合预期,但在用户的实际测试中,我们发现有时按钮不会恢复到原来的大小(发生率约为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;
        }
    };
}
t8e9dugd

t8e9dugd1#

问题已解决。发现正在调用ACTION_UPACTION_CANCEL,但问题出在scaleDown.start();scaleUp.start();之间的交互。
如果两个动画同时执行,scaleUp.start();不会自动取消scaleDown.start();的动画,按钮会停留在“向下”的位置。这个问题通过使用Facebook的Spring库得到了解决。

rsaldnfx

rsaldnfx2#

我测试了你的代码。它对我来说工作得很完美。如果你仍然有问题,我建议你使用Rebound - Spring animations for android

相关问题