RoundedImageView icon indicating copy to clipboard operation
RoundedImageView copied to clipboard

change image alpha will display abnormally in select corners mode

Open rantianhua opened this issue 7 years ago • 0 comments

In select corners mode, if I set image alpha (such as 128), the ImageView will display abnormally at unselected corner. Just like following capture: d75c3f5a6d697509655c4c5bdce51436

I have read the code and I found the cause.

RoundedDrawable#draw:

 if (mBorderWidth > 0) {
      canvas.drawRoundRect(mDrawableRect, radius, radius, mBitmapPaint);
      canvas.drawRoundRect(mBorderRect, radius, radius, mBorderPaint);
      redrawBitmapForSquareCorners(canvas);
      redrawBorderForSquareCorners(canvas);
} else {
      canvas.drawRoundRect(mDrawableRect, radius, radius, mBitmapPaint);
      redrawBitmapForSquareCorners(canvas);
}

RoundedDrawable#redrawBitmapForSquareCorners:

    if (!mCornersRounded[Corner.TOP_LEFT]) {
      mSquareCornersRect.set(left, top, left + radius, top + radius);
      canvas.drawRect(mSquareCornersRect, mBitmapPaint);
    }

    if (!mCornersRounded[Corner.TOP_RIGHT]) {
      mSquareCornersRect.set(right - radius, top, right, radius);
      canvas.drawRect(mSquareCornersRect, mBitmapPaint);
    }

    if (!mCornersRounded[Corner.BOTTOM_RIGHT]) {
      mSquareCornersRect.set(right - radius, bottom - radius, right, bottom);
      canvas.drawRect(mSquareCornersRect, mBitmapPaint);
    }

    if (!mCornersRounded[Corner.BOTTOM_LEFT]) {
      mSquareCornersRect.set(left, bottom - radius, left + radius, bottom);
      canvas.drawRect(mSquareCornersRect, mBitmapPaint);
    }

In redrawBitmapForSquareCorners method, find corners don't have radius and then draw an new rect with the same paint. It's inevitable that some space are coincident, so they are redrawn. Without xfermode, those space alpha are double than others.

I will send a pull request to solve this problem.

rantianhua avatar Jul 10 '18 11:07 rantianhua