protected void initCompassView() {
    setFocusable(true);
    Resources r = this.getResources();

    circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    circlePaint.setColor(R.color.transparent_color);
    circlePaint.setStrokeWidth(1);
    circlePaint.setStyle(Paint.Style.STROKE);

    textPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    textPaint.setColor(r.getColor(R.color.text_color));
    textPaint.setFakeBoldText(true);
    textPaint.setSubpixelText(true);
    textPaint.setTextAlign(Align.LEFT);

    textHeight = (int) textPaint.measureText("yY");

    markerPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    markerPaint.setColor(r.getColor(R.color.transparent_color));
    markerPaint.setAlpha(200);
    markerPaint.setStrokeWidth(1);
    markerPaint.setStyle(Paint.Style.STROKE);
    markerPaint.setShadowLayer(2, 1, 1, r.getColor(R.color.transparent_color));

    borderGradientColors = new int[4];
    borderGradientPositions = new float[4];

    borderGradientColors[3] = r.getColor(R.color.transparent_color);
    borderGradientColors[2] = r.getColor(R.color.transparent_color);
    borderGradientColors[1] = r.getColor(R.color.transparent_color);
    borderGradientColors[0] = r.getColor(R.color.transparent_color);
    borderGradientPositions[3] = 0.0f;
    borderGradientPositions[2] = 1 - 0.03f;
    borderGradientPositions[1] = 1 - 0.06f;
    borderGradientPositions[0] = 1.0f;

    glassGradientColors = new int[5];
    glassGradientPositions = new float[5];

    int glassColor = 245;
    glassGradientColors[4] = Color.argb(65, glassColor, glassColor, glassColor);
    glassGradientColors[3] = Color.argb(100, glassColor, glassColor, glassColor);
    glassGradientColors[2] = Color.argb(50, glassColor, glassColor, glassColor);
    glassGradientColors[1] = Color.argb(0, glassColor, glassColor, glassColor);
    glassGradientColors[0] = Color.argb(0, glassColor, glassColor, glassColor);
    glassGradientPositions[4] = 1 - 0.0f;
    glassGradientPositions[3] = 1 - 0.06f;
    glassGradientPositions[2] = 1 - 0.10f;
    glassGradientPositions[1] = 1 - 0.20f;
    glassGradientPositions[0] = 1 - 1.0f;

    skyHorizonColorFrom = r.getColor(R.color.transparent_color);
    skyHorizonColorTo = r.getColor(R.color.transparent_color);

    groundHorizonColorFrom = r.getColor(R.color.transparent_color);
    groundHorizonColorTo = r.getColor(R.color.transparent_color);
  }
示例#2
0
 /**
  * 画左右侧的边界区域(将超出的chart图形覆盖)
  *
  * @param canvas
  */
 private void drawLimitRect(Canvas canvas) {
   Paint paint = new Paint();
   paint.setColor(backColor);
   paint.setStyle(Style.FILL);
   canvas.drawRect(0, 0, leftPadding + yTextWidth, height - bottomPadding, paint);
   canvas.drawRect(width - rightPadding, 0, width, height - bottomPadding, paint);
 }
示例#3
0
  /** 构造函数,主要对一些对象初始化 */
  public MySurfaceView(Context context) {
    super(context);

    mHolder = this.getHolder(); // 获得SurfaceHolder对象
    mHolder.addCallback(this); // 添加状态监听

    mPaint = new Paint(); // 创建一个画笔对象
    mPaint.setColor(Color.WHITE); // 设置画笔的颜色为白色

    qPaint = new Paint(); // 创建一个画笔对象
    qPaint.setAntiAlias(true); // 消除锯齿
    qPaint.setStyle(Paint.Style.STROKE); // 设置画笔风格为描边
    qPaint.setStrokeWidth(3); // 设置描边的宽度为3
    qPaint.setColor(Color.GREEN); // 设置画笔的颜色为绿色

    // 创建路径对象
    mPath = new Path();
    qPath = new Path();
    tPath = new Path();

    // 设置坐标为50,100
    mX = 50;
    mY = 100;

    // 设置贝塞尔曲线的开始坐标为(10,200)
    qStartX = 10;
    qStartY = 200;

    setFocusable(true); // 设置焦点
  }
示例#4
0
 public MyView(Context context) {
   super(context);
   paint = new Paint();
   paint.setColor(Color.BLUE);
   paint.setStyle(Paint.Style.STROKE); // 设置画笔风格为描边
   paint.setStrokeWidth(10);
   random = new Random();
   setFocusable(true);
   holder = getHolder();
   holder.addCallback(this);
   path = new Path();
 }
