如何为摇动事件中的文本制作动画

How to Animate Text from a Shake Event

我目前有一个允许用户摇动 phone 的应用程序,不同的文本会从一个数组中出现。但是,文本一直显示得太快,如果用户不断摇动 phone,文本就会不断变化。我该怎么做:

1) 将文本设置为动画,以便在 phone 摇动后,文本会慢慢淡出?

  1. 如何实现摇动延迟,以便用户在摇动之前等待几秒钟phone?

我已经为单击的按钮实现了此功能,但似乎无法与 Sensor Manager 一起使用。

protected final SensorEventListener sensorListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {


            float x = sensorEvent.values[0];
            float y = sensorEvent.values[1];
            float z = sensorEvent.values[2];

            acelLast = acelVal;
            acelVal = (float) Math.sqrt((double) (x*x + y*y + z*z));
            float delta = acelVal - acelLast;
            shake = shake * 0.9f + delta;

            if (shake > 12) {

                int randomNum = new Random().nextInt(answersArray.length);
                ball_text.setText(answersArray[randomNum]);
                ball_text.setVisibility(View.VISIBLE);


            }





        }



        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {

        }
    };

    // Sensor Section //
  1. 您需要为文本视图的 alpha 值变化设置动画。
  2. 您需要记录用户上次摇晃的时间并将其用于检查。

按照以下几行应该可以工作,

long previousTime = 0;

protected final SensorEventListener sensorListener = new SensorEventListener() {
        @Override
        public void onSensorChanged(SensorEvent sensorEvent) {
            float x = sensorEvent.values[0];
            float y = sensorEvent.values[1];
            float z = sensorEvent.values[2];

            acelLast = acelVal;
            acelVal = (float) Math.sqrt((double) (x*x + y*y + z*z));
            float delta = acelVal - acelLast;
            shake = shake * 0.9f + delta;

            if (shake > 12) {
              //Fade in text if difference between previous and current time is > 2 seconds
              if (System.currentTimeMillis() - previousTime > 2000) {
                previousTime = System.currentTimeMillis();
                //Use AlphaAnimation
                Animation fadeInAnimation = new AlphaAnimation(0, 1);
                fadeInAnimation.setAnimationListener(new Animation.AnimationListener() {
                    @Override
                    public void onAnimationStart(Animation animation) {
                        int randomNum = new Random().nextInt(answersArray.length);
                        ball_text.setText(answersArray[randomNum]);
                        ball_text.setVisibility(View.VISIBLE);
                    }
                    @Override
                    public void onAnimationEnd(Animation animation) {}
                    @Override
                    public void onAnimationRepeat(Animation animation) {}
                });
                fadeInAnimation.setInterpolator(new DecelerateInterpolator());
                fadeInAnimation.setDuration(1000);
                ball_text.startAnimation(fadeInAnimation);
                /*
                //This should work, but it doesn't, I'll prob tinker with it on some weekend, I'll update the answer if I figure out the issue
                ball_text.animate()
                   .withStartAction(new Runnable() {
                            @Override
                            public void run() {
                                int randomNum = new Random().nextInt(answersArray.length);
                                ball_text.setText(answersArray[randomNum]);
                                ball_text.setAlpha(0f);
                                ball_text.setVisibility(View.VISIBLE);
                            }
                        })
                   .alpha(1f)
                   //Fade in over a duration of 1 second
                   .setDuration(1000)
                   .start()

                */
              } else {
                //If it's less than 2 seconds since last shake, inform user to wait
                //For eg,
                Toast.makeText(context, "Wait mate", Toast.LENGTH_SHORT).show();
              }
            }
        }
        @Override
        public void onAccuracyChanged(Sensor sensor, int accuracy) {
        }
    };