Je vais essayer d'expliquer exactement ce que je dois faire.
J'ai 3 écrans séparé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 pu obtenir les bitmaps de tous les 3 écrans et les afficher dans la vue Galerie en plaçant tout le code dans l'activité de l'écran d'accueil uniquement. Maintenant, cela a beaucoup compliqué le code et j'aimerais le simplifier.
Alors, puis-je appeler une autre activité à partir de HomeScreen et ne pas l'afficher et simplement obtenir le Bitmap de cet écran. Par exemple, disons que j'appelle juste HomeScreen et qu'il appelle l'activité A, B, C et qu'aucune des activités de A, B, C ne s'affiche. Il donne juste le Bitmap de cet écran par getDrawingCache (). Et puis nous pouvons afficher ces bitmaps dans la vue Galerie dans HomeScreen.
J'espère avoir expliqué le problème très clairement.
Veuillez me faire savoir si cela est réellement possible.
Réponses:
il existe un moyen de le faire. vous devez créer un Bitmap et un Canvas et appeler view.draw (canvas);
voici le code:
si la vue n'était pas affichée avant, sa taille sera égale à zéro. Il est possible de le mesurer comme ceci:
EDIT: selon cet article , passer
WRAP_CONTENT
comme valeur àmakeMeasureSpec()
ne sert à rien (bien que pour certaines classes de vue, cela fonctionne), et la méthode recommandée est:la source
v.layout(v.getLeft(), v.getTop(), v.getRight(), v.getBottom());
que cela fonctionne correctement, mais merci pour le code :)v.measure(0, 0); v.getMeasuredWidth(); v.getMeasuredHeight();
.Bitmap b = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
Fonctionne mieuxvoici ma solution:
Prendre plaisir :)
la source
Essaye ça,
la source
Je sais que c'est peut-être un problème obsolète, mais j'avais des problèmes pour que l'une de ces solutions fonctionne pour moi. Plus précisément, j'ai constaté que si des modifications étaient apportées à la vue après son augmentation, ces modifications ne seraient pas incorporées dans le bitmap rendu.
Voici la méthode qui a fonctionné pour mon cas. Avec une mise en garde, cependant. avant d'appeler,
getViewBitmap(View)
j'ai gonflé ma vue et lui ai demandé de mettre en page avec des dimensions connues. Cela était nécessaire car ma disposition de vue en ferait une hauteur / largeur nulle jusqu'à ce que le contenu soit placé à l'intérieur.La "sauce magique" pour moi a été trouvée ici: https://groups.google.com/forum/#!topic/android-developers/BxIBAOeTA1Q
À votre santé,
Levi
la source
measure()
etlayout()
avant de peupler ma vue, j'avais donc des résultats étranges. Déplacer ces appels vers le bas, ci-dessus l'acreateBitmap()
corrigé pour moi!Il existe une excellente fonction d'extension Kotlin dans Android KTX:
View.drawToBitmap(Bitmap.Config)
la source
J'espère que cela t'aides
La
getDrawingCache()
méthode de mise à jour est obsolète au niveau de l'API 28. Recherchez donc une autre alternative pour le niveau d'API> 28.la source
getDrawingCache
est actuellement obsolète.Disposition ou vue en bitmap:
Méthode d'appel:
la source
Je pense que c'est un peu mieux:
En utilisant le code ci-dessus, vous n'avez pas à spécifier la taille du bitmap (utilisez 0 pour la largeur et la hauteur) si vous souhaitez utiliser celle de la vue elle-même.
De plus, si vous souhaitez convertir des vues spéciales (SurfaceView, Surface ou Window, par exemple) en bitmap, vous devez envisager d'utiliser la classe PixelCopy à la place. Cependant, il nécessite l'API 24 et plus. Je ne sais pas comment le faire avant.
la source
la source