Convertir une vue en Bitmap sans L'afficher sur Android?

je vais essayer d'expliquer ce que je dois faire exactement.

j'ai 3 écrans séparés dire A,B,C. Il y a un autre écran appelé HomeScreen où tous les 3 écrans bitmap devrait être affiché en vue Galerie et l'utilisateur peut choisir dans quelle vue il veut aller.

j'ai été en mesure d'obtenir les Bitmaps de tous les 3 écrans et l'afficher en vue galerie en plaçant tout le code dans L'activité D'écran D'Accueil seulement. Maintenant, cela a compliqué la code beaucoup et je voudrais le simplifier.

donc, Puis-je appeler une autre activité de HomeScreen et ne pas l'afficher et juste obtenir le Bitmap de cet écran. Par exemple,disons que j'appelle simplement un écran D'accueil et qu'il appelle L'activité A,B,C et qu'aucune des activités de A,B, C n'est affichée. Il donne juste le Bitmap de cet écran par getDrawingCache (). Et ensuite, nous pouvons afficher ces bitmaps dans la vue de la galerie à L'écran D'accueil.

j'espère avoir expliqué le problème très clairement.

dites-moi si c'est possible.

106
demandé sur Raghav Sood 2010-05-10 11:54:55

6 réponses

il y a un moyen de le faire. vous devez créer un Bitmap et une vue de la toile et de l'appel.dessin (toile);

voici le code:

public static Bitmap loadBitmapFromView(View v) {
    Bitmap b = Bitmap.createBitmap( v.getLayoutParams().width, v.getLayoutParams().height, Bitmap.Config.ARGB_8888);                
    Canvas c = new Canvas(b);
    v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
    v.draw(c);
    return b;
}

si la vue n'a pas été affichée avant sa taille sera zéro. Il est possible de le mesurer comme ceci:

if (v.getMeasuredHeight() <= 0) {
    v.measure(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
    Bitmap b = Bitmap.createBitmap(v.getMeasuredWidth(), v.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);
    v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
    v.draw(c);
    return b;
}

EDIT: selon ce post , en Passant WRAP_CONTENT comme valeur pour makeMeasureSpec() n'est pas de faire une bonne (bien que pour certaines classes de vue cela fonctionne), et la méthode recommandée est:

// Either this
int specWidth = MeasureSpec.makeMeasureSpec(parentWidth, MeasureSpec.AT_MOST);
// Or this
int specWidth = MeasureSpec.makeMeasureSpec(0 /* any */, MeasureSpec.UNSPECIFIED);
view.measure(specWidth, specWidth);
int questionWidth = view.getMeasuredWidth();
174
répondu Simon Heinen 2017-05-23 12:34:37

voici ma solution:

public static Bitmap getBitmapFromView(View view) {
    Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(),Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(returnedBitmap);
    Drawable bgDrawable =view.getBackground();
    if (bgDrawable!=null) 
        bgDrawable.draw(canvas);
    else 
        canvas.drawColor(Color.WHITE);
    view.draw(canvas);
    return returnedBitmap;
}

Enjoy:)

23
répondu Gil SH 2012-03-07 08:12:45

Essayez cette,

        /**
         * Draw the view into a bitmap.
         */
        public static Bitmap getViewBitmap(View v) {
            v.clearFocus();
            v.setPressed(false);

            boolean willNotCache = v.willNotCacheDrawing();
            v.setWillNotCacheDrawing(false);

            // Reset the drawing cache background color to fully transparent
            // for the duration of this operation
            int color = v.getDrawingCacheBackgroundColor();
            v.setDrawingCacheBackgroundColor(0);

            if (color != 0) {
                v.destroyDrawingCache();
            }
            v.buildDrawingCache();
            Bitmap cacheBitmap = v.getDrawingCache();
            if (cacheBitmap == null) {
                Log.e(TAG, "failed getViewBitmap(" + v + ")", new RuntimeException());
                return null;
            }

            Bitmap bitmap = Bitmap.createBitmap(cacheBitmap);

            // Restore the view
            v.destroyDrawingCache();
            v.setWillNotCacheDrawing(willNotCache);
            v.setDrawingCacheBackgroundColor(color);

            return bitmap;
        }
20
répondu Dwivedi Ji 2018-06-30 05:59:51

je sais qu'il s'agit peut-être d'une question périmée, mais j'avais de la difficulté à faire fonctionner l'une ou l'autre de ces solutions. Plus précisément, j'ai constaté que si des modifications étaient apportées à la vue après qu'elle ait été gonflée, ces modifications ne seraient pas intégrées dans le bitmap Rendu.

Voici la méthode qui a fini par marcher pour mon affaire. Avec un bémol toutefois. avant d'appeler getViewBitmap(View) j'ai gonflé ma vue et lui ai demandé de mettre en page avec des dimensions connues. Ceci a été nécessaire puisque ma disposition de vue ferait zéro hauteur / largeur jusqu'à ce que le contenu soit placé à l'intérieur.

View view = LayoutInflater.from(context).inflate(layoutID, null);
//Do some stuff to the view, like add an ImageView, etc.
view.layout(0, 0, width, height);

Bitmap getViewBitmap(View view)
{
    //Get the dimensions of the view so we can re-layout the view at its current size
    //and create a bitmap of the same size 
    int width = view.getWidth();
    int height = view.getHeight();

    int measuredWidth = View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY);
    int measuredHeight = View.MeasureSpec.makeMeasureSpec(height, View.MeasureSpec.EXACTLY);

    //Cause the view to re-layout
    view.measure(measuredWidth, measuredHeight);
    view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());

    //Create a bitmap backed Canvas to draw the view into
    Bitmap b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);

    //Now that the view is laid out and we have a canvas, ask the view to draw itself into the canvas
    view.draw(c);

    return b;
}

la "sauce magique" pour moi a été trouvée ici: https://groups.google.com/forum/#!topic / android-developers/BxIBAOeTA1Q

Cheers,

Levi

10
répondu levigroker 2013-10-18 18:00:35

Espérons que cette aide

View view="some view instance";        
view.setDrawingCacheEnabled(true);
Bitmap bitmap=view.getDrawingCache();
view.setDrawingCacheEnabled(false);
2
répondu Akhilesh Kumar 2015-09-09 09:00:41
view.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false);
-3
répondu Ashutosh Gupta 2018-03-30 05:58:43