2013-12-08 64 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

你究竟想要清除什麼?你有沒有一個前後圖像的例子? –