Java Code Examples for android.graphics.Path#arcTo()

The following examples show how to use android.graphics.Path#arcTo() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: Bubble.java    From imsdk-android with MIT License 6 votes vote down vote up
private void initTopRoundedPath(RectF rect, Path path, float strokeWidth) {
    path.moveTo(rect.left + Math.min(mArrowPosition, mCornersRadius) + strokeWidth, rect.top + mArrowHeight + strokeWidth);
    path.lineTo(rect.left + mArrowPosition + (strokeWidth / 2), rect.top + mArrowHeight + strokeWidth);
    path.lineTo(rect.left + mArrowWidth / 2 + mArrowPosition, rect.top + strokeWidth + strokeWidth);
    path.lineTo(rect.left + mArrowWidth + mArrowPosition - (strokeWidth / 2), rect.top + mArrowHeight + strokeWidth);
    path.lineTo(rect.right - mCornersRadius - strokeWidth, rect.top + mArrowHeight + strokeWidth);

    path.arcTo(new RectF(rect.right - mCornersRadius,
            rect.top + mArrowHeight + strokeWidth, rect.right - strokeWidth, mCornersRadius + rect.top + mArrowHeight), 270, 90);
    path.lineTo(rect.right - strokeWidth, rect.bottom - mCornersRadius - strokeWidth);

    path.arcTo(new RectF(rect.right - mCornersRadius, rect.bottom - mCornersRadius,
            rect.right - strokeWidth, rect.bottom - strokeWidth), 0, 90);
    path.lineTo(rect.left + mCornersRadius + strokeWidth, rect.bottom - strokeWidth);

    path.arcTo(new RectF(rect.left + strokeWidth, rect.bottom - mCornersRadius,
            mCornersRadius + rect.left, rect.bottom - strokeWidth), 90, 90);

    path.lineTo(rect.left + strokeWidth, rect.top + mArrowHeight + mCornersRadius + strokeWidth);

    path.arcTo(new RectF(rect.left + strokeWidth, rect.top + mArrowHeight + strokeWidth, mCornersRadius
            + rect.left, mCornersRadius + rect.top + mArrowHeight), 180, 90);

    path.close();
}
 
Example 2
Source File: PathMeasureView.java    From zone-sdk with MIT License 6 votes vote down vote up
private void testArc(Canvas canvas) {
    Path path=new Path();
    int minWidth=400;
    int br = minWidth / 2;
    RectF bigCircle = new RectF(-br, -br, br, br);

    int sr = minWidth / 4;
    RectF smallCircle = new RectF(-sr, -sr, sr, sr);

    float bigSweepAngle = 84;
    float smallSweepAngle = -80;
    path.addArc(bigCircle, 50, bigSweepAngle);
    path.arcTo(smallCircle, 130, smallSweepAngle);
    path.close();
    canvas.drawPath(path, mDeafultPaint);

    logRegion();


}
 
Example 3
Source File: BubbleImageView.java    From CloudPan with Apache License 2.0 6 votes vote down vote up
public void leftPath(RectF rect, Path path) {
	path.moveTo(mAngle + mArrowWidth, rect.top);
	path.lineTo(rect.width(), rect.top);
	path.arcTo(new RectF(rect.right - mAngle * 2, rect.top, rect.right,
			mAngle * 2 + rect.top), 270, 90);
	path.lineTo(rect.right, rect.top);
	path.arcTo(new RectF(rect.right - mAngle * 2, rect.bottom - mAngle * 2,
			rect.right, rect.bottom), 0, 90);
	path.lineTo(rect.left + mArrowWidth, rect.bottom);
	path.arcTo(new RectF(rect.left + mArrowWidth, rect.bottom - mAngle * 2,
			mAngle * 2 + rect.left + mArrowWidth, rect.bottom), 90, 90);
	path.lineTo(rect.left + mArrowWidth, mArrowTop + mArrowHeight);
	path.lineTo(rect.left, mArrowTop - mArrowOffset);
	path.lineTo(rect.left + mArrowWidth, mArrowTop);
	path.lineTo(rect.left + mArrowWidth, rect.top);
	path.arcTo(new RectF(rect.left + mArrowWidth, rect.top, mAngle * 2
			+ rect.left + mArrowWidth, mAngle * 2 + rect.top), 180, 90);

	path.close();
}
 
