【发布时间】:2016-03-08 00:55:09
【问题描述】:
我制作了这个自定义可绘制对象,它应该将任何可绘制对象剪辑成圆形。但是在我的实现中,传递的drawable是原始形式的输出,而不是循环形式的输出。
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 中使视图呈正方形的可绘制对象。 此问题不适用于 Circular imageview。
【问题讨论】:
-
参考this
-
@pskink 但这是其他实现。我想知道我在 Porter/Duff 实现中的错误是什么。
-
如果是正方形,则表示您正在绘制整个
"DST"区域 -
不,我尝试了这两种方法。你试试这整个代码。我都试过了。我们用paint绘制的是“Source”,绘制的地方是“Destination”,也就是说Image是source,画布上的圆圈是destination。
-
好的,到目前为止你做了什么?你试过运行 APiDemos 吗?它在那里有一个 porter-duff 示例。您是否尝试关闭硬件加速?
标签: android drawable porter-duff