示例#5
0
  protected void onDraw(Canvas cs) {
    super.onDraw(cs);

    // 描画方法の設定
    Paint p = new Paint();
    p.setColor(Color.BLACK);
    p.setStyle(Paint.Style.FILL);
    p.setStrokeWidth(8);

    // 円の描画
    cs.drawCircle(x, y, 50, p);
  }
示例#6
0
 /**
  * 背景画网格的横线
  *
  * @param canvas
  */
 private void drawGridLine(Canvas canvas) {
   Paint paint = new Paint();
   paint.setColor(gridLineColor);
   paint.setAntiAlias(true);
   paint.setStyle(Style.STROKE);
   paint.setStrokeWidth(gridLineSize);
   paint.setPathEffect(new DashPathEffect(new float[] {10, 20}, 0));
   for (int i = 1; i <= yNum; i++) {
     // 画网格的横线
     canvas.drawLine(
         leftPadding + yTextWidth,
         height - bottomPadding - xTextHeight - (spaceYLength * i),
         width - rightPadding,
         height - bottomPadding - xTextHeight - (spaceYLength * i),
         paint);
   }
 }
示例#7
0
 /**
  * 画X,Y轴和边框
  *
  * @param canvas
  */
 private void drawAxesLine(Canvas canvas) {
   XYpaint = new Paint();
   XYpaint.setColor(axesLineColor);
   XYpaint.setAntiAlias(true);
   XYpaint.setStyle(Style.FILL_AND_STROKE);
   XYpaint.setStrokeWidth(chartFrameLineSize);
   // 左侧Y轴
   canvas.drawLine(
       leftPadding + yTextWidth,
       topPadding + topTextHeight,
       leftPadding + yTextWidth,
       height - bottomPadding - xTextHeight,
       XYpaint);
   // 三角箭头
   Path yTriangle = new Path();
   yTriangle.moveTo(leftPadding + yTextWidth - 10, topPadding + topTextHeight);
   yTriangle.lineTo(leftPadding + yTextWidth, topPadding + topTextHeight - 20);
   yTriangle.lineTo(leftPadding + yTextWidth + 10, topPadding + topTextHeight);
   yTriangle.close();
   canvas.drawPath(yTriangle, XYpaint);
   // 下方X轴
   canvas.drawLine(
       leftPadding + yTextWidth,
       height - bottomPadding - xTextHeight,
       width - rightPadding,
       height - bottomPadding - xTextHeight,
       XYpaint);
   // 三角箭头
   Path xTriangle = new Path();
   xTriangle.moveTo(width - rightPadding, height - bottomPadding - xTextHeight + 10);
   xTriangle.lineTo(width - rightPadding + 15, height - bottomPadding - xTextHeight);
   xTriangle.lineTo(width - rightPadding, height - bottomPadding - xTextHeight - 10);
   xTriangle.close();
   canvas.drawPath(xTriangle, XYpaint);
   // 上方封顶
   // canvas.drawLine(leftPadding + xTextHeight, topPadding + topTextHeight, width - rightPadding,
   // topPadding + topTextHeight, XYpaint);
   // 右侧封边
   // canvas.drawLine(width - rightPadding, topPadding + topTextHeight, width - rightPadding,
   // height - bottomPadding - xTextHeight, XYpaint);
 }
