7

我需要裁剪边角ImageView。不要将它们四舍五入,而是从每个角落擦除三角形。

似乎唯一的方法是覆盖onDraw方法并使用Path. 问题是我没有纯色背景,所以我需要擦除这些区域,但不要用一些颜色填充它们。

我为此使用以下代码:

@Override
protected void onDraw(Canvas canvas) {
    Path path = new Path();
    path.moveTo(0, 0);
    path.lineTo(20, 0);
    path.lineTo(0, 20);
    path.close();

    Paint paint = new Paint();
    paint.setAntiAlias(true);
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    canvas.drawPath(path, paint);
    super.onDraw(canvas);
}

但是角落变黑但不透明。你可以帮帮我吗?或者你可能知道我的任务更好的解决方案。这是它的样子。

在此处输入图像描述

4

3 回答 3

5

为了使用透明颜色进行绘制,您必须使用Paint setXfermode它仅在您为画布设置位图时才有效。如果您按照以下步骤操作,您应该会得到想要的结果。

  1. 创建一个画布并设置它的位图。

    mCanvas = new Canvas();
    mBitmap= Bitmap.createBitmap(scrw, scrh, Config.ARGB_8888);
    mCanvas.setBitmap(mBitmap);
    
  2. 当你想擦除某些东西时,你只需要使用 setXfermode。

    if (isErasing)
       mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
    else
       mPaint.setXfermode(null);
    
  3. 现在你应该可以使用透明颜色绘制:

    mCanvas.drawPath(yourpath, mPaint);

于 2014-03-06T22:09:59.027 回答
2

您可以剪辑画布对象:

@Override
protected void onDraw(Canvas canvas) {
    final Path path = new Path();
    final int count = canvas.save();

    path.moveTo(0, 20);
    path.lineTo(20, 0);
    path.lineTo(getWidth(), 0);
    path.lineTo(getWidth(), getHeight());
    path.lineTo(0, getHeight());
    path.close();

    canvas.clipPath(path);
    super.onDraw(canvas);
    canvas.restoreToCount(count);
}

请注意Canvas.clipPath在启用硬件加速的 Android 3.0 或更高版本上不起作用。

于 2013-01-15T08:58:24.647 回答
-1

使用这条线

 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));

而不是这个

 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
于 2013-01-15T08:16:26.177 回答