2013-12-08 66 views
0

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

@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吗?

回答

0

您是否研究过在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; 
} 
+0

,如果我做一个空白的位图,只应用透明像素,然后回来和porterduff drawbitmap,将它设置为仅我在新的位图变为透明画布上的像素? – codingNewb

+0

nope,no luck =( – codingNewb

+0

你究竟想要清除什么?你有没有一个前后图像的例子? –