2

I'm trying to draw a ring with black shadow border. I'm able to achieve this with custom view when I use any color like RED, but what I want is a transparent circle with black shadow border.

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); }
4

3 に答える 3

3

ここで起こっているのは、塗りつぶされた透明な円を描き、それに影レイヤーを設定していることです。円は透明なので、探しているエッジだけでなく、円を通してオブジェクトの影全体を見ることができます。影が黒いので円全体が黒く見えます。

Paint スタイルを Stroke に設定してみてください。これにより、中央が透明になり、外側のリングの影だけが描画されます。ただし、両方の方向(内側と外側)に影を描く可能性があるため、それに応じて影の半径を調整する必要がある場合があります。

mPaint.setStyle(Paint.Style.STROKE);
于 2012-09-11T14:21:29.390 に答える
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);
}
}
于 2013-02-10T17:32:25.093 に答える
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);
于 2013-09-20T21:31:36.487 に答える