Vous pouvez utiliser mon concept si vous voulez, que j'ai utilisé dans AlertDialog avec fond flou au centre de la position
Mon approche
- Faites une capture d'écran
- Animation programmée d'une capture d'écran de type "dim/blur".
- Obtenir la fenêtre actuelle en utilisant un dialogue qui n'a pas de contenu.
- Joindre une capture d'écran avec effet
- Afficher la vue réelle que je voulais afficher
Ici, j'ai une classe pour prendre une image de l'arrière-plan comme un bitmap.
public class AppUtils {
public static Bitmap takeScreenShot(Activity activity) {
View view = activity.getWindow().getDecorView();
view.setDrawingCacheEnabled(true);
view.buildDrawingCache();
Bitmap b1 = view.getDrawingCache();
Rect frame = new Rect();
activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame);
int statusBarHeight = frame.top;
Display display = activity.getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x;
int height = size.y;
Bitmap b = Bitmap.createBitmap(b1, 0, statusBarHeight, width, height - statusBarHeight);
view.destroyDrawingCache();
return b;
}
}
Félicitations, vous avez maintenant une image d'obscurcissement/de réduction identique à votre arrière-plan.
Alors votre exigence est de ne pas faire de flou comme moi, vous pouvez donc passer ce bitmap à la méthode ci-dessous,
public static Bitmap changeBitmapContrastBrightness(Bitmap bmp, float contrast, float brightness) {
ColorMatrix cm = new ColorMatrix(new float[]
{
contrast, 0, 0, 0, brightness,
0, contrast, 0, 0, brightness,
0, 0, contrast, 0, brightness,
0, 0, 0, 1, 0
});
Bitmap ret = Bitmap.createBitmap(bmp.getWidth(), bmp.getHeight(), bmp.getConfig());
Canvas canvas = new Canvas(ret);
Paint paint = new Paint();
paint.setColorFilter(new ColorMatrixColorFilter(cm));
canvas.drawBitmap(bmp, 0, 0, paint);
return ret;
}
Maintenant, utilisez un faux dialogue / un dialogue sans arrière-plan/contenu uniquement pour obtenir la fenêtre (vérifiez la mise en œuvre de mes questions, vous pouvez comprendre cela).
Window window = fakeDialogUseToGetWindowForBlurEffect.getWindow();
window.setBackgroundDrawable(draw); // draw is bitmap that you created
Dans mon cas, j'affiche une alerte, vous pouvez afficher ce que vous voulez et n'oubliez pas de supprimer cette alerte lorsque votre vue réelle disparaît de l'écran !
Sortie rapide (l'arrière-plan peut être personnalisé comme vous le souhaitez, et pas seulement en fonction de la luminosité).
0 votes
Pourquoi devez-vous utiliser
BottomSheetBehavior
?3 votes
J'ai eu le même problème. Pour moi, la raison d'utiliser
BottomSheet
yBottomSheetBehavior
au lieu deBottomSheetDialog(Fragment)
est que leBottomSheet
joue bien quand on montre le clavier. Utilisation deBottomSheetDialogFragment
provoque des animations bizarres. Lorsque vous affichez le clavier, le DialogFragment s'adapte simplement à sa nouvelle position. BottomSheet s'anime doucement de haut en bas.1 votes
Il y a une gradation de fond sans fragment hidroh.com/2016/06/17/bottom-sheet-everything (en anglais)