Imagen dibujable en un lienzo

Respuestas:

178

La buena manera de dibujar un Drawable en un lienzo no es decodificarlo usted mismo, sino dejar que el sistema lo haga:

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

Esto funcionará con todo tipo de elementos de diseño, no solo con mapas de bits. Y también significa que puede volver a utilizar ese mismo dibujante si solo cambia el tamaño.

Gábor
fuente
¿Cómo se usa una lista de animaciones (múltiples cuadros) para la animación con el enfoque de lienzo?
RichieHH
1
¡Muy útil! ¡Al menos cuando solo necesita una imagen de fondo sin ninguna ciencia espacial involucrada!
Asim
@RichieHH Tengo mi experiencia en SurfaceView (probablemente un desperdicio) y esa vista de superficie está incrustada en un Framelayout y ese framelayout contiene ImageViews que luego animé, ¿tal vez esa sea una opción para usted?
AgentKnopf
4
getDrawable (id) está en desuso, debe usar la llamada ContextCompat anterior o la llamada getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko
@Saveen: ¿Estás seguro? Por lo que puedo recordar, se supone que esto funciona desde las primeras versiones de Android.
Gábor
38

Necesita cargar su imagen como mapa de bits:

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

Luego, haga que el mapa de bits sea mutable y cree un lienzo sobre él:

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

Luego puede dibujar en el lienzo.

Konstantin Burov
fuente
¿Qué pasa si mi .png es grande y se corta después de cargarlo? es decir, no quiero que lo recorten. Puede ser más grande que la pantalla, entonces intentaré hacerla ampliable y móvil. ¿Cómo puedo hacer eso? ¡Muchísimas gracias!
Sibbs Gambling
1
@ perfectionm1ng mira el uso de BitmapRegionDecoder. Permite la carga parcial de imágenes grandes. Por lo tanto, debería poder cargar solo la parte de la imagen que está renderizando en este momento.
Konstantin Burov
Tengo el mismo problema. Estoy usando el código Canvas cs = new Canvas (mapa de bits); Recursos 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 ("Bueno")) {cs.drawBitmap (bitmapx, 0, 0, tPaint); } else {cs.drawBitmap (bitmapxx, 0, 0, tPaint); }
Ahmad Arslan
¿Cómo se dibuja la creación de un nuevo objeto de lienzo en el lienzo de onDraw?
Siddarth G
13

también puedes usarlo de esta manera. cambiará su gran ajuste de dibujo a su lienzo:

Resources res = getResources();
Bitmap bitmap = BitmapFactory.decodeResource(res, yourDrawable);
yourCanvas.drawBitmap(bitmap, 0, 0, yourPaint);
AzizAhmad
fuente
La clase BitmapFactory no tiene el método "BitmapFactory.decodeResource (Resource, Drawable);" ...
Crisic
@Crisic Asumiría que yourDrawablees un número entero.
10
Drawable d = ContextCompat.getDrawable(context, R.drawable.***)
d.setBounds(left, top, right, bottom);
d.draw(canvas);
34m0
fuente
Creo Drawable con gerResource (). GetDrawable (id);
Vikram
getDrawable (id) está en desuso, debe usar la llamada ContextCompat anterior o la llamada getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko
1
Para mí, era necesario usar setBounds. Sin él, no se muestra nada.
8

prueba esto

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
fuente
Pero si uso canvas.drawBitmap (mBitmap, 0, 0, mBitmapPaint); funciona y carga la imagen guardada en el lienzo, pero al mismo tiempo deshacer y rehacer deja de funcionar, verifique mi código 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);

    }

}
usuario1140237
fuente