Imagem drawable em uma tela

Respostas:

176

A boa maneira de desenhar um Drawable em uma tela não é decodificá-lo, mas deixar que o sistema faça isso:

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

Isso funcionará com todos os tipos de drawables, não apenas bitmaps. E também significa que você pode reutilizar o mesmo drawable novamente se apenas o tamanho mudar.

Gábor
fonte
Como usar uma lista de animação (vários quadros) para animação com a abordagem de tela?
RichieHH
1
Muito útil! Pelo menos quando você precisa apenas de uma imagem de fundo sem nenhuma ciência de foguetes envolvida!
Asim
@RichieHH Eu tenho meu plano de fundo em um SurfaceView (provavelmente um desperdício) e essa visualização de superfície está incorporada em um Framelayout e esse framelayout contém ImageViews que eu animo - talvez seja uma opção para você?
AgentKnopf
4
getDrawable (id) está sendo preterido, você deve usar a chamada ContextCompat acima ou a chamada getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko
@Saveen: Tem certeza? Pelo que me lembro, isso deveria funcionar nas primeiras versões do Android.
Gábor
38

Você precisa carregar sua imagem como bitmap:

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

Em seguida, torne o bitmap mutável e crie uma tela sobre ele:

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

Em seguida, você pode desenhar na tela.

Konstantin Burov
fonte
E se meu .png for grande e for cortado após ser carregado? ou seja, eu não quero que seja cortado. Pode ser maior do que a tela, então tentarei torná-lo com zoom e móvel. Como posso fazer isso? Muito obrigado!
Sibbs Gambling
1
@ perfectionm1ng veja como usar BitmapRegionDecoder. Ele permite o carregamento parcial de imagens grandes. Portanto, você deve ser capaz de carregar apenas a parte da imagem que está renderizando no momento.
Konstantin Burov
Estou com o mesmo problema que estou usando o código Canvas cs = new Canvas (bitmap); 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 ("Good")) {cs.drawBitmap (bitmapx, 0, 0, tPaint); } else {cs.drawBitmap (bitmapxx, 0, 0, tPaint); }
Ahmad Arslan
Como a criação de um novo objeto de tela é desenhada na tela do onDraw?
Siddarth G
13

também você pode usar desta forma. isso mudará o ajuste do drawble grande à tela:

Resources res = getResources();
Bitmap bitmap = BitmapFactory.decodeResource(res, yourDrawable);
yourCanvas.drawBitmap(bitmap, 0, 0, yourPaint);
AzizAhmad
fonte
A classe BitmapFactory não tem o método "BitmapFactory.decodeResource (Resource, Drawable);" ...
Crisic
@Crisic presumo que yourDrawableseja um número inteiro.
10
Drawable d = ContextCompat.getDrawable(context, R.drawable.***)
d.setBounds(left, top, right, bottom);
d.draw(canvas);
34m0
fonte
Eu crio Drawable com gerResource (). GetDrawable (id);
Vikram
getDrawable (id) está sendo preterido, você deve usar a chamada ContextCompat acima ou a chamada getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko
1
Para mim, foi necessário usar setBounds. Sem ele, nada era exibido.
ты писюн горбатый. что такое left, top, right, bottom, надо указывать?
Dyno Cris
8

tente isso

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
fonte
Mas se eu usar canvas.drawBitmap (mBitmap, 0, 0, mBitmapPaint); funciona e carrega a imagem salva na tela, mas ao mesmo tempo desfaz e refaz para de funcionar, verifique meu 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);

    }

}
user1140237
fonte