Android: Animation Position Resets After Complete

后端 未结 9 1544
南笙
南笙 2020-11-27 13:30

I\'m using an xml defined animation to slide a view off the screen. The problem is, as soon as the animation completes it resets to its original position. I need to know how

9条回答
  •  不知归路
    2020-11-27 13:53

    Use helper methods below to easily animate your view. Then you can animate and reset after completion like this:

    // Animate the view:
    
    fly(
      view1,
      (float) 0,
      (float) 0,
      (float) 0,
      (float) 1000,
      250,
      null,
      null,
      () -> {
    
        // Return the view to initial position on animation end:  
    
        fly(
          view1,
          (float) 0,
          (float) 0,
          (float) 0,
          (float) 0,
          0);
    
        return null;
      });
    

    Helper methods:

    /**
     * Translation of a view.
     */
    public static void fly(
      View view,
      float fromXDelta,
      float toXDelta,
      float fromYDelta,
      float toYDelta,
      int duration) {
    
      fly(
        view,
        fromXDelta,
        toXDelta,
        fromYDelta,
        toYDelta,
        duration,
        null,
        null,
        null);
    }
    
    /**
     * Translation of a view with handlers.
     *
     * @param view       A view to animate.
     * @param fromXDelta Amount to shift by X axis for start position.
     * @param toXDelta   Amount to shift by X axis for end position.
     * @param fromYDelta Amount to shift by Y axis for start position.
     * @param toYDelta   Amount to shift by Y axis for end position.
     * @param duration   Animation duration.
     * @param start      On animation start. Otherwise NULL.
     * @param repeat     On animation repeat. Otherwise NULL.
     * @param end        On animation end. Otherwise NULL.
     */
    public static void fly(
      View view,
      float fromXDelta,
      float toXDelta,
      float fromYDelta,
      float toYDelta,
      int duration,
      Callable start,
      Callable repeat,
      Callable end) {
    
      Animation animation;
    
      animation =
        new TranslateAnimation(
          fromXDelta,
          toXDelta,
          fromYDelta,
          toYDelta);
    
      animation.setDuration(
        duration);
    
      animation.setInterpolator(
        new DecelerateInterpolator());
    
      animation.setFillAfter(true);
    
      view.startAnimation(
        animation);
    
      animation.setAnimationListener(new AnimationListener() {
    
        @Override
        public void onAnimationStart(Animation animation) {
    
          if (start != null) {
            try {
    
              start.call();
    
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
    
        }
    
        @Override
        public void onAnimationEnd(Animation animation) {
    
          if (end != null) {
            try {
    
              end.call();
    
            } catch (Exception e) {
              e.printStackTrace();
            }
          }
        }
    
        @Override
        public void onAnimationRepeat(
          Animation animation) {
    
          if (repeat != null) {
            try {
    
              repeat.call();
    
            } catch (Exception e) {
              e.printStackTrace();
            }
          }  
        }
      });
    }
    

提交回复
热议问题