我有一个自定义视图,它使用路径显示星形。这个视图按预期工作,但现在我想将它的实现转移到新的google material推荐上。
不幸的是,elevation依赖于一个凸轮廓,我还没有找到解决方案。
有没有任何已知的解决办法或其他创造性的解决方案,你们知道吗?
这是我的凹道:

    double outerSize = w / 2;
    double innerSize = w / 5;
    double delta = 2.0*Math.PI/5.0;
    double rotation = Math.toRadians(-90);
    double xpos = w/2.0;
    double ypos = h/2.0;
    mPath = new Path();

    mPath.moveTo((float)(outerSize * Math.cos(delta + rotation) + xpos),
                 (float)(outerSize * Math.sin(delta + rotation) + ypos));

    for(int point= 0;point<6;point++)
    {
        mPath.lineTo((float) (innerSize * Math.cos(delta * (point + 0.5) + rotation) + xpos),
                (float) (innerSize * Math.sin(delta * (point + 0.5) + rotation) + ypos));
        mPath.lineTo((float) (outerSize * Math.cos(delta * (point + 1.0) + rotation) + xpos),
                (float) (outerSize * Math.sin(delta * (point + 1.0) + rotation) + ypos));
    }

    mPath.close();

我试过这段代码,但没有成功,它在凸面视图上工作得很好。
@TargetApi(21)
private class StarOutline extends ViewOutlineProvider {

    @Override
    public void getOutline(View view, Outline outline) {
        StartView r = (StartView) view;
        // i know here say setConvexPath not setConcavePath
        outline.setConvexPath(r.mPath);
    }
}

但正如所料,我有个例外:
java.lang.IllegalArgumentException: path must be convex
        at android.graphics.Outline.setConvexPath(Outline.java:216)

你知道如何达到这个目标吗?

最佳答案

androidx封装中有一种叫做materialshapedrawable的新型可拉伸材料。给定一条路径,它可以将阴影渲染为凹凸形状。
https://developer.android.com/reference/com/google/android/material/shape/MaterialShapeDrawable
这就是你如何在没有材料的情况下为凹形提供阴影的方法:
创建新位图
修改位图(使用新画布对象在其上绘制星形路径)
模糊位图,使其看起来像阴影。(出于性能原因,应使用renderscript进行模糊处理)
在视图画布上绘制位图。

07-24 09:26