示例#8
0
  /**
   * 画折线图,网格竖线,X坐标值
   *
   * @param canvas
   */
  private void drawChartLine(Canvas canvas) {
    Paint paintChart = new Paint();
    paintChart.setColor(chartLineColor);
    paintChart.setAntiAlias(true);
    paintChart.setStyle(Style.STROKE);
    paintChart.setStrokeWidth(chartLineSize);

    Paint paintGrid = new Paint();
    paintGrid.setColor(gridLineColor);
    paintGrid.setAntiAlias(true);
    paintGrid.setStyle(Style.STROKE);
    paintGrid.setStrokeWidth(gridLineSize);

    Paint paintTopText = new Paint();
    paintTopText.setColor(axesLineColor);
    paintTopText.setAntiAlias(true);
    paintTopText.setSubpixelText(true);
    paintTopText.setTypeface(Typeface.MONOSPACE);
    paintTopText.setTextSize(topTextSize);
    paintTopText.setTextAlign(Align.CENTER);

    Paint paintBottomText = new Paint();
    paintBottomText.setColor(axesLineColor);
    paintBottomText.setAntiAlias(true);
    paintBottomText.setSubpixelText(true);
    paintBottomText.setTypeface(Typeface.MONOSPACE);
    paintBottomText.setTextSize(bottomTextSize);
    paintBottomText.setTextAlign(Align.CENTER);

    Paint paintPoint = new Paint();
    paintPoint.setColor(pointColor);
    paintPoint.setAntiAlias(true);
    paintPoint.setStyle(Style.FILL);

    pressedPaint = new Paint();
    pressedPaint.setColor(pressedColor);
    pressedPaint.setAntiAlias(true);
    pressedPaint.setStyle(Style.FILL);

    Paint paintShape = new Paint();
    paintShape.setStyle(Style.FILL);
    paintShape.setColor(shapeColor);
    paintShape.setAlpha(shapeAlpha);

    if (axesData.size() > 0) {
      for (int i = 0; i < axesData.size(); i++) {
        if (i < axesData.size() - 1) {
          // 画折线
          canvas.drawLine(
              axesData.get(i).X,
              axesData.get(i).Y,
              axesData.get(i + 1).X,
              axesData.get(i + 1).Y,
              paintChart);
          if (isShapeShow) {
            // 画阴影
            Path path = new Path();
            path.moveTo(axesData.get(i).X, height - bottomPadding - xTextHeight);
            path.lineTo(axesData.get(i).X, axesData.get(i).Y + chartLineSize / 2);
            path.lineTo(axesData.get(i + 1).X, axesData.get(i + 1).Y + chartLineSize / 2);
            path.lineTo(axesData.get(i + 1).X, height - bottomPadding - xTextHeight);
            canvas.drawPath(path, paintShape);
          }
        }
        // 画网格竖线
        // canvas.drawLine(axesData.get(i).X, height - bottomPadding - xTextHeight,
        // axesData.get(i).X, topPadding + topTextHeight, paintGrid);
        // 写X轴坐标的刻度值
        if (!TextUtils.isEmpty(axesData.get(i).getxText())) {
          setTextSizeForWidth(
              paintBottomText, spaceXLength - 10, axesData.get(i).getxText()); // 10为相邻日期文字间隔
          canvas.drawText(
              axesData.get(i).getxText(),
              axesData.get(i).X,
              height - bottomPadding - xTextHeight / 2,
              paintBottomText);
        }
        // 写顶部的刻度值
        if (!TextUtils.isEmpty(axesData.get(i).getTopText())) {
          // 取消了顶部隔年显示的数据
          //					canvas.drawText(axesData.get(i).getTopText(), axesData.get(i).X, topPadding,
          // paintTopText);
        }
        // 画数据点
        if (pointBitmap == null) {
          canvas.drawCircle(axesData.get(i).X, axesData.get(i).Y, pointSize + 1, paintChart);
          canvas.drawCircle(axesData.get(i).X, axesData.get(i).Y, pointSize, paintPoint);
        } else {
          Matrix matrix = new Matrix();
          canvas.drawBitmap(pointBitmap, matrix, paintPoint);
        }
      }

      // 画最后一个数据的网格竖线
      // canvas.drawLine(axesData.get(axesData.size() - 1).X, height - bottomPadding - xTextHeight,
      // axesData.get(axesData.size() - 1).X,
      //        topPadding + topTextHeight, paintGrid);
      // 写X轴坐标的最后一个值的刻度值
      /*
       * canvas.drawText(axesData.get(axesData.size() - 1).X + "",
       * axesData.get(axesData.size() - 1).X, height - bottomPadding -
       * xTextHeight / 2, paintBottomText);
       */
      // 写顶部的最后一个刻度值
      // canvas.drawText("2014", axesData.get(axesData.size() - 1).X,
      // topPadding, paintTopText);
      // 画数最后一个据点
      if (pointBitmap == null) {
        // canvas.drawCircle(axesData.get(axesData.size() - 1).X,
        // axesData.get(axesData.size() - 1).Y, pointSize + 1,
        // paintChart);
        // canvas.drawCircle(axesData.get(axesData.size() - 1).X,
        // axesData.get(axesData.size() - 1).Y, pointSize, paintPoint);
      } else {
        Matrix matrix = new Matrix();
        canvas.drawBitmap(pointBitmap, matrix, paintPoint);
      }
    }

    if (currentPressedPoint != null) {
      // canvas.drawCircle(currentPressedPoint.X, currentPressedPoint.Y, pointSize, pressedPaint);
    }
  }
