Ejemplo n.º 1
0
 /**
  * 描述:TODO.
  *
  * @version v1.0
  * @param event the event
  * @return true, if successful
  * @see View#onTouchEvent(MotionEvent)
  * @author: amsoft.cn
  * @date:2013-6-17 上午9:04:51
  */
 @Override
 public boolean onTouchEvent(MotionEvent event) {
   // 判断事件的位置 是标尺 还是图表
   if (mRenderer != null) {
     // 分解事件
     float newX = event.getX();
     float newY = event.getY();
     // 坐标轴之外事件
     // int bottom = y + height - margins[2] - legendSize;
     int bottom = 0;
     if (mChart instanceof XYChart) {
       Rect mScreenR = ((XYChart) mChart).getScreenR();
       bottom = mScreenR.bottom;
     } else {
     }
     if (newY >= bottom - 10) {
       // 不是图表事件
       if (mTouchHandler.handleTouchControl(event)) {
         return true;
       }
     } else {
       // 可拖动,缩放打开默认拖动也打开
       if ((mRenderer.isPanEnabled() || mRenderer.isZoomEnabled())) {
         if (mTouchHandler.handleTouch(event)) {
           return true;
         }
       }
     }
   }
   return super.onTouchEvent(event);
 }
Ejemplo n.º 2
0
 /**
  * Saves the content of the graphical view to a bitmap.
  *
  * @return the bitmap
  */
 public Bitmap toBitmap() {
   setDrawingCacheEnabled(false);
   if (!isDrawingCacheEnabled()) {
     setDrawingCacheEnabled(true);
   }
   if (mRenderer.isApplyBackgroundColor()) {
     setDrawingCacheBackgroundColor(mRenderer.getBackgroundColor());
   }
   setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
   return getDrawingCache(true);
 }
Ejemplo n.º 3
0
 public void draw(float delta) {
   Gdx.gl.glEnable(GL10.GL_BLEND);
   Gdx.gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
   clear();
   if (debug) {
     debugRenderer.draw(CAM);
   } else {
     defaultRenderer.draw(CAM, delta);
   }
   uiRenderer.draw(delta);
 }
