private void updateArcViewPositions(){
  float halfWidth=getWidth() / 2;
  double radius=getWidth() * 2;
  double powRadius=radius * radius;
  double rotation;
  float halfViewWidth;
  double deltaX;
  double deltaY;
  int viewPosition;
  for (int count=getChildCount(), i=0; i < count; i++) {
    View view=getChildAt(i);
    rotation=0;
    halfViewWidth=view.getWidth() / 2;
    view.setPivotX(halfViewWidth);
    view.setPivotY(view.getHeight());
    if (settings.isFanRadiusEnable()) {
      deltaX=halfWidth - getDecoratedLeft(view) - halfViewWidth;
      deltaY=radius - Math.sqrt(powRadius - deltaX * deltaX);
      view.setTranslationY((float)deltaY);
      rotation=(Math.toDegrees(Math.asin((radius - deltaY) / radius)) - 90) * Math.signum(deltaX);
    }
    viewPosition=getPosition(view);
    Double baseViewRotation=viewRotationsMap.get(viewPosition);
    if (baseViewRotation == null) {
      baseViewRotation=random.nextDouble() * settings.getAngleItemBounce() * 2 - settings.getAngleItemBounce();
      viewRotationsMap.put(viewPosition,baseViewRotation);
    }
    view.setRotation((float)(rotation + baseViewRotation));
  }
}

private void updateArcViewPositions ( ) { float halfWidth = getWidth ( ) / 2 ; double radius = getWidth ( ) * 2 ; double powRadius = radius * radius ; double rotation ; float halfViewWidth ; double deltaX ; double deltaY ; int viewPosition ; for ( int count = getChildCount ( ) , i = 0 ; i < count ; i ++ ) { View view = getChildAt ( i ) ; rotation = 0 ; halfViewWidth = view . getWidth ( ) / 2 ; view . setPivotX ( halfViewWidth ) ; view . setPivotY ( view . getHeight ( ) ) ; if ( settings . isFanRadiusEnable ( ) ) { deltaX = halfWidth - getDecoratedLeft ( view ) - halfViewWidth ; deltaY = radius - Math . sqrt ( powRadius - deltaX * deltaX ) ; view . setTranslationY ( ( float ) deltaY ) ; rotation = ( Math . toDegrees ( Math . asin ( ( radius - deltaY ) / radius ) ) - 90 ) * Math . signum ( deltaX ) ; } viewPosition = getPosition ( view ) ; Double baseViewRotation = viewRotationsMap . get ( viewPosition ) ; if ( baseViewRotation == null ) { baseViewRotation = random . nextDouble ( ) * settings . getAngleItemBounce ( ) * 2 - settings . getAngleItemBounce ( ) ; viewRotationsMap . put ( viewPosition , baseViewRotation ) ; } view . setRotation ( ( float ) ( rotation + baseViewRotation ) ) ; } }
change pivot , rotation , translation for view to create fan effect . change rotation to create bounce effect .
