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.