首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绘制圆角ImageView时的效率

绘制圆角ImageView时的效率
EN

Stack Overflow用户
提问于 2012-08-10 02:16:24
回答 1查看 1.8K关注 0票数 6

我有一个ImageView子类,我用它来绘制圆角图像。代码基于this answer,代码如下:

代码语言:javascript
复制
public class ImageViewRoundedCorners extends ImageView {
    ...
    @Override
    protected void onDraw(Canvas canvas) {
        Bitmap scaledBitmap = Bitmap.createBitmap(getMeasuredWidth(),
                                                  getMeasuredHeight(),
                                                  Bitmap.Config.ARGB_8888); 
        Canvas scaledCanvas = new Canvas(scaledBitmap);
        super.onDraw(scaledCanvas); 
        drawRoundedCornerBitmap(canvas, scaledBitmap, 
                                getMeasuredWidth(), getMeasuredHeight());

        scaledBitmap.recycle();
    }

    protected void drawRoundedCornerBitmap(Canvas outputCanvas, Bitmap input, int w, int h) {
        Bitmap output = Bitmap.createBitmap(w, h, Config.ARGB_8888);
        Canvas canvas = new Canvas(output);

        mPaint.reset();
        mPaint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);

        mPaint.setStyle(Paint.Style.FILL);
        canvas.drawPath(mClipPath, mPaint);

        mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(input, 0, 0, mPaint);

        outputCanvas.drawBitmap(output, 0, 0, null);
    }
}

使用此代码,可以使用适当的圆角绘制图像。为了避免在drawRoundedCornerBitmap的前两行进行分配,我想直接绘制到outputCanvas,这是最初传递给onDraw的画布。新的实现如下所示:

代码语言:javascript
复制
protected void drawRoundedCornerBitmap(...) {
    mPaint.reset();
    mPaint.setAntiAlias(true);
    outputCanvas.drawARGB(0, 0, 0, 0);

    mPaint.setStyle(Paint.Style.FILL);
    outputCanvas.drawPath(mClipPath, mPaint);

    mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
    outputCanvas.drawBitmap(input, 0, 0, mPaint);
}

由于某些原因,此代码似乎忽略了Porter-Duff模式,而只是绘制具有正常(非圆角)角的图像。为什么会这样呢?绘制到中间Bitmap使原始代码工作的原因是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-28 23:19:48

创建一个可绘制的Romain Guy已经为你做了这件事。我们不是链接工厂,但他的博客文章对此进行了相当广泛的解释,并提供了一种有效的方法来做到这一点。Rounded Corners

真正基本原则是创建一个BitmapShader并将其附加到一个Paint对象,该对象绘制一个自定义Drawable,方法是将Drawable应用于ImageView

使用可绘制的意味着图像只绘制到画布上一次,这意味着绘制图像只完成一次,然后ImageView所做的只是缩放可绘制的。

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

https://stackoverflow.com/questions/11889531

复制
相关文章

相似问题

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