android.graphics.Path#addRect ( )源码实例Demo

下面列出了android.graphics.Path#addRect ( ) 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。

源代码1 项目: SimpleCropView   文件: CropImageView.java
private void drawOverlay(Canvas canvas) {
  mPaintTranslucent.setAntiAlias(true);
  mPaintTranslucent.setFilterBitmap(true);
  mPaintTranslucent.setColor(mOverlayColor);
  mPaintTranslucent.setStyle(Paint.Style.FILL);
  Path path = new Path();
  RectF overlayRect =
      new RectF((float) Math.floor(mImageRect.left), (float) Math.floor(mImageRect.top),
          (float) Math.ceil(mImageRect.right), (float) Math.ceil(mImageRect.bottom));
  if (!mIsAnimating && (mCropMode == CropMode.CIRCLE || mCropMode == CropMode.CIRCLE_SQUARE)) {
    path.addRect(overlayRect, Path.Direction.CW);
    PointF circleCenter = new PointF((mFrameRect.left + mFrameRect.right) / 2,
        (mFrameRect.top + mFrameRect.bottom) / 2);
    float circleRadius = (mFrameRect.right - mFrameRect.left) / 2;
    path.addCircle(circleCenter.x, circleCenter.y, circleRadius, Path.Direction.CCW);
    canvas.drawPath(path, mPaintTranslucent);
  } else {
    path.addRect(overlayRect, Path.Direction.CW);
    path.addRect(mFrameRect, Path.Direction.CCW);
    canvas.drawPath(path, mPaintTranslucent);
  }
}
 
源代码2 项目: android_9.0.0_r45   文件: SmartSelectSprite.java
private static Path generateOutlinePolygonPath(
        final List<RoundedRectangleShape> rectangles) {
    final Path path = new Path();
    for (final RoundedRectangleShape shape : rectangles) {
        final Path rectanglePath = new Path();
        rectanglePath.addRect(shape.mBoundingRectangle, Path.Direction.CW);
        path.op(rectanglePath, Path.Op.UNION);
    }
    return path;
}
 
源代码3 项目: CombineBitmap   文件: DingRegionManager.java
@Override
public Region[] calculateRegion(int size, int subSize, int gap, int count) {
    Region[] regions = new Region[count];
    Region globalRegion = new Region(0, 0, size, size);

    int[][] dxy = {{0, 0}, {1, 0}, {1, 1}, {0, 1}};

    for (int i = 0; i < count; i++) {
        float width = size;
        float height = size;

        if (count == 2 || (count == 3 && i == 0)) {
            width = (size - gap) / 2;
            height = size;
        } else if ((count == 3 && (i == 1 || i == 2)) || count == 4) {
            width = (size - gap) / 2;
            height = (size - gap) / 2;
        }

        int dx = dxy[i][0];
        int dy = dxy[i][1];

        float left = dx * (size + gap) / 2.0f;
        float top = dy * (size + gap) / 2.0f;
        float right = left + width;
        float bottom = top + height;
        Path path = new Path();
        path.addRect(left, top, right, bottom, Path.Direction.CW);

        Region region = new Region();
        region.setPath(path, globalRegion);

        regions[i] = region;
    }
    return regions;
}
 
源代码4 项目: cidrawing   文件: DrawElement.java
/**
 * Return the actual bounding box of the graphics without transformation
 *
 * @return
 */
public RectF getOuterBoundingBox() {
    if (boundingBox != null) {
        Path path = new Path();
        path.addRect(boundingBox, Path.Direction.CW);
        path.transform(getDisplayMatrix());
        RectF box = new RectF();
        path.computeBounds(box, true);
        return box;
    }
    return new RectF();
}
 
