NiceImageView icon indicating copy to clipboard operation
NiceImageView copied to clipboard

圆形的图带边框两边会有两条线

Open Rongrkang opened this issue 6 years ago • 2 comments

NiceImageView 设置成圆形图片 如果把scaleType设置成centerCrop 设置的图片的宽高比不等于控件的宽高比并且设置有边框,会漏出来两条线

Rongrkang avatar Oct 24 '19 09:10 Rongrkang

我也遇到了

fupangzi avatar Jul 10 '20 08:07 fupangzi

改了下

@Override
protected void onDraw(Canvas canvas) {
    // 使用图形混合模式来显示指定区域的图片
    int save = canvas.saveLayer(srcRectF, null, Canvas.ALL_SAVE_FLAG);
    if (!isCoverSrc) {
        float sx = 1.0f * (width - 2 * borderWidth - 2 * innerBorderWidth) / width;
        float sy = 1.0f * (height - 2 * borderWidth - 2 * innerBorderWidth) / height;
        // 缩小画布,使图片内容不被borders覆盖
        canvas.scale(sx, sy, width / 2.0f, height / 2.0f);
    }
    int cropSave = canvas.saveLayer(srcRectF, null, Canvas.ALL_SAVE_FLAG);
    super.onDraw(canvas);
    paint.reset();
    path.reset();
    if (isCircle) {
        path.addCircle(width / 2.0f, height / 2.0f, radius, Path.Direction.CCW);
    } else {
        path.addRoundRect(srcRectF, srcRadii, Path.Direction.CCW);
    }

    paint.setAntiAlias(true);
    paint.setStyle(Paint.Style.FILL);
    paint.setXfermode(xfermode);
    if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.O_MR1) {
        canvas.drawPath(path, paint);
    } else {

// srcPath.addRect(srcRectF, Path.Direction.CCW); // // 计算tempPath和path的差集 // srcPath.op(path, Path.Op.DIFFERENCE); // canvas.drawPath(srcPath, paint);

        srcPath.reset();
        srcPath.addRect(srcRectF, Path.Direction.CCW);
        // 计算tempPath和path的差集
        srcPath.op(path, Path.Op.DIFFERENCE);

        canvas.drawPath(srcPath, paint);
    }
    paint.setXfermode(null);

    // 绘制遮罩
    if (maskColor != 0) {
        paint.setColor(maskColor);
        canvas.drawPath(path, paint);
    }
    // 恢复画布
    canvas.restoreToCount(cropSave);
    canvas.restoreToCount(save);
    // 绘制边框
    drawBorders(canvas);
}

Rongrkang avatar Jul 29 '20 08:07 Rongrkang