protected void calcDataValueRange() {

    double maxValue = Double.MIN_VALUE;
    double minValue = Double.MAX_VALUE;

    IMeasurable first = this.stickData.get(0);
    // 第一个stick为停盘的情况
    if (first.getHigh() == 0 && first.getLow() == 0) {

    } else {
      maxValue = first.getHigh();
      minValue = first.getLow();
    }

    // 判断显示为方柱或显示为线条
    for (int i = this.displayFrom; i < this.displayFrom + this.displayNumber; i++) {
      IMeasurable stick = this.stickData.get(i);
      if (stick.getLow() < minValue) {
        minValue = stick.getLow();
      }

      if (stick.getHigh() > maxValue) {
        maxValue = stick.getHigh();
      }
    }

    this.maxValue = maxValue;
    this.minValue = minValue;
  }
  protected void drawSticks(Canvas canvas) {
    if (null == stickData) {
      return;
    }
    if (stickData.size() == 0) {
      return;
    }

    Paint mPaintStick = new Paint();
    mPaintStick.setColor(stickFillColor);

    float stickWidth = getDataQuadrantPaddingWidth() / displayNumber - stickSpacing;
    float stickX = getDataQuadrantPaddingStartX();

    for (int i = displayFrom; i < displayFrom + displayNumber; i++) {
      IMeasurable stick = stickData.get(i);
      float highY =
          (float)
              ((1f - (stick.getHigh() - minValue) / (maxValue - minValue))
                      * (getDataQuadrantPaddingHeight())
                  + getDataQuadrantPaddingStartY());
      float lowY =
          (float)
              ((1f - (stick.getLow() - minValue) / (maxValue - minValue))
                      * (getDataQuadrantPaddingHeight())
                  + getDataQuadrantPaddingStartY());

      // stick or line?
      if (stickWidth >= 2f) {
        canvas.drawRect(stickX, highY, stickX + stickWidth, lowY, mPaintStick);
      } else {
        canvas.drawLine(stickX, highY, stickX, lowY, mPaintStick);
      }

      // next x
      stickX = stickX + stickSpacing + stickWidth;
    }
  }