源代码5 项目: MyBlogDemo   文件: HighlightView.java
protected void draw(Canvas canvas) {
    canvas.save();
    Path path = new Path();
    outlinePaint.setStrokeWidth(outlineWidth);
    if (!hasFocus()) {
        outlinePaint.setColor(Color.BLACK);
        canvas.drawRect(drawRect, outlinePaint);
    } else {
        Rect viewDrawingRect = new Rect();
        viewContext.getDrawingRect(viewDrawingRect);

        path.addRect(new RectF(drawRect), Path.Direction.CW);
        outlinePaint.setColor(highlightColor);

        if (isClipPathSupported(canvas)) {
            canvas.clipPath(path, Region.Op.DIFFERENCE);
            canvas.drawRect(viewDrawingRect, outsidePaint);
        } else {
            drawOutsideFallback(canvas);
        }

        canvas.restore();
        canvas.drawPath(path, outlinePaint);

        if (showThirds) {
            drawThirds(canvas);
        }

        if (handleMode == HandleMode.Always ||
                (handleMode == HandleMode.Changing && modifyMode == ModifyMode.Grow)) {
            drawHandles(canvas);
        }
    }
}
 
源代码6 项目: cidrawing   文件: DrawElement.java
public Path getTouchableArea() {
    Path path = new Path();
    if (getBoundingBox() != null) {
        path.addRect(getBoundingBox(), Path.Direction.CW);
    }
    return path;
}
 
源代码7 项目: CoolIndicator   文件: ShiftDrawable.java
private void updateBounds() {
    final Rect b = getBounds();
    final int width = (int) ((float) b.width() * getLevel() / MAX_LEVEL);
    final float radius = b.height() / 2f;
    mVisibleRect.set(b.left, b.top, b.left + width, b.height());

    // draw round to head of progressbar. I know it looks stupid, don't blame me now.
    mPath = new Path();
    mPath.addRect(b.left, b.top, b.left + width - radius, b.height(), Path.Direction.CCW);
    mPath.addCircle(b.left + width - radius, radius, radius, Path.Direction.CCW);
}
 
源代码8 项目: LockDemo   文件: HighlightView.java
protected void draw(Canvas canvas) {
    canvas.save();
    Path path = new Path();
    outlinePaint.setStrokeWidth(outlineWidth);
    if (!hasFocus()) {
        outlinePaint.setColor(Color.BLACK);
        canvas.drawRect(drawRect, outlinePaint);
    } else {
        Rect viewDrawingRect = new Rect();
        viewContext.getDrawingRect(viewDrawingRect);

        path.addRect(new RectF(drawRect), Path.Direction.CW);
        outlinePaint.setColor(highlightColor);

        if (isClipPathSupported(canvas)) {
            canvas.clipPath(path, Region.Op.DIFFERENCE);
            canvas.drawRect(viewDrawingRect, outsidePaint);
        } else {
            drawOutsideFallback(canvas);
        }

        canvas.restore();
        canvas.drawPath(path, outlinePaint);

        if (showThirds) {
            drawThirds(canvas);
        }

        if (showCircle) {
            drawCircle(canvas);
        }

        if (handleMode == HandleMode.Always ||
                (handleMode == HandleMode.Changing && modifyMode == ModifyMode.Grow)) {
            drawHandles(canvas);
        }
    }
}
 
源代码9 项目: HaiNaBaiChuan   文件: HighlightView.java
protected void draw(Canvas canvas) {
    canvas.save();
    Path path = new Path();
    outlinePaint.setStrokeWidth(outlineWidth);
    if (!hasFocus()) {
        outlinePaint.setColor(Color.BLACK);
        canvas.drawRect(drawRect, outlinePaint);
    } else {
        Rect viewDrawingRect = new Rect();
        viewContext.getDrawingRect(viewDrawingRect);

        path.addRect(new RectF(drawRect), Path.Direction.CW);
        outlinePaint.setColor(highlightColor);

        if (isClipPathSupported(canvas)) {
            canvas.clipPath(path, Region.Op.DIFFERENCE);
            canvas.drawRect(viewDrawingRect, outsidePaint);
        } else {
            drawOutsideFallback(canvas);
        }

        canvas.restore();
        canvas.drawPath(path, outlinePaint);

        if (showThirds) {
            drawThirds(canvas);
        }

        if (showCircle) {
            drawCircle(canvas);
        }

        if (handleMode == HandleMode.Always ||
                (handleMode == HandleMode.Changing && modifyMode == ModifyMode.Grow)) {
            drawHandles(canvas);
        }
    }
}
 
