docs: @Override
      protected void initializeGraph() {
          super.initializeGraph();
  
          mGraphPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
          mGraphPaint.setStyle(Paint.Style.FILL);
  
          mLegendPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.LINEAR_TEXT_FLAG);
          mLegendPaint.setColor(mLegendColor);
          mLegendPaint.setTextSize(mLegendTextSize);
          mLegendPaint.setStrokeWidth(2);
          mLegendPaint.setStyle(Paint.Style.FILL);
  
          mMaxFontHeight = Utils.calculateMaxTextHeight(mLegendPaint, null);
  
          mGestureDetector = new GestureDetector(getContext(), mGestureListener);
          mScroller = new Scroller(getContext());
  
          mRevealAnimator = ValueAnimator.ofFloat(0, 1);
          mRevealAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
              @Override
              public void onAnimationUpdate(ValueAnimator animation) {
                  mRevealValue = (animation.getAnimatedFraction());
                  mGraph.invalidate();
              }
          });
          mRevealAnimator.addListener(new Animator.AnimatorListener() {
              @Override
              public void onAnimationStart(Animator animation) {
              }
  
              @Override
              public void onAnimationEnd(Animator animation) {
                  mStartedAnimation = false;
              }
  
              @Override
              public void onAnimationCancel(Animator animation) {
  
              }
  
              @Override
              public void onAnimationRepeat(Animator animation) {
  
              }
          });
  
          // The scroller doesn't have any built-in animation functions--it just supplies
          // values when we ask it to. So we have to have a way to call it every frame
          // until the fling ends. This code (ab)uses a ValueAnimator object to generate
          // a callback on every animation frame. We don't use the animated value at all.
          mScrollAnimator = ValueAnimator.ofFloat(0, 1);
          mScrollAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
              public void onAnimationUpdate(ValueAnimator valueAnimator) {
                  tickScrollAnimation();
                  invalidateGlobal();
              }
          });
  
      }