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.

Gábor
la source
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.

Konstantin Burov
la source
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);
AzizAhmad
la source
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);
34m0
la source
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);

        }
Rohit Mandiwal
la source
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);

    }

}
user1140237
la source