content: /*
   * Copyright 2015 Google Inc.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   *
   *      http://www.apache.org/licenses/LICENSE-2.0
   *
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  
  package com.music.player.bhandari.m.transition;
  
  import android.animation.Animator;
  import android.animation.AnimatorSet;
  import android.animation.ObjectAnimator;
  import android.content.Context;
  import android.os.Build;
  
  import androidx.annotation.RequiresApi;
  import androidx.core.content.ContextCompat;
  
  import android.transition.ChangeBounds;
  import android.transition.TransitionValues;
  import android.util.AttributeSet;
  import android.view.View;
  import android.view.ViewGroup;
  import android.view.animation.AnimationUtils;
  
  import com.music.player.bhandari.m.R;
  
  /**
   * 从Fab到Dialog的变化
   * <p>
   * A transition that morphs a circle into a rectangle, changing it's background color.
   */
  @RequiresApi(api = Build.VERSION_CODES.KITKAT)
  public class MorphMiniToNowPlaying extends ChangeBounds {
  
      private static final String PROPERTY_COLOR = "circleMorph:color";
      private static final String PROPERTY_CORNER_RADIUS = "circleMorph:cornerRadius";
      private static final String[] TRANSITION_PROPERTIES = {
              PROPERTY_COLOR,
              PROPERTY_CORNER_RADIUS
      };
  
      public MorphMiniToNowPlaying() {
          super();
      }
  
      public MorphMiniToNowPlaying(Context context, AttributeSet attrs) {
          super(context, attrs);
      }
  
      @Override
      public String[] getTransitionProperties() {
          return TRANSITION_PROPERTIES;
      }
  
      @Override
      public void captureStartValues(TransitionValues transitionValues) {
          super.captureStartValues(transitionValues);
          final View view = transitionValues.view;
          if (view.getWidth() <= 0 || view.getHeight() <= 0) {
              return;
          }
          transitionValues.values.put(PROPERTY_COLOR, ContextCompat.getColor(view.getContext(), R.color.fab_background_color));
          transitionValues.values.put(PROPERTY_CORNER_RADIUS, view.getResources().getDimensionPixelSize(R.dimen.dialog_corners));//view.getHeight() / 2
      }
  
      @Override
      public void captureEndValues(TransitionValues transitionValues) {
          super.captureEndValues(transitionValues);
          final View view = transitionValues.view;
          if (view.getWidth() <= 0 || view.getHeight() <= 0) {
              return;
          }
          transitionValues.values.put(PROPERTY_COLOR, ContextCompat.getColor(view.getContext(), R.color.dialog_background_color));
          transitionValues.values.put(PROPERTY_CORNER_RADIUS, view.getResources().getDimensionPixelSize(R.dimen.dialog_corners));
      }
  
      @RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
      @Override
      public Animator createAnimator(final ViewGroup sceneRoot, TransitionValues startValues, final TransitionValues endValues) {
          Animator changeBounds = super.createAnimator(sceneRoot, startValues, endValues);
          if (startValues == null || endValues == null || changeBounds == null) {
              return null;
          }
  
          Integer startColor = (Integer) startValues.values.get(PROPERTY_COLOR);
          Integer startCornerRadius = (Integer) startValues.values.get(PROPERTY_CORNER_RADIUS);
          Integer endColor = (Integer) endValues.values.get(PROPERTY_COLOR);
          Integer endCornerRadius = (Integer) endValues.values.get(PROPERTY_CORNER_RADIUS);
  
          if (startColor == null || startCornerRadius == null || endColor == null || endCornerRadius == null) {
              return null;
          }
  
          MorphDrawable background = new MorphDrawable(startColor, startCornerRadius);
          endValues.view.setBackground(background);
  
          Animator color = ObjectAnimator.ofArgb(background, MorphDrawable.COLOR, endColor);
          Animator corners = ObjectAnimator.ofFloat(background, MorphDrawable.CORNER_RADIUS, endCornerRadius);
  
          // ease in the dialog's child views (slide up & fade in)
          if (endValues.view instanceof ViewGroup) {
              ViewGroup vg = (ViewGroup) endValues.view;
              float offset = vg.getHeight() / 3;
              for (int i = 0; i < vg.getChildCount(); i++) {
                  View v = vg.getChildAt(i);
                  v.setTranslationY(offset);
                  v.setAlpha(0f);
                  v.animate().alpha(1f).translationY(0f).setDuration(500).setStartDelay(150)
                          .setInterpolator(AnimationUtils.loadInterpolator(vg.getContext(), android.R.interpolator.fast_out_slow_in))
                          .start();
                  offset *= 1.8f;
              }
          }
  
          AnimatorSet transition = new AnimatorSet();
          transition.playTogether(changeBounds, corners, color);
          transition.setDuration(300);
          transition.setInterpolator(AnimationUtils.loadInterpolator(sceneRoot.getContext(), android.R.interpolator.fast_out_slow_in));
          return transition;
      }
  
  }
  