首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android:圆形绘图

Android:圆形绘图
EN

Stack Overflow用户
提问于 2015-12-03 11:58:28
回答 6查看 1.6K关注 0票数 7

我使这个自定义可绘制,应该剪辑任何可绘制在圈内。但是在我的实现中,可绘制的传递是原始形式的输出,而不是循环形式。

代码语言:javascript
复制
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中成为正方形。这个问题不适用于圆形图像视图。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2015-12-06 16:36:17

默认情况下,画布在使用Porter/Duff xfermode模式时没有alpha通道(根据我在android中使用此模式的经验)。这就是为什么整个图像(Src)是输出的原因。Porter/Duff xfermode基于阿尔法通道。

在许多圆绘制2画布的实现中,给出了一个RGB图像位图,另一个只给出了带圆形掩码的α通道位图。Porter/Duff xfermodeis应用,结果绘制在主画布上。

我的错误是,我没有指定绘图函数的画布,在xfermode上使用画布上的层时,将考虑使用alpha通道。

抽签功能将变成

代码语言:javascript
复制
@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。最后,将其恢复到保存计数。

票数 3
EN

Stack Overflow用户

发布于 2015-12-10 13:55:26

您已经对支持库v4中的循环可绘图实现进行了优化:

谷歌参考

代码语言:javascript
复制
 /**
* 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 ....
票数 4
EN

Stack Overflow用户

发布于 2015-12-08 01:54:06

所以基本上我用这个方法得到圆角图像

代码语言:javascript
复制
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和其他类型,我所做的是首先将图像高度压缩到与我的图像视图相同的高度和宽度,这样整个图像就会适合于图像视图,不会发生缩放,或者我只是根据高度计算出使用这个函数进行圆整的角高度的多少。

代码语言:javascript
复制
   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的图像高度,这给了我相同的曲线,对所有的图像,无论它是一些图像大于其他‘

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34065510

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档