Image dessinable sur une toile


Réponses:


178

Le bon moyen de dessiner un Drawable sur un canevas n'est pas de le décoder vous-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 toutes sortes de dessinables, pas seulement des bitmaps. Et cela signifie également que vous pouvez réutiliser ce même dessinable à nouveau si seule la taille change.


Comment utiliser une liste d'animation (plusieurs cadres) pour l'animation avec l'approche canvas?
RichieHH

1
Très utile! Au moins quand vous avez besoin juste d'une image d'arrière-plan sans science de fusée impliquée!
Asim

@RichieHH J'ai mon expérience sur un 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 que c'est une option pour vous?
AgentKnopf

4
getDrawable (id) est obsolète, vous devez soit utiliser l'appel ContextCompat ci-dessus, soit l'appel getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko

@Saveen: Êtes-vous sûr? Autant que je me souvienne, cela est censé fonctionner à partir des premières versions d'Android.
Gábor

38

Vous devez charger votre image sous forme de bitmap:

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

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

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

Vous pouvez ensuite dessiner sur la toile.


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

1
@ perfectionm1ng regarde l'utilisation de BitmapRegionDecoder. Il permet un chargement partiel pour les grandes images. Vous ne devriez donc pouvoir charger que la partie de l'image que vous rendez pour le moment.
Konstantin Burov

J'ai le même problème que j'utilise le code Canvas cs = new Canvas (bitmap); Ressources 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 ("Bon")) {cs.drawBitmap (bitmapx, 0, 0, tPaint); } else {cs.drawBitmap (bitmapxx, 0, 0, tPaint); }
Ahmad Arslan

Comment la création d'un objet canevas dessine-t-elle sur le canevas de onDraw?
Siddarth G le

13

vous pouvez également utiliser cette façon. cela changera votre grand ajustement à votre toile:

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

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

@ Crisic Je suppose que yourDrawablec'est un entier.

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

Je crée Drawable avec gerResource (). GetDrawable (id);
Vikram

getDrawable (id) est obsolète, vous devez soit utiliser l'appel ContextCompat ci-dessus, soit l'appel getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko

1
Pour moi, il fallait utiliser setBounds. Sans cela, rien ne s'est affiché.

8

essaye ça

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);

        }

Mais si j'utilise canvas.drawBitmap (mBitmap, 0, 0, mBitmapPaint); cela fonctionne et il charge l'image enregistrée sur la toile, mais en même temps, annuler et refaire cesser de fonctionner, vérifiez mon code pastebin.com/cP9w6stm
AndroidDev

2
package com.android.jigsawtest;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class SurafaceClass extends SurfaceView implements
        SurfaceHolder.Callback {
    Bitmap mBitmap;
Paint paint =new Paint();
    public SurafaceClass(Context context) {
        super(context);
        mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.icon);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        // TODO Auto-generated method stub

    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        // TODO Auto-generated method stub

    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.drawColor(Color.BLACK);
        canvas.drawBitmap(mBitmap, 0, 0, paint);

    }

}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.