Example 4
Source File: RoundSideRectDrawable.java    From MHViewer with Apache License 2.0 6 votes vote down vote up
@Override
protected void onBoundsChange(Rect bounds) {
    int width = bounds.width();
    int height = bounds.height();
    RectF rectF = mTempRectF;
    Path path = mPath;

    path.reset();
    if (width > height) {
        int radius = height / 2;
        path.moveTo(bounds.right - radius, bounds.top);
        rectF.set(bounds.right - height, bounds.top, bounds.right, bounds.bottom);
        path.arcTo(rectF, -90.0f, 180.0f, false);
        path.lineTo(bounds.left + radius, bounds.bottom);
        rectF.set(bounds.left, bounds.top, bounds.left + height, bounds.bottom);
        path.arcTo(rectF, 90.0f, 180.0f, false);
        path.lineTo(bounds.right - radius, bounds.top);
    } else if (width == height) {
        path.addCircle(bounds.centerX(), bounds.centerY(), width / 2, Path.Direction.CW);
    } else {
        // TODO
    }
}
 
Example 5
Source File: BubbleImageView.java    From LQRWeChat with MIT License 6 votes vote down vote up
public void rightPath(RectF rect, Path path) {
    path.moveTo(mAngle, rect.top);
    path.lineTo(rect.width(), rect.top);
    path.arcTo(new RectF(rect.right - mAngle * 2 - mArrowWidth, rect.top,
            rect.right - mArrowWidth, mAngle * 2 + rect.top), 270, 90);
    path.lineTo(rect.right - mArrowWidth, mArrowTop);
    path.lineTo(rect.right, mArrowTop - mArrowOffset);
    path.lineTo(rect.right - mArrowWidth, mArrowTop + mArrowHeight);
    path.lineTo(rect.right - mArrowWidth, rect.height() - mAngle);
    path.arcTo(new RectF(rect.right - mAngle * 2 - mArrowWidth, rect.bottom
            - mAngle * 2, rect.right - mArrowWidth, rect.bottom), 0, 90);
    path.lineTo(rect.left, rect.bottom);
    path.arcTo(new RectF(rect.left, rect.bottom - mAngle * 2, mAngle * 2
            + rect.left, rect.bottom), 90, 90);
    path.lineTo(rect.left, rect.top);
    path.arcTo(new RectF(rect.left, rect.top, mAngle * 2 + rect.left,
            mAngle * 2 + rect.top), 180, 90);
    path.close();
}
 
Example 6
Source File: RoundAngleImageView.java    From NewFastFrame with Apache License 2.0 5 votes vote down vote up
private void drawLiftUp(Canvas canvas) {
    Path path = new Path();
    path.moveTo(0, roundHeight);
    path.lineTo(0, 0);
    path.lineTo(roundWidth, 0);
    path.arcTo(new RectF(
                    0,
                    0,
                    roundWidth * 2,
                    roundHeight * 2),
            -90,
            -90);
    path.close();
    canvas.drawPath(path, paint);
}
 
Example 7
Source File: RoundAngleImageView.java    From wallpaper with GNU General Public License v2.0 5 votes vote down vote up
private void drawRightUp(Canvas canvas) {
	Path path = new Path();
	path.moveTo(getWidth(), roundHeight);
	path.lineTo(getWidth(), 0);
	path.lineTo(getWidth() - roundWidth, 0);
	path.arcTo(new RectF(getWidth() - roundWidth * 2, 0, getWidth(), 0 + roundHeight * 2), -90, 90);
	path.close();
	canvas.drawPath(path, paint);
}
 
