2016-02-02 3 views
3

je besoin d'aide pour la mise en œuvre d'une solution de flou afin d'atteindre les objectifs suivants:Android flou contenu dynamique/défilement

  1. J'ai un ScrollView correspondant à l'ensemble de l'activité, avec un contenu dynamique: le contenu peut être ajouté, d'animation, supprimé, etc.
  2. J'ai un en-tête cache le contenu comme il se défilée loin par le haut de l'écran

Ce tête est en fait celui censé brouiller le contenu qui passe sous et puis disparaissent hors de l'écran. J'ai essayé d'utiliser de nombreuses librairies telles que Stackblur, paveldudka's blurring et enfin 500px own library.

Certains d'entre eux ont échoué (soit aucun flou, soit le résultat attendu) et j'essaie toujours de savoir pourquoi ... Tous utilisent la même technologie Android RenderScript Library.

Le problème principal est que ces bibliothèques fournissent un rendu unique. Signification, leur flou une fois et c'est tout. C'est parfait pour un arrière-plan/contenu fixe.

bibliothèque 500px est le plus proche de ce que je cherche:

  1. leur démo présente un écran avec des images animées et un carré flou au milieu;
  2. si lesdites images passe sous ledit carré flou, ils se brouillent, dynamiquement

En regardant le code, le flou est de nouveau rendu dans un procédé de mise à jour de l'auditeur d'animation. C'est très coûteux et je me demande si c'est le chemin à parcourir.

+0

il est probablement pas assez efficace pour flouter dynamiquement l'interface utilisateur pendant l'animation comme le défilement. et quand je dis «efficace», je veux dire la performance sage. Quoi qu'il en soit, essayez ce lib: https://github.com/wasabeef/Blurry – gilgil28

+0

Merci, mais il semble que cette bibliothèque est une solution facile à utiliser pour flouter les images. Encore une fois, parfait pour un contenu fixe. Pas moyen de l'utiliser dans un ScrollView. Comme vous le dites, je crois que ce n'est pas un moyen d'accomplir ce que je cherche. Je devrais avoir bitmapdrawable tiré d'un rectangle de la taille de l'en-tête qui capture le contenu au-dessous de l'en-tête, le brouiller et le mettre à l'arrière-plan de l'en-tête. Et dans mon cas, je devrais faire cela chaque fois que l'utilisateur fait défiler ... – Mackovich

+0

une autre option est d'imiter le sentiment d'une image floue, quelque chose avec des couches semi-transparentes. Si votre vue qui doit être floue est assez similaire en termes de couleurs, vous pouvez produire une image floue et en utiliser une couche semi-transparente. – gilgil28

Répondre

0

au cas où vous havn't trouvé une solution suffisante, j'ajoute que je Flou mon écran, ce qui est censé être le moyen le plus rapide le plus efficace de le faire avec RS:

private static final float BITMAP_SCALE = 0.05f; 
private static final float BLUR_RADIUS = 8.0f; 

    private Bitmap blurImage (Bitmap input) { 
     if (input == null){ 
      return null; 
     } 

     int width = Math.round(input.getWidth() * BITMAP_SCALE); 
     int height = Math.round(input.getHeight() * BITMAP_SCALE); 

     Bitmap inputBitmap = Bitmap.createScaledBitmap(input, width, height, false); 
     Bitmap outputBitmap = Bitmap.createBitmap(inputBitmap); 

     ScriptIntrinsicBlur theIntrinsic = null; 

     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; 
    } 
+0

merci pour votre super contribution mais malheureusement j'ai déjà essayé des techniques très similaires à plusieurs reprises. Votre solution est la bonne façon de flouter n'importe quel contenu, mais pas à la volée comme j'essaye de le faire. Merci quand même! – Mackovich