2015-04-05 157 views
2

我已閱讀了20多個問題/答案,但仍無法獲得我想要的內容。我想剪一個矩形內的圓,如下圖所示:如何在Android中的矩形內裁剪圓形路徑

enter image description here

這裏是我的代碼:

@Override 
protected void onDraw(Canvas canvas) { 
    Paint paint = new Paint(); 
    paint.setStyle(Paint.Style.FILL); 
    paint.setARGB(180, 0, 0, 0); 
    canvas.drawRect(0, 0, getWidth(), getHeight(), paint); 
    Path circularPath = new Path(); 
    circularPath.addCircle(getWidth()/2, getHeight()/2, radius, Path.Direction.CCW); 
    canvas.clipPath(circularPath, Region.Op.REPLACE); 
    canvas.drawColor(0x00000000); 


} 

我的背景(setARGB)顯示正常,但是沒有被裁剪。我也嘗試了REPLACE之外的其他值,通過在構造函數上調用setLayerType(LAYER_TYPE_SOFTWARE, null);強制進行軟件光柵化(正如我在某些Android版本上閱讀clipPath不支持某些Op),但無濟於事。我如何達到預期效果?

注意:我的最低SDK版本是15,所以我不需要支持任何低於4.0的東西。

+0

你嘗試Region.Op.DIFFERENCE? – pskink 2015-04-05 14:37:25

+0

@pskink是的,只是現在再試一次,以確保。不幸的是,沒有任何反應。 – 2015-04-05 14:38:50

+0

差異對我來說很好,嘗試canvas.drawColor與Color.RED,然後clipPath,然後drawColor 0xps000000 – pskink 2015-04-05 14:51:35

回答

1

嘗試在dispatchDraw()裁剪您的路徑:

@Override 
protected void dispatchDraw(Canvas canvas) 
{ 
    canvas.clipPath(mClipPath, mRegion); // previously created path & region 

    super.dispatchDraw(canvas); 
} 

刪除路徑從onDraw方法削波代碼,而且應該這樣做。

編輯:

在創建路徑,請確保你這樣做產生一個度量之後,例如:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
{ 
    super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

    mClipPath.reset(); 
    float radius = Math.min((float)getMeasuredWidth()/2f, (float)getMeasuredHeight()/2f) + 5; 
    mClipPath.addCircle((float)getMeasuredWidth()/2f, (float)getMeasuredHeight()/2f, radius, Path.Direction.CCW); 
} 
+0

試過了,沒有任何改變。 – 2015-04-05 14:29:59

+0

我編輯了我的答案,以包括可能的原因,以便它不適用於您 – 2015-04-05 14:33:54

+2

複製/粘貼它。仍然沒有變化。儘管如此,我很懷疑除了'onDraw'外應該有一個重寫的方法,因爲我見過的所有例子都只涉及到這個方法。 – 2015-04-05 14:37:34