私はこれに関するコード例を広範囲に検索しましたが、何も見つかりません。
特に、ImageViewで使用しているpngドローアブルに影を付けたいと思っています。このpngドローアブルは、角が透明な丸みを帯びた長方形です。
誰かがコードまたはXMLのいずれかでビューに適切なドロップシャドウを追加する方法のコード例を提供できますか?
私はこれに関するコード例を広範囲に検索しましたが、何も見つかりません。
特に、ImageViewで使用しているpngドローアブルに影を付けたいと思っています。このpngドローアブルは、角が透明な丸みを帯びた長方形です。
誰かがコードまたはXMLのいずれかでビューに適切なドロップシャドウを追加する方法のコード例を提供できますか?
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にキャッシュし、高価な画像処理をバイパスすることができます。
それがそのままではうまくいかない場合でも、正しい方向に進むには十分なはずです。
ドロップシャドウの場合、以下のコードを使用します
<?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"/>
これはシャドウを機能させるのに役立ったので、機能するコードを共有したいと思いました。
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;
}
API 21(5.0)+の場合は、説明を追加android:elevation="4dp"
またはandroid:translationZ="4dp"
表示します。ドキュメンテーション
どの色にもくっつくことができるように、常に透明な影を使用してください。
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"/>