Как создать фигуру с прозрачным фоном и тенью, но тень не должна быть видна за контуром фигуры? - PullRequest
0 голосов
/ 21 января 2019

В некоторой степени похожий вопрос, но ответ на него заключается в том, чтобы просто удалить возвышение и тень ... не то, что я хочу: Android CardView со странной рамкой при прозрачном

То, что я хочу, это то, что показано в строке поиска Pixel Launcher ... а именно фигура, которая имеет полупрозрачный фон и тень, но тень не перекрывается с белой формой (что в итоге заставило бы его выглядеть серым). Я в основном хочу тень, но с отверстием в середине, где моя форма ...

Вот чего я хочу достичь (панель поиска внизу): What I want

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

activity_main.xml

    <FrameLayout
      android:layout_width="120dp"
      android:layout_height="120dp"
      android:background="@drawable/rectangle"
      android:elevation="8dp" />

Rectangle.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android">
  <corners android:radius="4dp" />
  <solid android:color="#aaffffff" />
</shape>

Вот как выглядит моя попытка: My failed attempt

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

Я также попытался поиграть с View # setOutlineProvider, но безуспешно.

Я также пытался играть с https://github.com/harjot-oberai/MaterialShadows

Я не хочу делать это с изображением из 9 патчей, если смогу избежать этого.

1 Ответ

0 голосов
/ 28 января 2019

Одним из решений является применение прозрачности к самому фрейму, а не только к фону прямоугольника. Это создаст эффект, похожий на тот, который изображен.

Например:

<FrameLayout
    android:layout_width="120dp"
    android:layout_height="120dp"
    android:elevation="8dp"
    android:alpha="0.6" />

Это, конечно, имеет проблемы, если вы хотите непрозрачные элементы, чтобы исправить это, вы можете извлечь фон и сделать что-то вроде:

<FrameLayout
    android:layout_width="120dp"
    android:layout_height="120dp">
    <ImageView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="@drawable/rectangle"
        android:alpha="0.6"
        android:elevation="8dp" />
</FrameLayout>
...