private void startAnimation(){
  ValueAnimator animator=ValueAnimator.ofFloat(1.0f);
  ArrayList<NameValuesHolder> nameValueList=(ArrayList<NameValuesHolder>)mPendingAnimations.clone();
  mPendingAnimations.clear();
  int propertyMask=0;
  int propertyCount=nameValueList.size();
  for (int i=0; i < propertyCount; ++i) {
    NameValuesHolder nameValuesHolder=nameValueList.get(i);
    propertyMask|=nameValuesHolder.mNameConstant;
  }
  mAnimatorMap.put(animator,new PropertyBundle(propertyMask,nameValueList));
  animator.addUpdateListener(mAnimatorEventListener);
  animator.addListener(mAnimatorEventListener);
  if (mStartDelaySet) {
    animator.setStartDelay(mStartDelay);
  }
  if (mDurationSet) {
    animator.setDuration(mDuration);
  }
  if (mInterpolatorSet) {
    animator.setInterpolator(mInterpolator);
  }
  animator.start();
}

private void startAnimation ( ) { ValueAnimator animator = ValueAnimator . ofFloat ( 1.0f ) ; ArrayList < NameValuesHolder > nameValueList = ( ArrayList < NameValuesHolder > ) mPendingAnimations . clone ( ) ; mPendingAnimations . clear ( ) ; int propertyMask = 0 ; int propertyCount = nameValueList . size ( ) ; for ( int i = 0 ; i < propertyCount ; ++ i ) { NameValuesHolder nameValuesHolder = nameValueList . get ( i ) ; propertyMask |= nameValuesHolder . mNameConstant ; } mAnimatorMap . put ( animator , new PropertyBundle ( propertyMask , nameValueList ) ) ; animator . addUpdateListener ( mAnimatorEventListener ) ; animator . addListener ( mAnimatorEventListener ) ; if ( mStartDelaySet ) { animator . setStartDelay ( mStartDelay ) ; } if ( mDurationSet ) { animator . setDuration ( mDuration ) ; } if ( mInterpolatorSet ) { animator . setInterpolator ( mInterpolator ) ; } animator . start ( ) ; }
starts the underlying animator for a set of properties . we use a single animator that simply runs from 0 to 1 , and then use that fractional value to set each property value accordingly .
