155 votes

Convertir une vue en Bitmap sans l'afficher dans Android ?

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

J'ai 3 écrans distincts appelés A,B,C. Il y a un autre écran appelé HomeScreen où tous les 3 écrans bitmap doivent être affichés dans la vue Galerie et l'utilisateur peut sélectionner dans quelle vue il veut aller.

J'ai réussi à obtenir les Bitmaps des 3 écrans et à les afficher dans la vue Galerie en plaçant tout le code dans l'activité HomeScreen uniquement. Maintenant, cela a beaucoup compliqué le code et je voudrais le simplifier.

Puis-je appeler une autre activité à partir de l'écran d'accueil, ne pas l'afficher et obtenir simplement le bitmap de cet écran ? Par exemple, disons que je viens d'appeler HomeScreen et qu'il appelle l'activité A,B,C et qu'aucune des activités de A,B,C n'est affichée. On obtient simplement le bitmap de cet écran par getDrawingCache(). Ensuite, nous pouvons afficher ces bitmaps dans la vue Galerie de l'écran d'accueil.

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

Veuillez me faire savoir si cela est réellement possible.

1 votes

Je ne suis pas tout à fait sûr, mais je pense que vous ne pourrez pas le faire. Le problème est que les activités sont destinées à être affichées à l'utilisateur. Vous pouvez lancer l'activité puis la masquer immédiatement, mais l'activité sera toujours visible pour l'utilisateur pendant une fraction de seconde. Elle est affichée suffisamment longtemps pour être remarquée. Le fait que l'écran scintille plusieurs fois donne à l'application un aspect peu professionnel. Cependant, il est possible qu'il existe une commande permettant de démarrer une activité sans l'afficher ; je ne connais pas cette commande si elle existe.

6 votes

En fait, j'ai pu le faire.

0 votes

Oh, comment pouvez-vous appeler cette activité mais ne pas la montrer ? Puis-je prendre la mise en page de l'activité actuelle comme modèle pour générer des bitmaps tout en lui fournissant un contenu différent ?

5voto

Shyam Kumar Points 291

Mise en page ou vue en bitmap :

 private Bitmap createBitmapFromLayout(View tv) {      
    int spec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
    tv.measure(spec, spec);
    tv.layout(0, 0, tv.getMeasuredWidth(), tv.getMeasuredHeight());
    Bitmap b = Bitmap.createBitmap(tv.getMeasuredWidth(), tv.getMeasuredWidth(),
            Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);
    c.translate((-tv.getScrollX()), (-tv.getScrollY()));
    tv.draw(c);
    return b;
}

Méthode d'appel :

Bitmap src = createBitmapFromLayout(View.inflate(this, R.layout.sample, null)/* or pass your view object*/);

4voto

android developer Points 20939

Je pense que c'est un peu mieux :

/**
 * draws the view's content to a bitmap. code initially based on :
 * http://nadavfima.com/android-snippet-inflate-a-layout-draw-to-a-bitmap/
 */
@Nullable
public static Bitmap drawToBitmap(final View viewToDrawFrom, int width, int height) {
    boolean wasDrawingCacheEnabled = viewToDrawFrom.isDrawingCacheEnabled();
    if (!wasDrawingCacheEnabled)
        viewToDrawFrom.setDrawingCacheEnabled(true);
    if (width <= 0 || height <= 0) {
        if (viewToDrawFrom.getWidth() <= 0 || viewToDrawFrom.getHeight() <= 0) {
            viewToDrawFrom.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            width = viewToDrawFrom.getMeasuredWidth();
            height = viewToDrawFrom.getMeasuredHeight();
        }
        if (width <= 0 || height <= 0) {
            final Bitmap bmp = viewToDrawFrom.getDrawingCache();
            final Bitmap result = bmp == null ? null : Bitmap.createBitmap(bmp);
            if (!wasDrawingCacheEnabled)
                viewToDrawFrom.setDrawingCacheEnabled(false);
            return result;
        }
        viewToDrawFrom.layout(0, 0, width, height);
    } else {
        viewToDrawFrom.measure(MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY));
        viewToDrawFrom.layout(0, 0, viewToDrawFrom.getMeasuredWidth(), viewToDrawFrom.getMeasuredHeight());
    }
    final Bitmap drawingCache = viewToDrawFrom.getDrawingCache();
    final Bitmap bmp = ThumbnailUtils.extractThumbnail(drawingCache, width, height);
    final Bitmap result = bmp == null || bmp != drawingCache ? bmp : Bitmap.createBitmap(bmp);
    if (!wasDrawingCacheEnabled)
        viewToDrawFrom.setDrawingCacheEnabled(false);
    return result;
}

En utilisant le code ci-dessus, vous n'avez pas besoin de spécifier la taille du bitmap (utilisez 0 pour la largeur et la hauteur) si vous voulez utiliser celle de la vue elle-même.

De même, si vous souhaitez convertir des vues spéciales (SurfaceView, Surface ou Window, par exemple) en bitmap, vous devriez envisager d'utiliser la méthode suivante PixelCopy à la place. Il faut cependant avoir l'API 24 et plus. Je ne sais pas comment le faire avant.

0 votes

Aucune idée, aucun TextView n'est ajouté dans le bitmap. Seules les ImageViews sont ajoutées.

0 votes

@Khemraj Je ne comprends pas la question.

0 votes

C'était ma faute si mon TextView n'était pas présent dans le bitmap. Parce que j'avais un thème de couleur claire appliqué, merci pour la réponse.

2voto

Akhilesh Kumar Points 394

J'espère que cela vous aidera

View view="some view instance";        
view.setDrawingCacheEnabled(true);
Bitmap bitmap=view.getDrawingCache();
view.setDrawingCacheEnabled(false);

Mise à jour
getDrawingCache() est dépréciée au niveau 28 de l'API. Cherchez donc une autre alternative pour les niveaux d'API > 28.

2 votes

getDrawingCache est actuellement déprécié.

1voto

Azhagthott Points 357

Je l'ai utilisé il y a quelques jours :

fun generateBitmapFromView(view: View): Bitmap {
    val specWidth = View.MeasureSpec.makeMeasureSpec(1324, View.MeasureSpec.AT_MOST)
    val specHeight = View.MeasureSpec.makeMeasureSpec(521, View.MeasureSpec.AT_MOST)
    view.measure(specWidth, specHeight)
    val width = view.measuredWidth
    val height = view.measuredHeight
    val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
    val canvas = Canvas(bitmap)
    view.layout(view.left, view.top, view.right, view.bottom)
    view.draw(canvas)
    return bitmap
}

Ce code est basé sur ce Gist

0voto

Kuldeep Rathod Points 1
private fun getBitmapFromView(view: View): Bitmap
{
    val returnedBitmap = Bitmap.createBitmap(view.width,
        view.height
    ,Bitmap.Config.ARGB_8888)

    val canvas = Canvas(returnedBitmap)

    //background image
    val bgDrawable = view.background

    //background image is selected
    if (bgDrawable != null){
        bgDrawable.draw(canvas)
    }
    else{
        canvas.drawColor(Color.WHITE)
    }

    view.draw(canvas)

    return returnedBitmap

}

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