源代码10 项目: XERUNG   文件: HighlightView.java
protected void draw(Canvas canvas) {
    canvas.save();
    Path path = new Path();
    outlinePaint.setStrokeWidth(outlineWidth);
    if (!hasFocus()) {
        outlinePaint.setColor(Color.BLACK);
        canvas.drawRect(drawRect, outlinePaint);
    } else {
        Rect viewDrawingRect = new Rect();
        viewContext.getDrawingRect(viewDrawingRect);

        path.addRect(new RectF(drawRect), Path.Direction.CW);
        outlinePaint.setColor(highlightColor);

        if (isClipPathSupported(canvas)) {
            canvas.clipPath(path, Region.Op.DIFFERENCE);
            canvas.drawRect(viewDrawingRect, outsidePaint);
        } else {
            drawOutsideFallback(canvas);
        }

        canvas.restore();
        canvas.drawPath(path, outlinePaint);

        if (showThirds) {
            drawThirds(canvas);
        }

        if (showCircle) {
            drawCircle(canvas);
        }

        if (handleMode == HandleMode.Always ||
                (handleMode == HandleMode.Changing && modifyMode == ModifyMode.Grow)) {
            drawHandles(canvas);
        }
    }
}
 
源代码11 项目: UltimateAndroid   文件: HighlightView.java
protected void draw(Canvas canvas) {
    canvas.save();
    Path path = new Path();
    outlinePaint.setStrokeWidth(outlineWidth);
    if (!hasFocus()) {
        outlinePaint.setColor(Color.BLACK);
        canvas.drawRect(drawRect, outlinePaint);
    } else {
        Rect viewDrawingRect = new Rect();
        viewContext.getDrawingRect(viewDrawingRect);

        path.addRect(new RectF(drawRect), Path.Direction.CW);
        outlinePaint.setColor(highlightColor);

        if (isClipPathSupported(canvas)) {
            canvas.clipPath(path, Region.Op.DIFFERENCE);
            canvas.drawRect(viewDrawingRect, outsidePaint);
        } else {
            drawOutsideFallback(canvas);
        }

        canvas.restore();
        canvas.drawPath(path, outlinePaint);

        if (showThirds) {
            drawThirds(canvas);
        }

        if (handleMode == HandleMode.Always ||
                (handleMode == HandleMode.Changing && modifyMode == ModifyMode.Grow)) {
            drawHandles(canvas);
        }
    }
}
 
源代码12 项目: Memento   文件: CanvasView.java
/**
 * This method initializes canvas.
 *
 * @return
 */
public void clear() {
    Path path = new Path();
    path.moveTo(0F, 0F);
    path.addRect(0F, 0F, 1000F, 1000F, Path.Direction.CCW);
    path.close();

    Paint paint = new Paint();
    paint.setColor(Color.WHITE);
    paint.setStyle(Paint.Style.FILL);

    if (this.historyPointer == this.pathLists.size()) {
        this.pathLists.add(path);
        this.paintLists.add(paint);
        this.historyPointer++;
    } else {
        // On the way of Undo or Redo
        this.pathLists.set(this.historyPointer, path);
        this.paintLists.set(this.historyPointer, paint);
        this.historyPointer++;

        for (int i = this.historyPointer, size = this.paintLists.size(); i < size; i++) {
            this.pathLists.remove(this.historyPointer);
            this.paintLists.remove(this.historyPointer);
        }
    }

    this.text = "";

    // Clear
    this.invalidate();
}
 