Example 8
Source File: RadiisImageView.java    From VideoOS-Android-SDK with GNU General Public License v3.0 5 votes vote down vote up
private void drawTopRight(Canvas canvas) {
    if ((radius[2] > 0) || (radius[3] > 0)) {
        int width = getWidth();
        Path path = new Path();
        path.moveTo(width - radius[2], 0);
        path.lineTo(width, 0);
        path.lineTo(width, radius[3]);
        path.arcTo(new RectF(width - 2 * radius[2], 0, width,
                radius[3] * 2), 0, -90);
        path.close();
        canvas.drawPath(path, roundPaint);
    }
}
 
Example 9
Source File: RoundAngleImageView.java    From wallpaper with GNU General Public License v2.0 5 votes vote down vote up
private void drawLiftDown(Canvas canvas) {
	Path path = new Path();
	path.moveTo(0, getHeight() - roundHeight);
	path.lineTo(0, getHeight());
	path.lineTo(roundWidth, getHeight());
	path.arcTo(new RectF(0, getHeight() - roundHeight * 2, 0 + roundWidth * 2, getHeight()), 90, 90);
	path.close();
	canvas.drawPath(path, paint);
}
 
Example 10
Source File: PieItem.java    From GravityBox with Apache License 2.0 5 votes vote down vote up
private Path getOutline(float scale) {
    RectF outerBB = new RectF(-mOuter * scale, -mOuter * scale, mOuter * scale, mOuter * scale);
    RectF innerBB = new RectF(-mInner * scale, -mInner * scale, mInner * scale, mInner * scale);

    double gamma = (mInner + mOuter) * Math.sin(Math.toRadians(mGap / 2.0f));
    float alphaOuter = (float) Math.toDegrees(Math.asin( gamma / (mOuter * 2.0f)));
    float alphaInner = (float) Math.toDegrees(Math.asin( gamma / (mInner * 2.0f)));

    Path path = new Path();
    path.arcTo(outerBB, mStart + alphaOuter, mSweep - 2 * alphaOuter, true);
    path.arcTo(innerBB, mStart + mSweep - alphaInner, 2 * alphaInner - mSweep);
    path.close();

    return path;
}
 
Example 11
Source File: RoundAngleImageView.java    From wallpaper with GNU General Public License v2.0 5 votes vote down vote up
private void drawRightUp(Canvas canvas) {
	Path path = new Path();
	path.moveTo(getWidth(), roundHeight);
	path.lineTo(getWidth(), 0);
	path.lineTo(getWidth() - roundWidth, 0);
	path.arcTo(new RectF(getWidth() - roundWidth * 2, 0, getWidth(), 0 + roundHeight * 2), -90, 90);
	path.close();
	canvas.drawPath(path, paint);
}
 
Example 12
Source File: RoundAngleImageView.java    From wallpaper with GNU General Public License v2.0 5 votes vote down vote up
private void drawRightDown(Canvas canvas) {
	Path path = new Path();
	path.moveTo(getWidth() - roundWidth, getHeight());
	path.lineTo(getWidth(), getHeight());
	path.lineTo(getWidth(), getHeight() - roundHeight);
	path.arcTo(new RectF(getWidth() - roundWidth * 2, getHeight() - roundHeight * 2, getWidth(), getHeight()), 0, 90);
	path.close();
	canvas.drawPath(path, paint);
}
 
Example 13
Source File: RounderImageView.java    From SprintNBA with Apache License 2.0 5 votes vote down vote up
private void drawLeftUp(Canvas canvas) {
    Path path = new Path();
    path.moveTo(0, roundHeight);
    path.lineTo(0, 0);
    path.lineTo(roundWidth, 0);
    path.arcTo(new RectF(0, 0, roundWidth * 2, roundHeight * 2), -90, -90);
    path.close();
    canvas.drawPath(path, paint);
}
 
