android - studio - Crear un efecto de fondo transparente y borroso
fondo borroso en fotos app (3)
Ahora que la bandera de la ventana está en desuso, debes desdibujarte. Respondí esto en otro lugar, pero aquí es cómo puedes difuminar una vista:
Ahora puede usar ScriptIntrinsicBlur de la biblioteca de RenderScript para difuminar rápidamente. Here es cómo acceder a la API de RenderScript. La siguiente es una clase que hice para difuminar vistas y mapas de bits:
import android.support.v8.renderscript.*;
public class BlurBuilder {
private static final float BITMAP_SCALE = 0.4f;
private static final float BLUR_RADIUS = 7.5f;
public static Bitmap blur(View v) {
return blur(v.getContext(), getScreenshot(v));
}
public static Bitmap blur(Context ctx, Bitmap image) {
int width = Math.round(image.getWidth() * BITMAP_SCALE);
int height = Math.round(image.getHeight() * BITMAP_SCALE);
Bitmap inputBitmap = Bitmap.createScaledBitmap(image, width, height, false);
Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap);
RenderScript rs = RenderScript.create(ctx);
ScriptIntrinsicBlur theIntrinsic = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
Allocation tmpIn = Allocation.createFromBitmap(rs, inputBitmap);
Allocation tmpOut = Allocation.createFromBitmap(rs, outputBitmap);
theIntrinsic.setRadius(BLUR_RADIUS);
theIntrinsic.setInput(tmpIn);
theIntrinsic.forEach(tmpOut);
tmpOut.copyTo(outputBitmap);
return outputBitmap;
}
private static Bitmap getScreenshot(View v) {
Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.draw(c);
return b;
}
}
Para aplicar esto a un fragmento, agregue lo siguiente a onCreateView
:
final Activity activity = getActivity();
final View content = activity.findViewById(android.R.id.content).getRootView();
if (content.getWidth() > 0) {
Bitmap image = BlurBuilder.blur(content);
window.setBackgroundDrawable(new BitmapDrawable(activity.getResources(), image));
} else {
content.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Bitmap image = BlurBuilder.blur(content);
window.setBackgroundDrawable(new BitmapDrawable(activity.getResources(), image));
}
});
}
NOTA: Esta solución requiere que min sdk sea API 17
EDITAR: Renderscript está incluido en el soporte v8, habilitando esta respuesta hasta la api 8. Para habilitarlo usando gradle incluya estas líneas en su archivo gradle (de esta answer ) y use Renderscript desde el paquete android.support.v8.renderscript :
android {
...
defaultConfig {
...
renderscriptTargetApi *your target api*
renderscriptSupportModeEnabled true
}
...
}
Estoy tratando de crear una vista que tenga un fondo que no solo sea transparente, sino que también tenga un efecto de desenfoque. De esta forma, las vistas debajo parecen estar desenfocadas. Quiero que se vea como la pantalla después de mantener presionado el botón de encendido. ¿Algunas ideas?
Blurry es una buena opción que le dará fácilmente el efecto que está buscando: https://github.com/wasabeef/Blurry
después de agregarlo al proyecto, ajuste la vista que desea desenfocar en un FrameLayout, luego use esta línea cuando desee desenfocar:
Blurry.with(this).radius(25).sampling(2).onto((ViewGroup) findViewById(R.id.viewToBlurWrapper));
Si todo lo que quiere hacer es difuminar el fondo de la ventana detrás de su actividad, puede usar esta llamada desde dentro de su actividad (o cualquier clase, como un AlertDialog que tiene una ventana)
getWindow().addFlags(WindowManager.LayoutParams.FLAG_BLUR_BEHIND);
Actualización: esta bandera quedó obsoleta en Android 4.0 y ya no funciona .