36

我已经对此进行了一些广泛的代码示例搜索,但找不到任何东西。

特别是,我希望为我在 ImageView 中使用的 png drawable 添加阴影。这个 png drawable 是一个带有透明角的圆角矩形。

有人可以提供一个代码示例,说明如何在代码或 XML 中向视图添加一个像样的阴影吗?

4

5 回答 5

34

您可以结合使用 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 以绕过昂贵的图像处理。

即使这不起作用,它也应该足以让你朝着正确的方向前进。

于 2010-08-25T18:18:34.860 回答
29

For Drop shadow use below code

<?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>

Use above drawable for a background of a view

<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"/>
于 2011-12-05T17:23:45.903 回答
14

这帮助我让影子工作,所以我想分享工作代码:

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;
}
于 2014-05-06T06:18:41.767 回答
7

对于 API 21(5.0)+ ,添加android:elevation="4dp"android:translationZ="4dp"查看说明。文档

高程属性

于 2016-07-01T01:00:05.147 回答
1

始终使用透明阴影,这样它们就可以粘在任何颜色上。

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"/>
于 2017-03-14T07:52:10.777 回答