@Override
 public void onAnimationCancel(View view) {
   Object listenerTag = view.getTag(LISTENER_TAG_ID);
   ViewPropertyAnimatorListener listener = null;
   if (listenerTag instanceof ViewPropertyAnimatorListener) {
     listener = (ViewPropertyAnimatorListener) listenerTag;
   }
   if (listener != null) {
     listener.onAnimationCancel(view);
   }
 }
 @Override
 public void onAnimationStart(View view) {
   if (mVpa.mOldLayerType >= 0) {
     ViewCompat.setLayerType(view, ViewCompat.LAYER_TYPE_HARDWARE, null);
   }
   if (mVpa.mStartAction != null) {
     mVpa.mStartAction.run();
   }
   Object listenerTag = view.getTag(LISTENER_TAG_ID);
   ViewPropertyAnimatorListener listener = null;
   if (listenerTag instanceof ViewPropertyAnimatorListener) {
     listener = (ViewPropertyAnimatorListener) listenerTag;
   }
   if (listener != null) {
     listener.onAnimationStart(view);
   }
 }
 @Override
 public void onAnimationEnd(View view) {
   if (mVpa.mOldLayerType >= 0) {
     ViewCompat.setLayerType(view, mVpa.mOldLayerType, null);
     mVpa.mOldLayerType = -1;
   }
   if (mVpa.mEndAction != null) {
     mVpa.mEndAction.run();
   }
   Object listenerTag = view.getTag(LISTENER_TAG_ID);
   ViewPropertyAnimatorListener listener = null;
   if (listenerTag instanceof ViewPropertyAnimatorListener) {
     listener = (ViewPropertyAnimatorListener) listenerTag;
   }
   if (listener != null) {
     listener.onAnimationEnd(view);
   }
 }
 private void startAnimation(ViewPropertyAnimatorCompat vpa, View view) {
   Object listenerTag = view.getTag(LISTENER_TAG_ID);
   ViewPropertyAnimatorListener listener = null;
   if (listenerTag instanceof ViewPropertyAnimatorListener) {
     listener = (ViewPropertyAnimatorListener) listenerTag;
   }
   Runnable startAction = vpa.mStartAction;
   Runnable endAction = vpa.mEndAction;
   if (startAction != null) {
     startAction.run();
   }
   if (listener != null) {
     listener.onAnimationStart(view);
     listener.onAnimationEnd(view);
   }
   if (endAction != null) {
     endAction.run();
   }
   if (mStarterMap != null) {
     mStarterMap.remove(view);
   }
 }