android - spec - whatwg español
Android Drop Shadow en la vista (5)
He hecho una búsqueda exhaustiva de ejemplos de código sobre esto, pero no puedo encontrar nada.
En particular, estoy buscando agregar una sombra a un png dibujable que estoy usando en un ImageView. Este png dibujable es un rect redondo con esquinas transparentes.
¿Puede alguien proporcionar un ejemplo de código de cómo agregar una sombra paralela decente a una vista en código o XML?
Esto me ayudó a que la sombra funcionara, así que quería compartir el código de trabajo:
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;
}
Para el uso de la sombra paralela debajo del código
<?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>
Usar arriba dibujable para un fondo de una vista
<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"/>
Puede usar una combinación de Bitmap.extractAlpha y BlurMaskFilter para crear manualmente una sombra paralela para cualquier imagen que necesite mostrar, pero eso solo funcionaría si su imagen solo se carga / muestra de vez en cuando, ya que el proceso es costoso.
Pseudocódigo (¡incluso podría compilar!):
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);
Luego ponga shadowImage en su ImageView. Si esta imagen nunca cambia pero se muestra mucho, puede crearla y almacenarla en caché en Crear para evitar el costoso procesamiento de imagen.
Incluso si eso no funciona como está, debería ser suficiente para que vayas en la dirección correcta.
Utilice siempre una sombra transparente para que se adhieran a cualquier color.
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>
Y a la vista
<View
android:id="@+id/divider"
android:background="@drawable/shadow"
android:layout_width="match_parent"
android:layout_height="5dp"/>
Para API 21 (5.0) + agregar android:elevation="4dp"
o android:translationZ="4dp"
para ver la descripción. Documentation