Example 14
Source File: RoundedUI.java    From RoundedUI with Apache License 2.0 5 votes vote down vote up
private void clipRightDown(Canvas canvas) {
    int height = getHeight();
    int width = getWidth();

    Path path = new Path();
    path.moveTo(width-roundWidth, height);
    path.lineTo(width, height);
    path.lineTo(width, height-roundHeight);
    RectF arc = new RectF(width - roundWidth * 2, height - roundHeight * 2, width, height);
    float startAngle=0;
    float sweepAngle=90;
    path.arcTo(arc, startAngle, sweepAngle);
    path.close();
    canvas.drawPath(path, paint);
}
 
Example 15
Source File: ARTShapeShadowNode.java    From react-native-GPay with MIT License 4 votes vote down vote up
/**
 * Creates a {@link Path} from an array of instructions constructed by JS
 * (see ARTSerializablePath.js). Each instruction starts with a type (see PATH_TYPE_*) followed
 * by arguments for that instruction. For example, to create a line the instruction will be
 * 2 (PATH_LINE_TO), x, y. This will draw a line from the last draw point (or 0,0) to x,y.
 *
 * @param data the array of instructions
 * @return the {@link Path} that can be drawn to a canvas
 */
private Path createPath(float[] data) {
  Path path = new Path();
  path.moveTo(0, 0);
  int i = 0;
  while (i < data.length) {
    int type = (int) data[i++];
    switch (type) {
      case PATH_TYPE_MOVETO:
        path.moveTo(data[i++] * mScale, data[i++] * mScale);
        break;
      case PATH_TYPE_CLOSE:
        path.close();
        break;
      case PATH_TYPE_LINETO:
        path.lineTo(data[i++] * mScale, data[i++] * mScale);
        break;
      case PATH_TYPE_CURVETO:
        path.cubicTo(
            data[i++] * mScale,
            data[i++] * mScale,
            data[i++] * mScale,
            data[i++] * mScale,
            data[i++] * mScale,
            data[i++] * mScale);
        break;
      case PATH_TYPE_ARC:
      {
        float x = data[i++] * mScale;
        float y = data[i++] * mScale;
        float r = data[i++] * mScale;
        float start = (float) Math.toDegrees(data[i++]);
        float end = (float) Math.toDegrees(data[i++]);

        boolean counterClockwise = !(data[i++] == 1f);
        float sweep = end - start;
        if (Math.abs(sweep) >= 360) {
          path.addCircle(x, y, r, counterClockwise ? Path.Direction.CCW : Path.Direction.CW);
        } else {
          sweep = modulus(sweep, 360);
          if (counterClockwise && sweep < 360) {
            // Counter-clockwise sweeps are negative
            sweep = -1 * (360 - sweep);
          }

          RectF oval = new RectF(x - r, y - r, x + r, y + r);
          path.arcTo(oval, start, sweep);
        }
        break;
      }
      default:
        throw new JSApplicationIllegalArgumentException(
            "Unrecognized drawing instruction " + type);
    }
  }
  return path;
}
 
Example 16
Source File: ShadowRenderer.java    From material-components-android with Apache License 2.0 4 votes vote down vote up
/**
 * Draws a corner shadow on the canvas in the current bounds with the matrix transform applied.
 */