示例#9
0
  private void stroke(Seria s, Canvas canvas) {
    mPlotPaint.setStyle(Paint.Style.STROKE);
    // draw line
    if (s.mWidth > 0) {
      // create the path
      mPath.reset();
      mPath.moveTo(calcX(s.x[0]), calcY(s.y[0]));
      for (int i = 1; i < s.sz(); i++) {
        mPath.lineTo(calcX(s.x[i]), calcY(s.y[i]));
      }
      // draw the path
      mPlotPaint.setColor(s.mColor);
      mPlotPaint.setStrokeWidth(s.mWidth);
      mPlotPaint.setPathEffect(s.mEffect);
      canvas.drawPath(mPath, mPlotPaint);
    }

    // draw images seria
    if (s.bms != null) {
      for (int i = 0; i < s.sz(); i++) {
        Bitmap bm;
        if (s.bms.length > 1) {
          bm = s.bms[i];
        } else {
          bm = s.bms[0];
        }
        float left = calcX(s.x[i]);
        float top = calcY(s.y[i]);
        if (s.hAlign == HALIGN.CENTER) {
          left -= bm.getWidth() / 2;
        } else if (s.hAlign == HALIGN.RIGHT) {
          left -= bm.getWidth();
        }
        if (s.vAlign == VALIGN.CENTER) {
          top -= bm.getHeight() / 2;
        } else if (s.vAlign == VALIGN.BOTTOM) {
          top -= bm.getHeight();
        }
        canvas.drawBitmap(s.bms[i], left, top, mPlotPaint);
      }
    }
    if (s.texts != null) {
      Align align = Align.CENTER;
      switch (s.hAlign) {
        case LEFT:
          align = Align.RIGHT;
        case RIGHT:
          align = Align.LEFT;
      }

      mPlotPaint.setTextAlign(align);
      mPlotPaint.setStrokeWidth(0);
      mPlotPaint.setColor(s.mColor);
      for (int i = 0; i < s.sz(); i++) {
        float x = calcX(s.x[i]);
        float y = calcY(s.y[i]);
        switch (s.vAlign) {
          case TOP:
            y -= mPlotPaint.getTextSize();
          case CENTER:
            y -= 0.5 * mPlotPaint.getTextSize();
        }
        if (s.deg != 0) {
          canvas.save();
          canvas.rotate(s.deg, x, y);
        }
        canvas.drawText(s.texts[i], x, y, mPlotPaint);
        if (s.deg != 0) {
          canvas.restore();
        }
      }
    }
  }
示例#10
0
  @Override
  protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    // draw border
    mPlotPaint.setStyle(Paint.Style.STROKE);
    mPlotPaint.setColor(Color.BLACK);
    canvas.drawRect(mPlotBounds, mPlotPaint);
    // draw grid
    mPlotPaint.setColor(gridColor);
    // x grid
    if (xTicks != null) {
      for (float tick : xTicks) {
        int x = calcX(tick);
        canvas.drawLine(x, mPlotBounds.bottom, x, mPlotBounds.top, mPlotPaint);
      }
    }
    if (yTicks != null) {
      for (float tick : yTicks) {
        int y = calcY(tick);
        canvas.drawLine(mPlotBounds.left, y, mPlotBounds.right, y, mPlotPaint);
      }
    }
    /* *************************
     *  draw the data
     ***************************/
    for (Seria s : mData) {
      stroke(s, canvas);
    }

    // draw rectangles that hide out of bounds lines
    mPlotPaint.setStyle(Style.FILL);
    mPlotPaint.setColor(Color.WHITE);
    // left
    canvas.drawRect(0, 0, mPlotBounds.left, this.getBottom(), mPlotPaint);
    // bottom
    canvas.drawRect(0, mPlotBounds.bottom + 1, this.getRight(), this.getBottom(), mPlotPaint);
    // right
    canvas.drawRect(mPlotBounds.right + 1, 0, this.getRight(), this.getBottom(), mPlotPaint);
    // top
    canvas.drawRect(0, 0, this.getRight(), mPlotBounds.top, mPlotPaint);

    // x ticks
    mPlotPaint.setStyle(Paint.Style.STROKE);
    mPlotPaint.setTextAlign(Align.CENTER);
    mPlotPaint.setTextSize(xTickTextHeight);
    mPlotPaint.setColor(xTickColor);
    if (xTicks != null) {
      for (float tick : xTicks) {
        textFigure(
            xTickFormat.format(tick).toString(),
            calcX(tick),
            mPlotBounds.bottom + xTickTextHeight,
            canvas);
      }
    }
    mPlotPaint.setTextSize(labelTextHeight);
    mPlotPaint.setTextAlign(Align.RIGHT);
    if (labelX != null) {
      textFigure(labelX, mPlotBounds.right, mPlotBounds.bottom + axisXSpacing, canvas);
    }

    // y ticks
    mPlotPaint.setTextAlign(Align.CENTER);
    mPlotPaint.setTextSize(yTickTextHeight);
    mPlotPaint.setColor(yTickColor);
    if (yTicks != null) {
      for (float tick : yTicks) {
        textFigure(
            yTickFormat.format(tick).toString(),
            mPlotBounds.left - yTickTextHeight,
            calcY(tick),
            90,
            canvas);
      }
    }
    mPlotPaint.setTextSize(labelTextHeight);
    mPlotPaint.setTextAlign(Align.RIGHT);
    if (labelX != null) {
      textFigure(labelX, mPlotBounds.right, mPlotBounds.bottom + axisXSpacing, canvas);
    }
    mPlotPaint.setTextAlign(Align.LEFT);
    if (labelY != null) {
      textFigure(labelY, mPlotBounds.left - axisYSpacing, mPlotBounds.top, 90, canvas);
    }
  }