源代码13 项目: weex-uikit   文件: BorderDrawable.java
private void prepareBorderPath(int topPadding,
                               int rightPadding,
                               int bottomPadding,
                               int leftPadding,
                               @NonNull RectF rectF,
                               @NonNull Path path) {
  if (mBorderRadius != null) {
    prepareBorderRadius(rectF);
    float topLeftRadius = getBorderRadius(mOverlappingBorderRadius, BORDER_TOP_LEFT_RADIUS);
    float topRightRadius = getBorderRadius(mOverlappingBorderRadius, BORDER_TOP_RIGHT_RADIUS);
    float bottomRightRadius = getBorderRadius(mOverlappingBorderRadius,
                                              BORDER_BOTTOM_RIGHT_RADIUS);
    float bottomLeftRadius = getBorderRadius(mOverlappingBorderRadius,
                                             BORDER_BOTTOM_LEFT_RADIUS);
    path.addRoundRect(
        rectF,
        new float[]{
            topLeftRadius - leftPadding,
            topLeftRadius - topPadding,
            topRightRadius - rightPadding,
            topRightRadius - topPadding,
            bottomRightRadius - rightPadding,
            bottomRightRadius - bottomPadding,
            bottomLeftRadius - leftPadding,
            bottomLeftRadius - bottomPadding
        },
        Path.Direction.CW);
  } else {
    path.addRect(rectF, Path.Direction.CW);
  }
}
 
源代码14 项目: cidrawing   文件: TextElement.java
@Override
protected void calculateBoundingBox() {
    Rect box = new Rect();
    paint.getTextBounds(text, 0, text.length(), box);
    originalBoundingBox = new RectF(box);
    boundingPath = new Path();
    boundingPath.addRect(originalBoundingBox, Path.Direction.CW);
    boundingPath.transform(dataMatrix);
    updateBoundingBox();
}
 
源代码15 项目: Slide   文件: CanvasView.java
/**
 * This method initializes canvas.
 *
 * @return
 */
public void clear() {
    Path path = new Path();
    path.moveTo(0F, 0F);
    path.addRect(0F, 0F, 1000F, 1000F, Path.Direction.CCW);
    path.close();

    Paint paint = new Paint();
    paint.setColor(Color.parseColor("#303030"));
    paint.setStyle(Paint.Style.FILL);

    if (this.historyPointer == this.pathLists.size()) {
        this.pathLists.add(path);
        this.paintLists.add(paint);
        this.historyPointer++;
    } else {
        // On the way of Undo or Redo
        this.pathLists.set(this.historyPointer, path);
        this.paintLists.set(this.historyPointer, paint);
        this.historyPointer++;

        for (int i = this.historyPointer, size = this.paintLists.size(); i < size; i++) {
            this.pathLists.remove(this.historyPointer);
            this.paintLists.remove(this.historyPointer);
        }
    }

    this.text = "";

    // Clear
    this.invalidate();
}
 
源代码16 项目: cidrawing   文件: RectElement.java
@Override
protected Path createShapePath() {
    Path path = new Path();
    path.addRect(shapeBox, Path.Direction.CW);
    return path;
}
 
源代码17 项目: VideoOS-Android-SDK   文件: BaseImageView.java
/**
     * get clip path of StyleDrawable
     *
     * @return
     */
    Path getClipPath() {
//        if (mPath == null) {
//            mPath = new Path();
//        }
        mPath = new Path();
        Rect rect = mStyleDrawable.getBounds();
        float radius = mStyleDrawable.getCornerRadius();
        float[] radii = mStyleDrawable.getCornerRadii();
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            if (radii == null || radii.length == 0) {
                mPath.addRoundRect(rect.left, rect.top, rect.right, rect.bottom, radius, radius,
                        Path.Direction.CW);
            } else {
                mPath.addRoundRect(rect.left, rect.top, rect.right, rect.bottom, radii,
                        Path.Direction.CW);
            }
        } else {
            if (radii == null || radii.length == 0) {
                mPath.addCircle(rect.left + radius, rect.top + radius, radius, Path.Direction.CW);
                mPath.addCircle(rect.right - radius, rect.top + radius, radius, Path.Direction.CW);
                mPath.addCircle(rect.right - radius, rect.bottom - radius, radius, Path.Direction.CW);
                mPath.addCircle(rect.left + radius, rect.bottom - radius, radius, Path.Direction.CW);
                mPath.addRect(rect.left + radius, rect.top, rect.right - radius, rect.bottom, Path.Direction.CW);
                mPath.addRect(rect.left, rect.top + radius, rect.right, rect.bottom - radius, Path.Direction.CW);
            } else {
                float topLeftX = radii[0], topLeftY = radii[1];
                float topRightX = radii[2], topRightY = radii[3];
                float bottomLeftX = radii[4], bottomLeftY = radii[5];
                float bottomRightX = radii[6], bottomRightY = radii[7];
                mPath.addCircle(rect.left + topLeftX, rect.top + topLeftY, topLeftY, Path.Direction.CW);
                mPath.addCircle(rect.right - topRightX, rect.top + topRightY, topRightY, Path.Direction.CW);
                mPath.addCircle(rect.right - bottomLeftX, rect.bottom - bottomLeftY, bottomLeftY, Path.Direction.CW);
                mPath.addCircle(rect.left + bottomRightX, rect.bottom - bottomRightY, bottomRightY, Path.Direction.CW);
                mPath.addRect(rect.left + topLeftX, rect.top, rect.right - topRightX, rect.bottom, Path.Direction.CW);
                mPath.addRect(rect.left, rect.top + topLeftY, rect.right, rect.bottom - bottomLeftY, Path.Direction.CW);
            }

        }
        return mPath;
    }
 
