Android Drop Shadow on View

Я провел обширный поиск примеров кода, но ничего не могу найти.

В частности, я хочу добавить тень в png drawable, который я использую в ImageView. Этот png drawable представляет собой закругленный прямоугольник с прозрачными углами.

Может ли кто-нибудь указать пример кода, как добавить приличную тень к представлению в коде или XML?

Ответ 1

Вы можете использовать комбинацию Bitmap.extractAlpha и BlurMaskFilter, чтобы вручную создать тень для любого изображения, которое вам нужно отобразить, но это будет работать, только если ваше изображение загружается или показывается только раз в то время, поскольку процесс дорого.

Псевдокод (может даже компилироваться!):

BlurMaskFilter blurFilter = new BlurMaskFilter(5, BlurMaskFilter.Blur.OUTER);
Paint shadowPaint = new Paint();
shadowPaint.setMaskFilter(blurFilter);

int[] offsetXY = new int[2];
Bitmap shadowImage = originalBitmap.extractAlpha(shadowPaint, offsetXY);

/* Might need to convert shadowImage from 8-bit to ARGB here, can't remember. */

Canvas c = new Canvas(shadowImage);
c.drawBitmap(originalBitmap, offsetXY[0], offsetXY[1], null);

Затем поместите shadowImage в свой ImageView. Если это изображение никогда не изменяется, но отображается много, вы можете его создать и кэшировать в onCreate, чтобы обойти дорогостоящую обработку изображений.

Даже если это не работает как есть, этого должно быть достаточно, чтобы вы пошли в правильном направлении.

Ответ 2

Для использования теневого тренда используйте код ниже

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
  <gradient
    android:startColor="#ffffff"
    android:centerColor="#d3d7cf"
    android:endColor="#2e3436"
    android:angle="90" />
</shape>

Используйте вышеприведенные для фона представления

<View 
    android:id="@+id/divider" 
    android:background="@drawable/black_white_gradient"
    android:layout_width="match_parent" 
    android:layout_height="10sp"
    android:layout_below="@+id/buildingsList"/>

Ответ 3

Это помогло мне заставить тень работать, поэтому я хочу поделиться рабочим кодом:

private Bitmap createShadowBitmap(Bitmap originalBitmap) {
    BlurMaskFilter blurFilter = new BlurMaskFilter(5, BlurMaskFilter.Blur.OUTER);
    Paint shadowPaint = new Paint();
    shadowPaint.setMaskFilter(blurFilter);

    int[] offsetXY = new int[2];
    Bitmap shadowImage = originalBitmap.extractAlpha(shadowPaint, offsetXY);

    /* Need to convert shadowImage from 8-bit to ARGB here. */
    Bitmap shadowImage32 = shadowImage.copy(Bitmap.Config.ARGB_8888, true);
    Canvas c = new Canvas(shadowImage32);
    c.drawBitmap(originalBitmap, -offsetXY[0], -offsetXY[1], null);

    return shadowImage32;
}

Ответ 4

Для API 21 (5.0) + добавьте android:elevation="4dp" или android:translationZ="4dp", чтобы просмотреть описание. Документация

Атрибут возвышения

Ответ 5

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

shadow.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
  <gradient
    android:startColor="#002e3436"
    android:endColor="#992e3436"
    android:angle="90" />
</shape>

И в представлении

<View 
    android:id="@+id/divider" 
    android:background="@drawable/shadow"
    android:layout_width="match_parent" 
    android:layout_height="5dp"/>