Подтвердить что ты не робот

Возвышение леденца на вогнутом контуре

У меня есть пользовательский вид, который отображает форму звезды, используя путь. Это представление работает, как и ожидалось, но теперь я хочу перенести его реализацию на новую рекомендацию Google Material.

К сожалению, elevation зависит от выпуклого контура, и я пока не нашел решения.

Есть ли какие-либо известные обходные пути или какие-либо другие творческие решения, которые кто-нибудь из вас знает?

enter image description here

Это мой вогнутый путь:

    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)

Есть идеи, как достичь этой цели?

4b9b3361

Ответ 1

В пакете AndroidX есть новый чертеж, который называется MaterialShapeDrawable. При заданном пути он может отображать тень как вогнутых, так и выпуклых фигур.

https://developer.android.com/reference/com/google/android/material/shape/MaterialShapeDrawable

Вот как вы бы обеспечили тень для вашей вогнутой формы БЕЗ MaterialShapeDrawable:

  • Создать новое растровое изображение
  • Изменить растровое изображение (нарисуйте путь в форме звезды, используя новый объект Canvas)
  • Размыть растровое изображение, чтобы оно выглядело как тень. (Размывание должно быть сделано с RenderScript по соображениям производительности)
  • Нарисуйте растровое изображение на видах Canvas.