2012-02-14 1002 views
4

我重寫Android的ImageView以使圖像的角落透明。我能夠做到這裁剪畫布在我的onDraw(帆布油畫):如何在Android畫布中擦除(使透明)一個自定義區域?

@Override 
protected void onDraw(Canvas canvas) { 
    Path clipPath = new Path(); 
    int w = this.getWidth(); 
    int h = this.getHeight(); 
    clipPath.addRoundRect(new RectF(0,0,w,h), 10.0f, 10.0f, Path.Direction.CW); 
    canvas.clipPath(clipPath); 
    super.onDraw(canvas); 
} 

不幸的是,這是不可能的抗鋸齒這個圓角矩形,其結果是醜陋的角落這樣的:

enter image description here

我知道我可以使用PaintPorterDuff.Mode.CLEAR來清除我的畫布部分的抗鋸齒,我不知道的是將圓角指定爲要擦除的區域。我在尋找這樣的事情:

@Override 
protected void onDraw(Canvas canvas) { 
    //superclass will draw the bitmap accordingly 
    super.onDraw(canvas); 

    final Paint paint = new Paint(); 
    paint.setAntiAlias(true); 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 

    //this will erase a round rectangle, I need the exact inverse 
    canvas.drawRoundRect(rect, rx, ry, paint); 
} 

有什麼辦法「抹掉」,而不是圓角矩形,但它的倒數,即,圓角?而如果我只想抹掉其中一個角落呢?

回答

4

使用帶有透明顏色的BitmapShader繪製Paint對象。
如果您只想擦除其中一個角落,請嘗試將其繪製爲路徑而不是RoundRect。

protected void onDraw(Canvas canvas) { 
    BitmapShader bitmapShader = new BitmapShader(<original drawable>, TileMode.CLAMP, TileMode.CLAMP); 

    Paint paint = new Paint(); 
    paint.setAntiAlias(true); 
    paint.setColor(0xFF000000); 
    paint.setShader(bitmapShader); 

    canvas.drawRoundRect(rect, rx, ry, paint); 

} 
+0

但是我應該在我的onDraw()中繪製實際的原始drawable嗎?我在android源代碼中看到[ImageView的onDraw()](http://androidxref.com/source/xref/frameworks/base/core/java/android/widget/ImageView.java)執行不同類型的檢查和畫布修改(例如:填充)。 – Pedro 2012-02-14 15:15:04

+0

您將原始繪圖作爲BitmapShader繪製。圓角矩形之外的區域將以透明方式繪製。 – Freddroid 2012-02-14 15:20:54

+0

「BitmapShader」的第一個參數不是可繪製的,而是位圖。 – 2015-02-18 09:40:51