27 votes

Ombre TextView détruite lors de la capture de l'image

L'ombre est détruit lors de la capture d'image de textview.

J'ai ajouté l'ombre du texte par programmation à l'aide setShadowLayer.

tv.setShadowLayer(20, 0, 0, Color.BLACK);

lorsque j'ai fait une capture d'image à l'aide de

tv.buildDrawingCache(true);
tv.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
tv.setDrawingCacheEnabled(true);

et obtenir de l'image bitmap à l'aide

bitmap = tv.getDrawingCache();

D'origine de l'Image sur l'Écran

enter image description here

L'Image Capturée

enter image description here

Aussi essayé de capturer parent mise en page, mais même résultat.

3voto

x-code Points 2714

La différence entre les deux images, c'est que l'image d'origine est produite en utilisant un LAYER_TYPE_HARDWARE de la couche. Lorsque vous définissez une ombre couche sur le texte à l'aide de ce type de couche, l'effet de flou est créé par le processeur graphique sur une texture.

Voir cet article sur la visualisation des couches pour plus de détails.

L'image capturée sur l'autre main est créé par le rendu dans une image, qui est essentiellement le même que l'utilisation de LAYER_TYPE_SOFTWARE. Depuis le flou n'est plus créé par le processeur graphique, il n'y a aucune garantie qu'il aura le même aspect.

Vous pouvez expérimenter avec elle. Ajouter le code pour forcer le rendu du logiciel:

tv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
tv.setShadowLayer(20, 0, 0, Color.BLACK);

Après cela, les deux images se ressemblent.

Si vous souhaitez à la fois des images à regarder de plus comme l'original de votre image avec le matériel de flou, vous pouvez ajuster le rayon de flou:

tv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
tv.setShadowLayer(8, 0, 0, Color.BLACK);

Si vous souhaitez obtenir des résultats exactement comme l'original, par la capture d'une image bitmap d'un matériel de rendu de l'image, il doit être possible mais je ne sais pas d'une manière facile. Vous pourriez avoir à réécrire l'application en utilisant OpenGL pour obtenir l'accès à la sous-jacentes graphiques tampons.

1voto

Piyush Gupta Points 12674

Après avoir créé le bitmap, appelez ceci

 tv.setDrawingCacheEnabled(false);
 

après ça

 bitmap = tv.getDrawingCache();
 

1voto

prakash ubhadiya Points 732

essayez ce code, il enregistre ce qui apparaît réellement à l'écran.

 Bitmap bitmap = Bitmap.createBitmap(textView.getWidth(), textView.getHeight(), Config.ARGB_8888);
            Canvas canvas = new Canvas(bitmap);
            textView.draw(canvas);
            FileOutputStream var5;
            try {
                var5 = new FileOutputStream(new File(Environment.getExternalStorageDirectory(),"temp.png"));
                bitmap.compress(CompressFormat.PNG, 100, var5);
                var5.flush();
                var5.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
 

J'ai testé avec succès.

0voto

Capturez l'écran en bitmap puis enregistrez-le.

 View screen = getWindow().getDecorView().getRootView();
screen.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(screen.getDrawingCache());
screen.setDrawingCacheEnabled(false);
 

0voto

MKJParekh Points 18108
  1. Activer les accélérations Android HW (en ajoutant au manifeste android:hardwareAccelerated="true" )
  2. Définissez une vue sur le type de calque LAYER_TYPE_SOFTWARE view.setLayerType(View.LAYER_TYPE_SOFTWARE,null) .

Essayez avec ces deux choses.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X