Ejemplo n.º 4
0
  /**
   * Creates a new graphical view.
   *
   * @param context the context
   * @param chart the chart to be drawn
   */
  public GraphicalView(Context context, AbstractChart chart) {
    super(context);
    mContext = context;
    mChart = chart;
    mHandler = new Handler();
    if (mChart instanceof XYChart) {
      mRenderer = ((XYChart) mChart).getRenderer();
    } else {
      mRenderer = ((RoundChart) mChart).getRenderer();
    }
    if (mRenderer.isZoomButtonsVisible()) {
      zoomInImage = AbFileUtil.getBitmapFromSrc("image/zoom_in.png");
      zoomOutImage = AbFileUtil.getBitmapFromSrc("image/zoom_out.png");
      fitZoomImage = AbFileUtil.getBitmapFromSrc("image/zoom-1.png");
    }

    if (mRenderer instanceof XYMultipleSeriesRenderer
        && ((XYMultipleSeriesRenderer) mRenderer).getMarginsColor()
            == XYMultipleSeriesRenderer.NO_COLOR) {
      ((XYMultipleSeriesRenderer) mRenderer).setMarginsColor(mPaint.getColor());
    }
    if (mRenderer.isZoomEnabled() && mRenderer.isZoomButtonsVisible()
        || mRenderer.isExternalZoomEnabled()) {
      mZoomIn = new Zoom(mChart, true, mRenderer.getZoomRate());
      mZoomOut = new Zoom(mChart, false, mRenderer.getZoomRate());
      mFitZoom = new FitZoom(mChart);
    }
    mTouchHandler = new TouchHandler(this, mChart);

    if (mChart instanceof XYChart) {
      XYMultipleSeriesRenderer mXYMultipleSeriesRenderer = ((XYChart) mChart).getRenderer();

      // 根据屏幕大小重置所有尺寸
      int explainTextSize1 = mXYMultipleSeriesRenderer.getExplainTextSize1();
      int explainTextSize2 = mXYMultipleSeriesRenderer.getExplainTextSize2();
      int scaleCircleRadius = mXYMultipleSeriesRenderer.getScaleCircleRadius();
      int scaleRectWidth = mXYMultipleSeriesRenderer.getScaleRectWidth();
      int scaleRectHeight = mXYMultipleSeriesRenderer.getScaleRectHeight();
      // 按分辨率转换
      mXYMultipleSeriesRenderer.setExplainTextSize1(AbViewUtil.scale(mContext, explainTextSize1));
      mXYMultipleSeriesRenderer.setExplainTextSize2(AbViewUtil.scale(mContext, explainTextSize2));
      mXYMultipleSeriesRenderer.setScaleCircleRadius(AbViewUtil.scale(mContext, scaleCircleRadius));
      mXYMultipleSeriesRenderer.setScaleRectWidth(AbViewUtil.scale(mContext, scaleRectWidth));
      mXYMultipleSeriesRenderer.setScaleRectHeight(AbViewUtil.scale(mContext, scaleRectHeight));

      SimpleSeriesRenderer[] mSimpleSeriesRenderers = mRenderer.getSeriesRenderers();
      if (mSimpleSeriesRenderers != null && mSimpleSeriesRenderers.length > 0) {
        for (int i = 0; i < mSimpleSeriesRenderers.length; i++) {
          SimpleSeriesRenderer mSimpleSeriesRenderer = mSimpleSeriesRenderers[i];
          int mChartValuesTextSize = (int) mSimpleSeriesRenderer.getChartValuesTextSize();
          mSimpleSeriesRenderer.setChartValuesTextSize(
              AbViewUtil.scale(mContext, mChartValuesTextSize));
        }
      }
    }

    int chartTitleTextSize = (int) mRenderer.getChartTitleTextSize();
    mRenderer.setChartTitleTextSize(AbViewUtil.scale(mContext, chartTitleTextSize));
    // 轴线上标签文字大小
    int mLabelsTextSize = (int) mRenderer.getLabelsTextSize();
    mRenderer.setLabelsTextSize(AbViewUtil.scale(mContext, mLabelsTextSize));
    // 说明文字大小
    int mLegendTextSize = (int) mRenderer.getLegendTextSize();
    mRenderer.setLegendTextSize(AbViewUtil.scale(mContext, mLegendTextSize));
  }
