Immagine disegnabile su tela


Risposte:


176

Il modo migliore per disegnare un Drawable su una tela non è decodificarlo da soli, ma lasciare che sia il sistema a farlo:

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

Funzionerà con tutti i tipi di drawable, non solo bitmap. E significa anche che puoi riutilizzare di nuovo lo stesso disegnabile se cambia solo la dimensione.


Come si usa un elenco di animazioni (più fotogrammi) per l'animazione con l'approccio della tela?
RichieHH

1
Molto utile! Almeno quando hai bisogno solo di un'immagine di sfondo senza coinvolgere la scienza missilistica!
Asim

@RichieHH Ho il mio sfondo su un SurfaceView (probabilmente uno spreco) e quella vista di superficie è incorporata in un Framelayout e quel framelayout contiene ImageViews che poi animo - forse è un'opzione per te?
AgentKnopf

4
getDrawable (id) è stato deprecato, dovresti usare la chiamata ContextCompat sopra o la chiamata getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko

@ Saveen: sei sicuro? Per quanto posso ricordare, dovrebbe funzionare dalle prime versioni di Android.
Gábor

38

Devi caricare la tua immagine come bitmap:

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

Quindi rendi la bitmap mutabile e crea una tela su di essa:

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

Quindi puoi disegnare sulla tela.


Cosa succede se il mio .png è grande e viene tagliato dopo essere stato caricato? cioè non voglio ritagliarlo. Può essere più grande dello schermo, quindi cercherò di renderlo zoomabile e mobile. Come posso farlo? Grazie così tanto!
Sibbs Gambling

1
@ perfectionm1ng guarda come usare BitmapRegionDecoder. Consente il caricamento parziale di immagini di grandi dimensioni. Quindi dovresti essere in grado di caricare solo la parte dell'immagine che stai renderizzando al momento.
Konstantin Burov

Ho lo stesso problema sto usando il codice Canvas cs = new Canvas (bitmap); Risorse 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

Come si disegna la creazione di un nuovo oggetto canvas sulla tela di onDraw?
Siddarth G,

13

anche tu puoi usare in questo modo. cambierà la tua grande vestibilità drawble alla tua tela:

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

La classe BitmapFactory non ha il metodo "BitmapFactory.decodeResource (Resource, Drawable);" ...
Crisic

@ Crisic, presumo che yourDrawablesia un numero intero.

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

Creo Drawable con gerResource (). GetDrawable (id);
Vikram

getDrawable (id) è stato deprecato, dovresti usare la chiamata ContextCompat sopra o la chiamata getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko

1
Per me era necessario usare setBounds. Senza di esso, non viene visualizzato nulla.

ты писюн горбатый. что такое sinistra, in alto, a destra, in basso, надо указывать?
Dyno Cris

8

prova questo

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

        }

Ma se uso canvas.drawBitmap (mBitmap, 0, 0, mBitmapPaint); funziona e carica l'immagine salvata sulla tela, ma allo stesso tempo annulla e ripeti smette di funzionare, controlla il mio codice 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);

    }

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.