Android自定义轮廓呈现奇怪的高程阴影

时间:2016-01-20 13:45:37

标签: android android-elevation

我有一个基于全屏显示的FrameLayout的自定义视图(作为Android的SystemUI包的一部分),我使用canvas绘制一些东西。

现在我想要在这个视图中使用单个元素(我绘制的一个圆圈)来投射某种阴影。所以我添加了一个自定义大纲让框架为我渲染阴影。不幸的是,这个阴影看起来有点奇怪(周围的圆形线条),我对于导致这个问题的原因我一无所知。

有没有人遇到类似的问题或知道如何解决这个问题?谢谢!

MWE:

public class Menu extends FrameLayout {

    private int mRadius;

    public Menu(Context context) {
        super(context);

        mRadius = context.getResources()
            .getDimensionPixelSize(R.dimen.menu_radius);

        setElevation(context.getResources()
                .getDimensionPixelSize(R.dimen.menu_elevation));
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        setOutlineProvider(new CustomOutline(w, h));
    }

    private class CustomOutline extends ViewOutlineProvider {

        private int mWidth;
        private int mHeight;

        public CustomOutline(int w, int h) {
            mWidth = w;
            mHeight = h;
        }

        @Override
        public void getOutline(View view, Outline outline) {
            outline.setOval(-mRadius, -mRadius, mRadius, mRadius);
            outline.offset(mWidth/2, mHeight/2);
        }
    }
}

奇怪的影子:

Weird looking elevation shadow

1 个答案:

答案 0 :(得分:2)

您的代码没有任何问题,系统会像这样绘制高程阴影。只有当您在其上绘制的形状是透明或半透明时,这些工件才可见。不透明的形状将覆盖它们,就像这个例子:

Elevation shadows with an opaque shape