示例#11
0
  /**
   * Initialize the control. This code is in a separate method so that it can be called from both
   * constructors.
   */
  private void init() {
    // Force the background to software rendering because otherwise the Blur
    // filter won't work.
    setLayerToSW(this);

    // Set up the paint for the label text
    mTextPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    mTextPaint.setColor(mTextColor);
    if (mTextHeight == 0) {
      mTextHeight = mTextPaint.getTextSize();
    } else {
      mTextPaint.setTextSize(mTextHeight);
    }

    // Set up the paint for the pie slices
    mPiePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    mPiePaint.setStyle(Paint.Style.FILL);
    mPiePaint.setTextSize(mTextHeight);

    cSlicePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    cSlicePaint.setStyle(Paint.Style.FILL);

    // Set up the paint for the shadow
    mShadowPaint = new Paint(0);
    mShadowPaint.setColor(0xff101010);
    mShadowPaint.setMaskFilter(new BlurMaskFilter(8, BlurMaskFilter.Blur.NORMAL));

    // Add a child view to draw the pie. Putting this in a child view
    // makes it possible to draw it on a separate hardware layer that rotates
    // independently
    mPieView = new PieView(getContext());
    addView(mPieView);
    mPieView.rotateTo(mPieRotation);

    // The pointer doesn't need hardware acceleration, but in order to show up
    // in front of the pie it also needs to be on a separate view.
    mPointerView = new PointerView(getContext());
    addView(mPointerView);

    // Set up an animator to animate the PieRotation property. This is used to
    // correct the pie's orientation after the user lets go of it.
    if (Build.VERSION.SDK_INT >= 11) {
      mAutoCenterAnimator = ObjectAnimator.ofInt(PieChart.this, "PieRotation", 0);

      // Add a listener to hook the onAnimationEnd event so that we can do
      // some cleanup when the pie stops moving.
      mAutoCenterAnimator.addListener(
          new Animator.AnimatorListener() {
            public void onAnimationStart(Animator animator) {}

            public void onAnimationEnd(Animator animator) {
              mPieView.decelerate();
            }

            public void onAnimationCancel(Animator animator) {}

            public void onAnimationRepeat(Animator animator) {}
          });
    }

    // Create a Scroller to handle the fling gesture.
    if (Build.VERSION.SDK_INT < 11) {
      mScroller = new Scroller(getContext());
    } else {
      mScroller = new Scroller(getContext(), null, true);
    }
    // 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.
    if (Build.VERSION.SDK_INT >= 11) {
      mScrollAnimator = ValueAnimator.ofFloat(0, 1);
      mScrollAnimator.addUpdateListener(
          new ValueAnimator.AnimatorUpdateListener() {
            public void onAnimationUpdate(ValueAnimator valueAnimator) {
              tickScrollAnimation();
            }
          });
    }

    // Create a gesture detector to handle onTouch messages
    mDetector = new GestureDetector(PieChart.this.getContext(), new GestureListener());

    // Turn off long press--this control doesn't use it, and if long press is enabled,
    // you can't scroll for a bit, pause, then scroll some more (the pause is interpreted
    // as a long press, apparently)
    mDetector.setIsLongpressEnabled(false);
  }