Android 黑影拉环

Android 黑影拉环,android,geometry,shadow,Android,Geometry,Shadow,我想画一个有黑色阴影边框的戒指。当我使用任何颜色(如红色)时,我可以通过自定义视图实现这一点,但我想要的是一个带有黑色阴影边框的透明圆 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 can

我想画一个有黑色阴影边框的戒指。当我使用任何颜色(如红色)时,我可以通过自定义视图实现这一点,但我想要的是一个带有黑色阴影边框的透明圆

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

这里发生的事情是,它正在绘制一个填充的透明圆,并将阴影层设置为该值。由于圆是透明的,因此可以通过它看到对象的整个阴影,而不仅仅是要查找的边。阴影是黑色的,所以看起来整个圆圈都是黑色的

尝试将绘制样式设置为“笔划”。这将使中间部分透明,并只绘制外环的阴影。它可能会在两个方向(内部和外部)绘制阴影,因此您可能需要相应地调整阴影半径

mPaint.setStyle(Paint.Style.STROKE);

您的目标是Android SDK 11或更高版本吗?由于具有硬件支持的蜂窝阴影渲染已被禁用,您必须为此层启用软件渲染。您必须对设置绘制的函数进行注释,如下所示:

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

您需要使用完全透明的颜色有效地绘制阴影,正如您目前所发现的,然后使用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);

颜色使用带有不透明度的ARGB值。对于
mPaint
,您是否尝试过
setColor(0x00000000)而不是使用
setColor(color.RED)
?完全透明的东西不是定义上没有阴影吗?@Squonk它用黑色填充圆圈,我希望它是透明的。@Geobits我想在html/css中实现的一个例子是,你解决了这个问题吗?谢谢/我仍然没有得到与jsfiddle.net/jhjq4相同的结果。有没有办法只在阴影的外部绘制阴影,而不必调整半径?