2012-09-11 113 views
2

我正在嘗試繪製帶有黑色陰影邊框的圓環。當我使用RED等任何顏色時,我可以通過自定義視圖實現此目的,但我想要的是帶有黑色陰影邊框的透明圓。帶黑色陰影的繪畫環

Paint mPaint = new Paint(); 
    mPaint.setAntiAlias(true); 
    mPaint.setColor(Color.RED); 
    mPaint.setShadowLayer(5.5f, 6.0f, 6.0f, Color.BLACK); 

protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    canvas.drawCircle(70, 70, 50, mPaint); } 
+0

顏色使用ARGB值,A是不透明度。 'mPaint'沒有使用'setColor(Colour.RED)',你是否嘗試過'setColor(0x00000000)'? – Squonk

+0

不完全透明的東西是不是有定義的影子? – Geobits

+0

@Squonk它用黑色填充圓圈我希望它是透明的。 – mkso

回答

3

這裏發生的事情是,它的繪圖填寫透明圈,並設置陰影層了這一點。由於圓是透明的,你可以通過它看到對象的整個陰影,而不僅僅是你正在尋找的邊緣。陰影是黑色的,所以看起來整個圓圈都是黑色的。

嘗試將「繪製」樣式設置爲「描邊」。這應該讓中間變得透明,並且只畫出外圈的陰影。它可以在兩個方向上繪製陰影(內部和外部),因此您可能需要相應地調整陰影半徑。

mPaint.setStyle(Paint.Style.STROKE); 
+0

我仍然沒有得到與jsfiddle.net/JHjQ4 – mkso

+0

相同的結果有沒有一種方法可以僅在其外部繪製陰影而無需調整半徑? – Pkmmte

0

您針對的是Android SDK 11或更高版本嗎?由於禁用了硬件支持的HoneyComb陰影,因此您需要打開該層的軟件渲染。你必須標註的功能設置這樣的漆:

@TargetApi(Build.VERSION_CODES.HONEYCOMB) 
private void setUpPaint(){ 
    mPaint.setAntiAlias(true); 
    mPaint.setColor(Color.RED); 
    mPaint.setShadowLayer(5.5f, 6.0f, 6.0f, 0x80000000); 

    /* --- for android:minSdkVersion="11" --- */ 
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { 
    setLayerType(LAYER_TYPE_SOFTWARE, mPaint); 
} 
} 
0

你需要使用完全透明的顏色,以有效地繪製陰影,因爲你已經發現,到目前爲止,然後使用刪除着色的中心PorterDuff.Mode.CLEAR - 只留下外面的陰影。

PorterDuffXfermode mXferMode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR); 

// draw the src/dst example into our offscreen bitmap 
int sc = canvas.saveLayer(0, 0, 70 + 50, 70 + 50, null, 
             Canvas.MATRIX_SAVE_FLAG | 
             Canvas.CLIP_SAVE_FLAG | 
             Canvas.HAS_ALPHA_LAYER_SAVE_FLAG | 
             Canvas.FULL_COLOR_LAYER_SAVE_FLAG | 
             Canvas.CLIP_TO_LAYER_SAVE_FLAG); 

canvas.drawCircle(70, 70, 50, shadowPaint); 
shadowPaint.setXfermode(mXferMode); 
canvas.drawCircle(70, 70, 50, shadowPaint); 
shadowPaint.setXfermode(null); 
canvas.restoreToCount(sc);