【问题标题】:android custom view ondraw, get bitmap from canvas?android自定义视图ondraw,从画布获取位图?
【发布时间】:2013-12-08 09:44:11
【问题描述】:

所以我似乎有一个难题。我需要向框架布局添加多个自定义视图。这个代码工作得很好。但是,我希望访问画布在视图 onDraw 方法中使用的底层位图。像这个(在扩展 View 的类中):

@Override
protected void onDraw(Canvas canvas) {
    // TODO Auto-generated method stub
    super.onDraw(canvas);
    canvas.drawARGB(Color.alpha(bgColor), Color.red(bgColor),
            Color.green(bgColor), Color.blue(bgColor));
    m.reset();
    m.setTranslate(imgPosX - ((float) userImage.getWidth() / 2.0f), imgPosY
            - ((float) userImage.getHeight() / 2.0f));
    m.postRotate(angle);
    m.postScale(1.0f, 1.0f);
    canvas.drawBitmap(userImage, m, null);
    }

我希望从本质上擦除某些像素。现在,我知道我可以通过 setPixel 方法做到这一点,这很好,但速度非常慢且不能令人满意。我有一个工作的 ndk 函数,它完全符合我的要求,但它传递了一个位图。我知道我可以使用 SurfaceView 而不是 View 来访问这样的位图,但是正如 here FrameLayout 中提到的多个 SurfaceView 不是一种选择。所以,我认为我需要在 onDraw 方法中操作画布使用的位图本身。我该怎么做呢?或者我不介意创建另一个位图,将其传递给 ndk 函数并返回/绘制它,但是我会做一个带有透明像素的 canvas.drawBitmap 吗?

【问题讨论】:

    标签: java android view android-framelayout


    【解决方案1】:

    您是否考虑过在 Paint 对象上设置 PorterDuff 模式? 使用paint.setXfermode(new PorterDuffXfermode(Mode.CLEAR)),然后在要擦除的像素上绘制

    编辑:您到底想清除什么?有multiple modes,您可能需要根据您要执行的操作选择不同的。这是我目前用来将位图裁剪为圆形的函数示例。

    public static Bitmap crop_circle_center(Bitmap bitmap) {
        final int diameter = Math.min(bitmap.getWidth(), bitmap.getHeight());
        Bitmap output = Bitmap.createBitmap(diameter,
                diameter, 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());
        rect.offset(-(bitmap.getWidth()-diameter)/2, -(bitmap.getHeight()-diameter)/2);
        paint.setAntiAlias(true);
        canvas.drawARGB(0, 0, 0, 0);
        paint.setColor(color);
        canvas.drawCircle(diameter/ 2, diameter/ 2,
                diameter / 2, paint);
    
        paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
        canvas.drawBitmap(bitmap, null, rect, paint);
        return output;
    }
    

    【讨论】:

    • 如果我制作一个空白位图,仅应用透明像素,然后返回并使用 porterduff 绘制位图,它会仅将我在新位图中更改的像素设置为在画布上透明吗?跨度>
    • 您到底想清除什么?你有前后图像的例子吗?
    • 我最终只制作了第二个画布,操纵那个画布,然后将位图从那个画布绘制到主画布,成功了^_^
    猜你喜欢
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-03
    相关资源
    最近更新 更多