public static void drawLaneStraight(Canvas canvas, RectF targetFrame, ResizingBehavior resizing, int primaryColor, PointF size) {
  // General Declarations
  Stack<Matrix> currentTransformation = new Stack<Matrix>();
  currentTransformation.push(new Matrix());
  Paint paint = CacheForLaneStraight.paint;

  // Local Variables
  float expression = Math.min(size.x / 30f, size.y / 30f);

  // Resize to Target Frame
  canvas.save();
  RectF resizedFrame = CacheForLaneStraight.resizedFrame;
  LanesStyleKit.resizingBehaviorApply(resizing, CacheForLaneStraight.originalFrame, targetFrame, resizedFrame);
  canvas.translate(resizedFrame.left, resizedFrame.top);
  canvas.scale(resizedFrame.width() / 30f, resizedFrame.height() / 30f);

  // Frame
  RectF frame = CacheForLaneStraight.frame;
  frame.set(0f, 0f, size.x, size.y);

  // Group
  {
    RectF group = CacheForLaneStraight.group;
    group.set(0f, 0f, 12.02f, 24f);
    canvas.save();
    canvas.translate(9f, 3f);
    currentTransformation.peek().postTranslate(9f, 3f);
    canvas.scale(expression, expression);
    currentTransformation.peek().postScale(expression, expression);

    // Rectangle
    RectF rectangleRect = CacheForLaneStraight.rectangleRect;
    rectangleRect.set(4f, 8f, 8f, 24f);
    Path rectanglePath = CacheForLaneStraight.rectanglePath;
    rectanglePath.reset();
    rectanglePath.addRect(rectangleRect, Path.Direction.CW);

    paint.reset();
    paint.setFlags(Paint.ANTI_ALIAS_FLAG);
    paint.setStyle(Paint.Style.FILL);
    paint.setColor(primaryColor);
    canvas.drawPath(rectanglePath, paint);

    // Bezier
    RectF bezierRect = CacheForLaneStraight.bezierRect;
    bezierRect.set(0f, 0f, 12.02f, 9.99f);
    Path bezierPath = CacheForLaneStraight.bezierPath;
    bezierPath.reset();
    bezierPath.moveTo(group.left + group.width() * 0.33372f, group.top + group.height() * 0.4135f);
    bezierPath.lineTo(group.left + group.width() * 0.33414f, group.top + group.height() * 0.36075f);
    bezierPath.lineTo(group.left + group.width() * 0.33397f, group.top + group.height() * 0.36096f);
    bezierPath.cubicTo(group.left + group.width() * 0.33397f, group.top + group.height() * 0.35842f, group.left + group.width() * 0.33364f, group.top + group.height() * 0.35542f, group.left + group.width() * 0.33364f, group.top + group.height() * 0.35262f);
    bezierPath.cubicTo(group.left + group.width() * 0.33364f, group.top + group.height() * 0.3405f, group.left + group.width() * 0.31766f, group.top + group.height() * 0.33075f, group.left + group.width() * 0.29345f, group.top + group.height() * 0.33075f);
    bezierPath.cubicTo(group.left + group.width() * 0.29096f, group.top + group.height() * 0.33075f, group.left + group.width() * 0.28796f, group.top + group.height() * 0.33079f, group.left + group.width() * 0.28563f, group.top + group.height() * 0.331f);
    bezierPath.lineTo(group.left + group.width() * 0.28588f, group.top + group.height() * 0.33087f);
    bezierPath.lineTo(group.left + group.width() * 0.05882f, group.top + group.height() * 0.37217f);
    bezierPath.lineTo(group.left + group.width() * 0.05916f, group.top + group.height() * 0.37212f);
    bezierPath.cubicTo(group.left + group.width() * 0.05416f, group.top + group.height() * 0.37312f, group.left + group.width() * 0.04867f, group.top + group.height() * 0.37371f, group.left + group.width() * 0.04293f, group.top + group.height() * 0.37371f);
    bezierPath.cubicTo(group.left + group.width() * 0.01922f, group.top + group.height() * 0.37371f, group.left, group.top + group.height() * 0.36408f, group.left, group.top + group.height() * 0.35221f);
    bezierPath.cubicTo(group.left, group.top + group.height() * 0.346f, group.left + group.width() * 0.00516f, group.top + group.height() * 0.34033f, group.left + group.width() * 0.01356f, group.top + group.height() * 0.33642f);
    bezierPath.lineTo(group.left + group.width() * 0.01331f, group.top + group.height() * 0.3365f);
    bezierPath.lineTo(group.left + group.width() * 0.50046f, group.top);
    bezierPath.lineTo(group.left + group.width() * 0.98669f, group.top + group.height() * 0.33908f);
    bezierPath.lineTo(group.left + group.width() * 0.98644f, group.top + group.height() * 0.339f);
    bezierPath.cubicTo(group.left + group.width() * 0.99484f, group.top + group.height() * 0.34292f, group.left + group.width(), group.top + group.height() * 0.34862f, group.left + group.width(), group.top + group.height() * 0.35483f);
    bezierPath.cubicTo(group.left + group.width(), group.top + group.height() * 0.36671f, group.left + group.width() * 0.98078f, group.top + group.height() * 0.37629f, group.left + group.width() * 0.95707f, group.top + group.height() * 0.37629f);
    bezierPath.cubicTo(group.left + group.width() * 0.95133f, group.top + group.height() * 0.37629f, group.left + group.width() * 0.94584f, group.top + group.height() * 0.37575f, group.left + group.width() * 0.94084f, group.top + group.height() * 0.37471f);
    bezierPath.lineTo(group.left + group.width() * 0.94118f, group.top + group.height() * 0.37475f);
    bezierPath.lineTo(group.left + group.width() * 0.71412f, group.top + group.height() * 0.33346f);
    bezierPath.lineTo(group.left + group.width() * 0.71437f, group.top + group.height() * 0.33358f);
    bezierPath.cubicTo(group.left + group.width() * 0.71204f, group.top + group.height() * 0.33342f, group.left + group.width() * 0.70904f, group.top + group.height() * 0.33333f, group.left + group.width() * 0.70655f, group.top + group.height() * 0.33333f);
    bezierPath.cubicTo(group.left + group.width() * 0.68234f, group.top + group.height() * 0.33333f, group.left + group.width() * 0.66636f, group.top + group.height() * 0.34308f, group.left + group.width() * 0.66636f, group.top + group.height() * 0.35521f);
    bezierPath.cubicTo(group.left + group.width() * 0.66636f, group.top + group.height() * 0.358f, group.left + group.width() * 0.66603f, group.top + group.height() * 0.361f, group.left + group.width() * 0.66603f, group.top + group.height() * 0.36354f);
    bezierPath.lineTo(group.left + group.width() * 0.66586f, group.top + group.height() * 0.36338f);
    bezierPath.lineTo(group.left + group.width() * 0.66628f, group.top + group.height() * 0.41608f);

    paint.reset();
    paint.setFlags(Paint.ANTI_ALIAS_FLAG);
    bezierPath.setFillType(Path.FillType.EVEN_ODD);
    paint.setStyle(Paint.Style.FILL);
    paint.setColor(primaryColor);
    canvas.drawPath(bezierPath, paint);

    canvas.restore();
  }

  canvas.restore();
}
 
