Android Drop Shadow on View - PullRequest
       87

Android Drop Shadow on View

33 голосов
/ 25 августа 2010

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

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

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

Ответы [ 5 ]

32 голосов
/ 25 августа 2010

Вы можете использовать комбинацию 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, чтобы обойти дорогостоящую обработку изображений.

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

26 голосов
/ 05 декабря 2011

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

<?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"/>
10 голосов
/ 06 мая 2014

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

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;
}
5 голосов
/ 01 июля 2016

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

Elevation Attribute

1 голос
/ 14 марта 2017

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

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"/>
...