Blur sólo Blurs Imágenes no Texto ore something else

Tengo un BlurActionBarDrawerToggle para desenfocar mi fondo cuando abro el cajón de navegación:

 public class BlurActionBarDrawerToggle extends ActionBarDrawerToggle { public static int DEFAULT_BLUR_RADIUS = 25; public static float DEFAULT_DOWNSCALEFACTOR = 8.0f; private Context context = null; private DrawerLayout drawerLayout = null; private ImageView blurredImageView = null; private int blurRadius = DEFAULT_BLUR_RADIUS; private float downScaleFactor = DEFAULT_DOWNSCALEFACTOR; private boolean prepareToRender = true; private boolean isOpening = false; public BlurActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, int openDrawerContentDescRes, int closeDrawerContentDescRes) { super(activity, drawerLayout, openDrawerContentDescRes, closeDrawerContentDescRes); this.context = activity.getBaseContext(); this.drawerLayout = drawerLayout; this.init(); } public BlurActionBarDrawerToggle(Activity activity, DrawerLayout drawerLayout, Toolbar toolbar, int openDrawerContentDescRes, int closeDrawerContentDescRes) { super(activity, drawerLayout, toolbar, openDrawerContentDescRes, closeDrawerContentDescRes); this.context = activity.getBaseContext(); this.drawerLayout = drawerLayout; this.init(); } private void init() { this.blurredImageView = new ImageView(context); this.blurredImageView.setLayoutParams(new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); this.blurredImageView.setClickable(false); this.blurredImageView.setVisibility(View.GONE); this.blurredImageView.setScaleType(ImageView.ScaleType.FIT_XY); this.drawerLayout.setScrimColor(this.context.getResources().getColor(android.R.color.transparent)); this.drawerLayout.post(new Runnable() { @Override public void run() { drawerLayout.addView(blurredImageView, 1); } }); } @Override public void onDrawerSlide(final View drawerView, final float slideOffset) { super.onDrawerSlide(drawerView, slideOffset); if (slideOffset == 0.f) { this.isOpening = false; } else { this.isOpening = true; } this.render(); this.setAlpha(this.blurredImageView, slideOffset, 100); } @Override public void onDrawerClosed(View view) { this.prepareToRender = true; this.blurredImageView.setVisibility(View.GONE); } @Override public void onDrawerStateChanged(int newState) { super.onDrawerStateChanged(newState); if (newState == DrawerLayout.STATE_IDLE && !this.isOpening) { this.handleRecycle(); } } private void render() { if (this.prepareToRender) { this.prepareToRender = false; Bitmap bitmap = loadBitmapFromView(this.drawerLayout); bitmap = scaleBitmap(bitmap); bitmap = Blur.fastblur(this.context, bitmap, this.blurRadius, false); this.blurredImageView.setVisibility(View.VISIBLE); this.blurredImageView.setImageBitmap(bitmap); } } public void setRadius(int radius) { this.blurRadius = radius < 1 ? 1 : radius; } public void setDownScaleFactor(float downScaleFactor) { this.downScaleFactor = downScaleFactor < 1 ? 1 : downScaleFactor; } private void setAlpha(View view, float alpha, long durationMillis) { final AlphaAnimation animation = new AlphaAnimation(alpha, alpha); animation.setDuration(durationMillis); animation.setFillAfter(true); view.startAnimation(animation); } private Bitmap loadBitmapFromView(View view) { Bitmap bitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); view.draw(canvas); return bitmap; } private Bitmap scaleBitmap(Bitmap myBitmap) { int width = (int) (myBitmap.getWidth() / this.downScaleFactor); int height = (int) (myBitmap.getHeight() / this.downScaleFactor); return Bitmap.createScaledBitmap(myBitmap, width, height, false); } private void handleRecycle() { Drawable drawable = this.blurredImageView.getDrawable(); if (drawable instanceof BitmapDrawable) { BitmapDrawable bitmapDrawable = ((BitmapDrawable) drawable); Bitmap bitmap = bitmapDrawable.getBitmap(); if (bitmap != null) { bitmap.recycle(); } this.blurredImageView.setImageBitmap(null); } this.prepareToRender = true; } } 

Con este método Blur :

 public class Blur { public static Bitmap fastblur(Context context, Bitmap sentBitmap, int radius, boolean canReuseInBitmap) { Bitmap bitmap = sentBitmap.copy(sentBitmap.getConfig(), true); final RenderScript renderScript = RenderScript.create(context); final Allocation input = Allocation.createFromBitmap(renderScript, sentBitmap, Allocation.MipmapControl.MIPMAP_NONE, Allocation.USAGE_SCRIPT); final Allocation output = Allocation.createTyped(renderScript, input.getType()); final ScriptIntrinsicBlur script = ScriptIntrinsicBlur.create(renderScript, Element.U8_4(renderScript)); script.setRadius(radius); script.setInput(input); script.forEach(output); output.copyTo(bitmap); return bitmap; } } 

Desafortunadamente esto es solamente bluring vistas con imágenes como imágenes de fondo. La siguiente foto muestra el bluring de una vista con una imagen de fondo:

Introduzca aquí la descripción de la imagen

La segunda imagen muestra el mismo cajón de navegación y actionbardrawerggigle en una vista sin ninguna imagen:

Introduzca aquí la descripción de la imagen

Como se puede ver nada se blured aquí. ¿Puede alguien decirme qué está saliendo mal aquí?

One Solution collect form web for “Blur sólo Blurs Imágenes no Texto ore something else”

Esto es en realidad una combinación de tres factores:

  1. Antes de borrosa, la imagen se reduce la escala (por un factor de 8 por defecto). Esto significa que los textos, que son muy finos, se reducen a un tamaño muy pequeño
  2. El desdibujamiento entonces "dispersa" estos pocos píxeles de color en un área mucho más grande (factor es 25), lo que significa que el texto borroso es casi imperceptible .
  3. El fondo de ImageView es transparente, por lo tanto, el TextView "real" todavía está visible detrás de la imagen borrosa (que es principalmente transparente en esa área, debido a 1 y 2).

La solución más fácil es establecer un color de fondo para el blurredImageView , utilizando el mismo valor que el color de fondo de la actividad. Sin otros cambios, esto significa que los otros elementos de la interfaz de usuario (textos, líneas, & c) se ocultarán. Por ejemplo, en render() :

 this.blurredImageView.setVisibility(View.VISIBLE); this.blurredImageView.setImageBitmap(bitmap); this.blurredImageView.setBackgroundColor(Color.RED); // added 

Si desea hacerlos borrosos, pero todavía débilmente visibles, reduzca el factor de reducción de escala y el radio, por ejemplo:

 mDrawerToggle.setDownScaleFactor(2); mDrawerToggle.setRadius(10); 

Sin embargo, tenga en cuenta que esto reducirá el desenfoque de las imágenes también (así como consumir más memoria para el mapa de bits).

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.