public void drawCornerShadow(
    @NonNull Canvas canvas,
    @Nullable Matrix matrix,
    @NonNull RectF bounds,
    int elevation,
    float startAngle,
    float sweepAngle) {

  boolean drawShadowInsideBounds = sweepAngle < 0;

  Path arcBounds = scratch;

  if (drawShadowInsideBounds) {
    cornerColors[0] = 0;
    cornerColors[1] = shadowEndColor;
    cornerColors[2] = shadowMiddleColor;
    cornerColors[3] = shadowStartColor;
  } else {
    // Calculate the arc bounds to prevent drawing shadow in the same part of the arc.
    arcBounds.rewind();
    arcBounds.moveTo(bounds.centerX(), bounds.centerY());
    arcBounds.arcTo(bounds, startAngle, sweepAngle);
    arcBounds.close();

    bounds.inset(-elevation, -elevation);
    cornerColors[0] = 0;
    cornerColors[1] = shadowStartColor;
    cornerColors[2] = shadowMiddleColor;
    cornerColors[3] = shadowEndColor;
  }

  float startRatio = 1f - (elevation / (bounds.width() / 2f));
  float midRatio = startRatio + ((1f - startRatio) / 2f);
  cornerPositions[1] = startRatio;
  cornerPositions[2] = midRatio;

  cornerShadowPaint.setShader(
      new RadialGradient(
          bounds.centerX(),
          bounds.centerY(),
          bounds.width() / 2,
          cornerColors,
          cornerPositions,
          Shader.TileMode.CLAMP));

  // TODO(b/117606382): handle oval bounds by scaling the canvas.
  canvas.save();
  canvas.concat(matrix);

  if (!drawShadowInsideBounds) {
    canvas.clipPath(arcBounds, Op.DIFFERENCE);
    // This line is required for the next drawArc to work correctly, I think.
    canvas.drawPath(arcBounds, transparentPaint);
  }

  canvas.drawArc(bounds, startAngle, sweepAngle, true, cornerShadowPaint);
  canvas.restore();
}
 
Example 17
Source File: SvgParser.java    From Svg-for-Apache-Weex with Apache License 2.0 4 votes vote down vote up
public static void drawArc(Path p, float lastX, float lastY, float x, float y, float rx, float
    ry, float theta, int largeArc, int sweepArc) {
  Log.d("drawArc", "from (" + lastX + "," + lastY + ") to (" + x + "," + y + ") r=(" + rx + "," + ry +
      ") theta=" + theta + " flags=" + largeArc + "," + sweepArc);

  // http://www.w3.org/TR/SVG/implnote.html#ArcImplementationNotes

  if (rx == 0 || ry == 0) {
    p.lineTo(x, y);
    return;
  }

  if (x == lastX && y == lastY) {
    return; // nothing to draw
  }

  rx = Math.abs(rx);
  ry = Math.abs(ry);

  final float thrad = theta * (float) Math.PI / 180;
  final float st = (float) Math.sin(thrad);
  final float ct = (float) Math.cos(thrad);

  final float xc = (lastX - x) / 2;
  final float yc = (lastY - y) / 2;
  final float x1t = ct * xc + st * yc;
  final float y1t = -st * xc + ct * yc;

  final float x1ts = x1t * x1t;
  final float y1ts = y1t * y1t;
  float rxs = rx * rx;
  float rys = ry * ry;

  float lambda = (x1ts / rxs + y1ts / rys) * 1.001f; // add 0.1% to be sure that no out of range occurs due to
  // limited precision
  if (lambda > 1) {
    float lambdasr = (float) Math.sqrt(lambda);
    rx *= lambdasr;
    ry *= lambdasr;
    rxs = rx * rx;
    rys = ry * ry;
  }

  final float R =
      (float) Math.sqrt((rxs * rys - rxs * y1ts - rys * x1ts) / (rxs * y1ts + rys * x1ts))
          * ((largeArc == sweepArc) ? -1 : 1);
  final float cxt = R * rx * y1t / ry;
  final float cyt = -R * ry * x1t / rx;
  final float cx = ct * cxt - st * cyt + (lastX + x) / 2;
  final float cy = st * cxt + ct * cyt + (lastY + y) / 2;

  final float th1 = angle(1, 0, (x1t - cxt) / rx, (y1t - cyt) / ry);
  float dth = angle((x1t - cxt) / rx, (y1t - cyt) / ry, (-x1t - cxt) / rx, (-y1t - cyt) / ry);

  if (sweepArc == 0 && dth > 0) {
    dth -= 360;
  } else if (sweepArc != 0 && dth < 0) {
    dth += 360;
  }

  // draw
  if ((theta % 360) == 0) {
    // no rotate and translate need
    arcRectf.set(cx - rx, cy - ry, cx + rx, cy + ry);
    p.arcTo(arcRectf, th1, dth);
  } else {
    // this is the hard and slow part :-)
    arcRectf.set(-rx, -ry, rx, ry);

    arcMatrix.reset();
    arcMatrix.postRotate(theta);
    arcMatrix.postTranslate(cx, cy);
    arcMatrix.invert(arcMatrix2);

    p.transform(arcMatrix2);
    p.arcTo(arcRectf, th1, dth);
    p.transform(arcMatrix);
  }
}
 