源代码19 项目: Tehreer-Android   文件: ComposedFrame.java
/**
 * Generates a path that contains a set of rectangles covering the specified selection range.
 *
 * @param charStart The index to the first character of selection in source text.
 * @param charEnd The index after the first character of selection in source text.
 * @return A path that contains a set of rectangles covering the specified selection range.
 *
 * @throws IllegalArgumentException if <code>charStart</code> is less than frame start, or
 *         <code>charEnd</code> is greater than frame end, or <code>charStart</code> is greater
 *         than <code>charEnd</code>.
 */
public @NonNull Path generateSelectionPath(int charStart, int charEnd) {
    checkSubRange(charStart, charEnd);

    Path selectionPath = new Path();

    int firstIndex = getLineIndexForChar(charStart);
    int lastIndex = getLineIndexForChar(charEnd);

    ComposedLine firstLine = lineList.get(firstIndex);
    ComposedLine lastLine = lineList.get(lastIndex);

    float firstTop = firstLine.getTop();
    float lastBottom = lastLine.getBottom();

    if (firstLine == lastLine) {
        addSelectionParts(firstLine, charStart, charEnd, firstTop, lastBottom, selectionPath);
    } else {
        float frameLeft = 0.0f;
        float frameRight = mWidth;

        float firstBottom = firstLine.getBottom();
        float lastTop = lastLine.getTop();

        // Select each intersecting part of first line.
        addSelectionParts(firstLine, charStart, firstLine.getCharEnd(),
                          firstTop, firstBottom, selectionPath);

        // Select trailing padding of first line.
        if ((lastLine.getParagraphLevel() & 1) == 1) {
            selectionPath.addRect(frameLeft, firstTop,
                                  firstLine.getLeft(), firstBottom, Path.Direction.CW);
        } else {
            selectionPath.addRect(firstLine.getRight(), firstTop,
                                  frameRight, firstBottom, Path.Direction.CW);
        }

        // Select whole part of each mid line.
        for (int i = firstIndex + 1; i < lastIndex; i++) {
            ComposedLine midLine = lineList.get(i);
            float midTop = midLine.getTop();
            float midBottom = midLine.getBottom();

            selectionPath.addRect(frameLeft, midTop,
                                  frameRight, midBottom, Path.Direction.CW);
        }

        // Select leading padding of last line.
        if ((lastLine.getParagraphLevel() & 1) == 1) {
            selectionPath.addRect(lastLine.getRight(), lastTop,
                                  frameRight, lastBottom, Path.Direction.CW);
        } else {
            selectionPath.addRect(frameLeft, lastTop,
                                  lastLine.getLeft(), lastBottom, Path.Direction.CW);
        }

        // Select each intersecting part of last line.
        addSelectionParts(lastLine, lastLine.getCharStart(), charEnd,
                          lastTop, lastBottom, selectionPath);
    }

    return selectionPath;
}
 
源代码20 项目: zone-sdk   文件: PathMeasureView.java
private void testGetSegment(Canvas canvas, boolean startWithMoveTo) {

        Path path = new Path();                                     // 创建Path并添加了一个矩形
        path.addRect(-200, -200, 200, 200, Path.Direction.CW);

        Path dst = new Path();                                      // 创建用于存储截取后内容的 Path
        dst.lineTo(-300, -300);                                     // <--- 在 dst 中添加一条线段

        PathMeasure measure = new PathMeasure(path, false);         // 将 Path 与 PathMeasure 关联

        measure.getSegment(200, 600, dst, startWithMoveTo);                   // 截取一部分 并使用 moveTo 保持截取得到的 Path 第一个点的位置不变

        canvas.drawPath(dst, mDeafultPaint);
    }