Ejemplo n.º 5
0
  /**
   * 描述:TODO.
   *
   * @version v1.0
   * @param canvas the canvas
   * @see View#onDraw(Canvas)
   * @author: amsoft.cn
   * @date:2013-6-17 上午9:04:51
   */
  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    canvas.getClipBounds(mRect);
    int top = mRect.top;
    int left = mRect.left;
    int width = mRect.width();
    int height = mRect.height();
    if (mRenderer.isInScroll()) {
      top = 0;
      left = 0;
      width = getMeasuredWidth();
      height = getMeasuredHeight();
    }
    mChart.draw(canvas, left, top, width, height, mPaint);

    if (mRenderer != null && mRenderer.isZoomEnabled() && mRenderer.isZoomButtonsVisible()) {
      mPaint.setColor(ZOOM_BUTTONS_COLOR);

      int bitmapWidth = zoomInImage.getWidth();
      int bitmapHeight = zoomInImage.getHeight();

      int rectMargin = 10;
      int topPadding = 15;
      int leftPadding = 20;
      int leftRect = width - bitmapWidth * 3 - rectMargin - 4 * leftPadding;
      int topRect = height - bitmapHeight - rectMargin - 2 * topPadding;
      int rightRect = width - rectMargin;
      int bottomRect = height - rectMargin;

      mZoomR.set(leftRect, topRect, rightRect, bottomRect);
      canvas.drawRoundRect(mZoomR, bitmapWidth / 2, bitmapWidth / 2, mPaint);
      // 画图标
      float buttonY = height - bitmapHeight - rectMargin - topPadding;
      canvas.drawBitmap(
          zoomInImage, width - rectMargin - bitmapWidth * 3 - 3 * leftPadding, buttonY, null);
      canvas.drawBitmap(
          zoomOutImage, width - rectMargin - bitmapWidth * 2 - 2 * leftPadding, buttonY, null);
      canvas.drawBitmap(
          fitZoomImage, width - rectMargin - bitmapWidth - leftPadding, buttonY, null);
    }

    if (mChart instanceof XYChart) {
      XYMultipleSeriesRenderer mXYMultipleSeriesRenderer = ((XYChart) mChart).getRenderer();

      if (mXYMultipleSeriesRenderer.isScaleLineEnabled()) {
        oldX = ((TouchHandler) mTouchHandler).getOldX();
        int scaleTopPadding = 50;
        // 从坐标轴往下
        int scaleBottomPadding = 20;
        int explainTextSize1 = mXYMultipleSeriesRenderer.getExplainTextSize1();
        int explainTextSize2 = mXYMultipleSeriesRenderer.getExplainTextSize2();
        int scaleCircleRadius = mXYMultipleSeriesRenderer.getScaleCircleRadius();
        // 按分辨率转换
        scaleTopPadding = AbViewUtil.scale(mContext, scaleTopPadding);
        scaleBottomPadding = AbViewUtil.scale(mContext, scaleBottomPadding);

        // Y轴位置
        int bottomY = 0;
        int topY = 0;
        if (mChart instanceof XYChart) {
          Rect mScreenR = ((XYChart) mChart).getScreenR();
          bottomY = mScreenR.bottom;
          topY = mScreenR.top;
          if (oldX == 0) {
            oldX = mScreenR.right;
          }
        } else {
        }

        // 标尺线与拖手
        mPaint.setColor(mXYMultipleSeriesRenderer.getScaleLineColor());
        canvas.drawLine(oldX, scaleTopPadding, oldX, bottomY + scaleBottomPadding, mPaint);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setColor(ZOOM_BUTTONS_COLOR);
        canvas.drawCircle(
            oldX, bottomY + scaleBottomPadding + scaleCircleRadius, scaleCircleRadius, mPaint);

        // 判断挂到哪个点上
        if (mChart instanceof XYChart) {
          List<Float> mPoints = null;
          List<Double> mValues = null;
          List<String> mExplains = null;
          float minValue = -1;
          int minIndex = -1;
          // 要显示的文本
          String showValue = "";
          String showExplain = "";
          Map<Integer, List<Float>> points = ((XYChart) mChart).getPoints();
          Map<Integer, List<Double>> values = ((XYChart) mChart).getValues();
          Map<Integer, List<String>> explains = ((XYChart) mChart).getExplains();
          for (Entry<Integer, List<Float>> value : points.entrySet()) {
            int index = value.getKey();
            mPoints = value.getValue();
            mValues = values.get(value.getKey());
            mExplains = explains.get(value.getKey());

            // 判断距离在2范围的点的索引
            minValue = 1000;
            minIndex = -1;

            for (int i = 0; i < mPoints.size(); i += 2) {
              Float f = mPoints.get(i);
              if (Math.abs(f - oldX) < minValue) {
                minValue = Math.abs(f - oldX);
                minIndex = i;
              }
            }
            if (index == 0) {
              showValue = String.valueOf((double) mValues.get(minIndex + 1)).replace(".0", "");
              String showExplainT = mExplains.get(minIndex / 2);
              if (showExplainT != null && !"".equals(showExplainT.trim())) {
                showExplain = mExplains.get(minIndex / 2);
              }
            } else {
              showValue =
                  showValue
                      + "/"
                      + String.valueOf((double) mValues.get(minIndex + 1)).replace(".0", "");
              String showExplainT = mExplains.get(minIndex / 2);
              if (showExplainT != null && !"".equals(showExplainT.trim())) {
                if (showExplain != null && !"".equals(showExplain.trim())) {
                  showExplain = showExplain + "/" + mExplains.get(minIndex / 2);
                } else {
                  showExplain = mExplains.get(minIndex / 2);
                }
              }
            }
          }
          if (minValue < 5) {

            boolean showRect = false;
            if (mXYMultipleSeriesRenderer.isDisplayValue0()) {
              showRect = true;
            } else {
              if ("0".equals(showValue) || "0/0".equals(showValue)) {
                showRect = false;
              } else {
                showRect = true;
              }
            }
            if (showRect) {
              // 画框框和点

              // 获取文本的高度
              TextPaint mTextPaint1 = new TextPaint(Paint.ANTI_ALIAS_FLAG);
              mTextPaint1.setColor(Color.WHITE);
              mTextPaint1.setTypeface(Typeface.DEFAULT);
              mTextPaint1.setTextSize(explainTextSize1);

              TextPaint mTextPaint2 = new TextPaint(Paint.ANTI_ALIAS_FLAG);
              mTextPaint2.setColor(Color.WHITE);
              mTextPaint2.setTypeface(Typeface.DEFAULT);
              mTextPaint2.setTextSize(explainTextSize2);

              // 行高
              float hSize1 = AbGraphicUtil.getDesiredHeight(mTextPaint1);

              // 行高
              float hSize2 = AbGraphicUtil.getDesiredHeight(mTextPaint2);

              int textPadding = 8;
              textPadding = AbViewUtil.scale(mContext, textPadding);

              // 设置个新的长方形
              // 判断文字是否超出设置的框框
              int row1 =
                  AbGraphicUtil.getDrawRowCount(
                      showValue, mXYMultipleSeriesRenderer.getScaleRectWidth() - 10, mTextPaint1);
              int row2 =
                  AbGraphicUtil.getDrawRowCount(
                      showExplain, mXYMultipleSeriesRenderer.getScaleRectWidth() - 10, mTextPaint2);
              RectF mRectF = null;
              int textHeight = (int) (row1 * hSize1 + row2 * hSize2 + textPadding);

              // 提示框的宽度和高度
              int realScaleRectWidth = mXYMultipleSeriesRenderer.getScaleRectWidth();
              int realScaleRectHeight = mXYMultipleSeriesRenderer.getScaleRectHeight();

              // 画圆角矩形  //充满
              mPaint.setStyle(Paint.Style.FILL);
              mPaint.setColor(mXYMultipleSeriesRenderer.getScaleRectColor());
              // 设置画笔的锯齿效果
              mPaint.setAntiAlias(true);

              int mRectLeft = (int) (double) mPoints.get(minIndex);
              int mRectTop = (int) (double) mPoints.get(minIndex + 1);
              int mRectRight = mRectLeft + realScaleRectWidth;
              int mRectBottom = mRectTop + realScaleRectHeight;

              if (textHeight > realScaleRectHeight) {
                realScaleRectHeight = textHeight;
                mRectBottom = mRectTop + realScaleRectHeight;
              }

              // 判断是否会超出屏幕
              if (mRectRight > width) {
                // 超出了
                mRectLeft =
                    (int) (double) mPoints.get(minIndex)
                        - 5
                        - mXYMultipleSeriesRenderer.getScaleRectWidth();
                mRectRight = (int) (double) mPoints.get(minIndex) - 5;
              }
              if (mRectBottom > bottomY) {
                // 超出了
                mRectTop = (int) (double) mPoints.get(minIndex + 1) - 5 - realScaleRectHeight;
                mRectBottom = (int) (double) mPoints.get(minIndex + 1) - 5;

                // 是否超出Y=0的位置的
                if (mRectTop < topY) {
                  mRectTop = mRectTop + realScaleRectHeight / 2;
                  mRectBottom = mRectBottom + realScaleRectHeight / 2;
                }
              }

              mRectF = new RectF(mRectLeft, mRectTop, mRectRight, mRectBottom);
              // 第二个参数是x半径,第三个参数是y半径
              canvas.drawRoundRect(mRectF, 5, 5, mPaint);

              AbGraphicUtil.drawText(
                  canvas,
                  showValue,
                  mXYMultipleSeriesRenderer.getScaleRectWidth(),
                  mTextPaint1,
                  mRectLeft + textPadding,
                  mRectTop + textPadding);
              AbGraphicUtil.drawText(
                  canvas,
                  showExplain,
                  mXYMultipleSeriesRenderer.getScaleRectWidth(),
                  mTextPaint2,
                  mRectLeft + textPadding,
                  (int) (mRectTop + textPadding + row1 * hSize1));
            }
          }
        }
      }
    }
  }