web-dev-qa-db-ja.com

Androidビューにドロップシャドウ

これに関するコード例を広範囲に検索しましたが、何も見つかりません。

特に、ImageViewで使用しているpngドロアブルに影を追加しようとしています。このpngドロアブルは、透明な角を持つ丸い長方形です。

誰かが、適切なドロップシャドウをコードまたはXMLでビューに追加する方法のコード例を提供できますか?

33
coneybeare

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にキャッシュし、高価な画像処理をバイパスすることができます。

そのままではうまくいかなくても、正しい方向に進むには十分なはずです。

32
Josh

以下のコードでドロップシャドウを使用する場合

<?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"/>
27
om252345

これにより、シャドウを機能させることができたので、動作中のコードを共有したいと思いました。

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;
}
10
PeterE

API 21(5.0)+の場合、Android:elevation="4dp"またはAndroid:translationZ="4dp"説明を表示します。 ドキュメント

Elevation Attribute

6
Artyom

常に透明な影を使用して、任意の色に固執できるようにします。

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