Quelqu'un voudrait-il essayer de m'expliquer pourquoi
public void addView(View child) {
child.setDrawingCacheEnabled(true);
child.setWillNotCacheDrawing(false);
child.setWillNotDraw(false);
child.buildDrawingCache();
if(child.getDrawingCache() == null) { //TODO Make this work!
Log.w("View", "View child's drawing cache is null");
}
setImageBitmap(child.getDrawingCache()); //TODO MAKE THIS WORK!!!
}
Journalise TOUJOURS que le cache de dessin est null et définit le bitmap sur null?
Dois-je réellement dessiner la vue avant que le cache ne soit défini?
Merci!
J'avais aussi ce problème et j'ai trouvé cette réponse:
v.setDrawingCacheEnabled(true);
// this is the important code :)
// Without it the view will have a dimension of 0,0 and the bitmap will be null
v.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
v.layout(0, 0, v.getMeasuredWidth(), v.getMeasuredHeight());
v.buildDrawingCache(true);
Bitmap b = Bitmap.createBitmap(v.getDrawingCache());
v.setDrawingCacheEnabled(false); // clear drawing cache
si getDrawingCache
est toujours returning null
les gars: utilisez ceci:
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(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
return b;
}
Référence: https://stackoverflow.com/a/6272951/371749
La raison fondamentale pour laquelle on obtient des valeurs nulles est que la vue n'est pas divisée. Toutes les tentatives effectuées avec view.getWidth (), view.getLayoutParams (). Width, etc., y compris view.getDrawingCache () et view.buildDrawingCache () sont alors inutiles. Par conséquent, vous devez d’abord définir les dimensions de la vue, par exemple:
view.layout(0, 0, width, height);
(Vous avez déjà défini les options 'width' et 'height' à votre guise ou obtenues avec WindowManager, etc.)
Je l'utilise plutôt.
myView.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
public void onGlobalLayout() {
Bitmap bitmap = Bitmap.createBitmap(myView.getDrawingCache());
}
});
Fonctionne mieux 4me
Bitmap bitmap = Bitmap.createBitmap( screen.getMeasuredWidth(), screen.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
screen.layout(0, 0, screen.getMeasuredWidth(), screen.getMeasuredHeight());
screen.draw(canvas);
Si la vue que vous voulez capturer s'affiche vraiment à l'écran, mais renvoie null. Cela signifie que vous attrapez la vue avant que le gestionnaire de fenêtres ne la génère. Certaines mises en page sont très compliquées. Si la mise en page comprend des mises en page imbriquées, layout_weight..etc, la répétition de plusieurs fois par relais prend exactement la taille voulue. La meilleure solution est d'attendre la fin du travail du gestionnaire de fenêtres, puis de faire une capture d'écran. Essayez de mettre getDrawingCache () dans le gestionnaire.
Les réponses de @ cV2 et @ nininho fonctionnent toutes les deux pour moi.
L’une des autres raisons pour lesquelles j’ai découvert la difficulté, c’est que la vue que j’avais générée était en train de générer une vue dont la largeur et la hauteur étaient égales à 0 (imaginons qu’il y ait TextView avec un texte de chaîne vide) =). Dans ce cas, getDrawingCache retournera null, alors assurez-vous de vérifier cela. J'espère que cela aide certaines personnes.
L'erreur peut être due à votre vue trop grande pour tenir dans le cache de dessin .
J'ai eu l'explication de mon problème "View.getDrawingCache null" de mes journaux:
W/View: View too large to fit into drawing cache, needs 19324704 bytes, only 16384000 available
Les documents Android aussi dit : Les appareils Android ne peuvent disposer que de 16 Mo de mémoire disponible pour une seule application. C'est pourquoi vous ne pouvez pas charger de gros bitmap.
J'essaie de créer le nombre n d'images de manière dynamique en fonction de la vue.
LayoutInflater infalter=(LayoutInflater)getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View addview=infalter.inflate(R.layout.barcode_image_list_row_item, null);
final ImageView imv=(ImageView) addview.findViewById(R.id.imageView1);
final TextView tv=(TextView) addview.findViewById(R.id.textView1);
try {
final Bitmap bitmap = encodeAsBitmap(""+value, BarcodeFormat.CODE_128, 600, 300);
if(bitmap !=null){
// TODO Auto-generated method stub
imv.setImageBitmap(bitmap);
tv.setText(value);
addview.setDrawingCacheEnabled(true);
// this is the important code :)
// Without it the view will have a dimension of 0,0 and the bitmap will be null
addview.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
addview.layout(0, 0, addview.getMeasuredWidth(), addview.getMeasuredHeight());
addview.buildDrawingCache(true);
Bitmap b = Bitmap.createBitmap(addview.getDrawingCache());
addview.setDrawingCacheEnabled(false); // clear drawing cache
// saving the bitmap
savebarcode(b,value);
}else{
}
} catch (WriterException e) {
e.printStackTrace();
}
Je pense que ce code aidera quelqu'un ..