我使这个自定义可绘制,应该剪辑任何可绘制在圈内。但是在我的实现中,可绘制的传递是原始形式的输出,而不是循环形式。
public class CircularDrawable extends Drawable {
Paint mPaint,xfermodePaint;
Drawable mDrawable;
int[] vinylCenter = new int[2];
int radius;
Bitmap src;
PorterDuffXfermode xfermode;
Rect rect;
Canvas testCanvas;
public CircularDrawable(Drawable drawable) {
mDrawable = drawable;
mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mPaint.setColor(0xffffffff);
mPaint.setStyle(Paint.Style.FILL);
xfermodePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
xfermode=new PorterDuffXfermode(PorterDuff.Mode.SRC_IN);
xfermodePaint.setXfermode(xfermode);
testCanvas=new Canvas();
}
@Override
public void setBounds(Rect bounds) {
super.setBounds(bounds);
mDrawable.setBounds(bounds);
}
@Override
public void setBounds(int left, int top, int right, int bottom) {
super.setBounds(left, top, right, bottom);
mDrawable.setBounds(left, top, right, bottom);
}
@Override
protected void onBoundsChange(Rect bounds) {
super.onBoundsChange(bounds);
vinylCenter[0] = bounds.width() / 2;
vinylCenter[1] = bounds.height() / 2;
radius = (bounds.right - bounds.left) / 2;
src = Bitmap.createBitmap(bounds.width(), bounds.height(), Bitmap.Config.ARGB_8888);
testCanvas.setBitmap(src);
}
@Override
public void draw(Canvas canvas) {
canvas.save();
canvas.drawARGB(0, 0, 0, 0);
canvas.drawCircle(vinylCenter[0],vinylCenter[1],radius,mPaint);
mDrawable.draw(testCanvas);
canvas.drawBitmap(src,0f,0f,xfermodePaint);
}
@Override
public void setAlpha(int alpha) {/*ignored*/}
@Override
public void setColorFilter(ColorFilter colorFilter) {/*ignored*/}
@Override
public int getOpacity() {
/*ignored*/
return 0;
}
}我犯了什么错?
另外,我使用一个SquareImageview来显示这个可绘制的图形,使视图在onMeasure中成为正方形。这个问题不适用于圆形图像视图。
发布于 2015-12-06 16:36:17
默认情况下,画布在使用Porter/Duff xfermode模式时没有alpha通道(根据我在android中使用此模式的经验)。这就是为什么整个图像(Src)是输出的原因。Porter/Duff xfermode基于阿尔法通道。
在许多圆绘制2画布的实现中,给出了一个RGB图像位图,另一个只给出了带圆形掩码的α通道位图。Porter/Duff xfermodeis应用,结果绘制在主画布上。
我的错误是,我没有指定绘图函数的画布,在xfermode上使用画布上的层时,将考虑使用alpha通道。
抽签功能将变成
@Override
public void draw(Canvas canvas) {
int sc = canvas.saveLayer(null, null,
Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |
);
canvas.drawCircle(vinylCenter[0],vinylCenter[1],radius,mPaint);
mDrawable.draw(testCanvas);
canvas.drawBitmap(src,0f,0f,xfermodePaint);
canvas.restoreToCount(sc);
}保存图层以指示带有标志的alpha通道,然后使用xfermode。最后,将其恢复到保存计数。
发布于 2015-12-10 13:55:26
您已经对支持库v4中的循环可绘图实现进行了优化:
谷歌参考
/**
* A Drawable that wraps a bitmap and can be drawn with rounded corners. You can create a
* RoundedBitmapDrawable from a file path, an input stream, or from a
* {@link android.graphics.Bitmap} object.
* <p>
* Also see the {@link android.graphics.Bitmap} class, which handles the management and
* transformation of raw bitmap graphics, and should be used when drawing to a
* {@link android.graphics.Canvas}.
* </p>
*/
public abstract class RoundedBitmapDrawable extends Drawable ....发布于 2015-12-08 01:54:06
所以基本上我用这个方法得到圆角图像
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, int pixels) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
final float roundPx = pixels;
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;但是就像你指出的,有时候它不起作用,但是大多数情况下,你的图像视图可能被设置为centerCrop和其他类型,我所做的是首先将图像高度压缩到与我的图像视图相同的高度和宽度,这样整个图像就会适合于图像视图,不会发生缩放,或者我只是根据高度计算出使用这个函数进行圆整的角高度的多少。
private int calculatePercentage(int percentage, int target)
{
int k = (int)(target*(percentage/100.0f));
return k;
}因此,我使用了代码,如:new Bitmap(getRoundedCornerBitmap(bmp, calculatePercentage(5, bmp.getHeight()))); where 5 is 5的图像高度,这给了我相同的曲线,对所有的图像,无论它是一些图像大于其他‘
https://stackoverflow.com/questions/34065510
复制相似问题