117 votes

Image dessinable sur une toile

Comment obtenir une image sur le canevas afin de pouvoir dessiner sur cette image ?

212voto

Gábor Points 424

La bonne façon de dessiner un Drawable sur un canevas n'est pas de le décoder soi-même mais de laisser au système le soin de le faire :

Drawable d = getResources().getDrawable(R.drawable.foobar, null);
d.setBounds(left, top, right, bottom);
d.draw(canvas);

Cela fonctionnera avec tous les types de dessinables, pas seulement les bitmaps. Et cela signifie également que vous pouvez réutiliser le même tableau si seule la taille change.

0 votes

Comment utiliser une liste d'animation (plusieurs images) pour l'animation avec l'approche du canevas ?

1 votes

Très utile ! Au moins quand vous avez besoin d'une image d'arrière-plan sans avoir à faire appel à la science.

0 votes

@RichieHH J'ai mon arrière-plan sur une SurfaceView (probablement un gaspillage) et cette vue de surface est intégrée dans un Framelayout et ce framelayout contient des ImageViews que j'anime ensuite - peut-être est-ce une option pour vous ?

40voto

Konstantin Burov Points 34011

Vous devez charger votre image en tant que bitmap :

 Resources res = getResources();
 Bitmap bitmap = BitmapFactory.decodeResource(res, R.drawable.your_image);

Ensuite, rendez le bitmap mutable et créez un canevas par-dessus :

Canvas canvas = new Canvas(bitmap.copy(Bitmap.Config.ARGB_8888, true));

Vous pouvez alors dessiner sur la toile.

0 votes

Que faire si mon .png est grand et qu'il est coupé après avoir été chargé ? c'est-à-dire que je ne veux pas qu'il soit coupé. Il peut être plus grand que l'écran, alors je vais essayer de le rendre zoomable et déplaçable. Comment puis-je faire cela ? Merci beaucoup !

1 votes

@perfectionm1ng regardez si vous pouvez utiliser BitmapRegionDecoder. Il permet un chargement partiel pour les grandes images. Vous devriez donc être en mesure de charger uniquement la partie de l'image dont vous effectuez le rendu en ce moment.

0 votes

J'ai le même problème J'utilise le code Canvas cs = new Canvas(bitmap) ; Resources res = getResources() ; Bitmap bitmapx = BitmapFactory.decodeResource(res, R.drawable. overlay_good_full) ; Bitmap bitmapxx = BitmapFactory.decodeResource(res, R.drawable.overlay_bad_full) ; if(text.equals("Good")) { cs.drawBitmap(bitmapx, 0, 0, tPaint) ; } else { cs.drawBitmap(bitmapxx, 0, 0, tPaint) ; }

16voto

AzizAhmad Points 336

Vous pouvez également utiliser cette méthode. Elle modifiera votre grand dessin pour l'adapter à votre toile :

Resources res = getResources();
Bitmap bitmap = BitmapFactory.decodeResource(res, yourDrawable);
yourCanvas.drawBitmap(bitmap, 0, 0, yourPaint);

0 votes

La classe BitmapFactory n'a pas de méthode "BitmapFactory.decodeResource(Resource, Drawable) ;"...

0 votes

@Crisic Je suppose que yourDrawable est un nombre entier.

15voto

34m0 Points 1710
Drawable d = ContextCompat.getDrawable(context, R.drawable.***)
d.setBounds(left, top, right, bottom);
d.draw(canvas);

0 votes

Je crée un Drawable avec gerResource().getDrawable(id) ;

0 votes

GetDrawable(id) est déprécié, vous devez utiliser soit l'appel ContextCompat ci-dessus, soit l'appel getDrawable(id, theme). developer.Android.com/reference/Android/content/res/

1 votes

Pour moi, il était nécessaire d'utiliser setBounds . Sans elle, rien ne s'affiche.

8voto

rohit mandiwal Points 4883

Essayez ceci

Bitmap mBitmap = Bitmap.createScaledBitmap(Bitmap src, int dstWidth, int dstHeight, boolean filter);

protected void onDraw(Canvas canvas) {
            canvas.drawColor(0xFFAAAAAA);
            canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint);

        }

0 votes

Mais si j'utilise canvas.drawBitmap(mBitmap, 0, 0, mBitmapPaint) ; cela fonctionne et charge l'image sauvegardée sur le canvas, mais en même temps undo et redo ne fonctionnent plus, Vérifiez mon code pastebin.com/cP9w6stm

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