Example 18
Source File: ImageBubbleLayout.java    From LazyRecyclerAdapter with MIT License 3 votes vote down vote up
private void initLeftRoundedPath(RectF rect, Path path, float strokeWidth) {

        path.moveTo(getArrowWidth() + rect.left + getCornersRadius() + strokeWidth, rect.top + strokeWidth);
        path.lineTo(rect.width() - getCornersRadius() - strokeWidth, rect.top + strokeWidth);
        path.arcTo(new RectF(rect.right - getCornersRadius(), rect.top + strokeWidth, rect.right - strokeWidth,
                getCornersRadius() + rect.top), 270, 90);

        path.lineTo(rect.right - strokeWidth, rect.bottom - getCornersRadius() - strokeWidth);
        path.arcTo(new RectF(rect.right - getCornersRadius(), rect.bottom - getCornersRadius(),
                rect.right - strokeWidth, rect.bottom - strokeWidth), 0, 90);


        path.lineTo(rect.left + getArrowWidth() + getCornersRadius() + strokeWidth, rect.bottom - strokeWidth);


        path.arcTo(new RectF(rect.left + getArrowWidth() + strokeWidth, rect.bottom - getCornersRadius(),
                getCornersRadius() + rect.left + getArrowWidth(), rect.bottom - strokeWidth), 90, 90);

        path.lineTo(rect.left + getArrowWidth() + strokeWidth, getArrowHeight() + getArrowPosition() - (strokeWidth / 2));

        path.lineTo(rect.left + strokeWidth + strokeWidth, getArrowPosition() + getArrowHeight() / 2);


        path.lineTo(rect.left + getArrowWidth() + strokeWidth, getArrowPosition() + (strokeWidth / 2));

        path.lineTo(rect.left + getArrowWidth() + strokeWidth, rect.top + getCornersRadius() + strokeWidth);

        path.arcTo(new RectF(rect.left + getArrowWidth() + strokeWidth, rect.top + strokeWidth, getCornersRadius()
                + rect.left + getArrowWidth(), getCornersRadius() + rect.top), 180, 90);

        path.close();
    }
 
Example 19
Source File: PathUtilties.java    From mil-sym-android with Apache License 2.0 2 votes vote down vote up
/**
 * 
 * @param path
 * @param x
 * @param y
 * @param r radius
 * @param sAngle start angle in degrees
 * @param eAngle how many degrees relative to sAngle
 */
public static void arc(Path path, float x, float y, float r, float sAngle, float eAngle)
{
	RectF oval = new RectF(x-r, y-r, x+r, y+r);
	path.arcTo(oval, sAngle, eAngle, true);
}
 
Example 20
Source File: PathUtilties.java    From mil-sym-android with Apache License 2.0 2 votes vote down vote up
/**
 * 
 * @param path
 * @param x
 * @param y
 * @param r radius
 * @param sAngle start angle in degrees
 * @param eAngle how many degrees relative to sAngle
 * @param moveTo If true, begin a new contour
 */
public static void arc(Path path, float x, float y, float r, float sAngle, float eAngle, boolean moveTo)
{
	RectF oval = new RectF(x-r, y-r, x+r, y+r);
	path.arcTo(oval, sAngle, eAngle, moveTo);
}