Obraz do rysowania na płótnie

Odpowiedzi:

180

Dobrym sposobem na narysowanie rysunku do rysowania na płótnie nie jest samodzielne odkodowanie go, ale pozostawienie tego systemowi:

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

Będzie to działać ze wszystkimi rodzajami rysunków, nie tylko bitmapami. Oznacza to również, że możesz ponownie użyć tego samego rysunku, jeśli zmieni się tylko rozmiar.

Gábor
źródło
W jaki sposób można użyć listy animacji (wielu klatek) do animacji z podejściem Canvas?
RichieHH
1
Bardzo przydatne! Przynajmniej wtedy, gdy potrzebujesz tylko obrazu tła bez nauki o rakietach!
Asim
@RichieHH Mam swoje tło na SurfaceView (prawdopodobnie marnotrawstwo) i ten widok powierzchni jest osadzony w Framelayout, a ten framelayout zawiera ImageViews, które następnie animuję - może to opcja dla Ciebie?
AgentKnopf
4
getDrawable (id) jest przestarzałe, powinieneś albo użyć powyższego wywołania ContextCompat, albo wywołania getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko
@Saveen: Czy na pewno? O ile dobrze pamiętam, ma to działać od najwcześniejszych wersji Androida.
Gábor
39

Musisz załadować swój obraz jako bitmapę:

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

Następnie ustaw zmienną bitmapę i utwórz na niej płótno:

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

Następnie możesz rysować na płótnie.

Konstantin Burov
źródło
Co się stanie, jeśli mój plik .png jest duży i zostanie obcięty po załadowaniu? tj. nie chcę, aby było przycięte. Może być większy niż ekran, wtedy postaram się, aby był powiększalny i ruchomy. Jak mam to zrobić? Dziękuje Ci bardzo bardzo mocno!
Sibbs Gambling
1
@ perfectionm1ng spójrz na użycie BitmapRegionDecoder. Umożliwia częściowe ładowanie dużych obrazów. Więc powinieneś być w stanie załadować tylko tę część obrazu, którą obecnie renderujesz.
Konstantin Burov,
Mam ten sam problem, używam kodu Canvas cs = new Canvas (bitmap); Zasoby 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,
W jaki sposób tworzenie nowego obiektu Canvas rysuje się na kanwie onDraw?
Siddarth G
13

również możesz użyć w ten sposób. zmieni to duże dopasowanie do twojego płótna:

Resources res = getResources();
Bitmap bitmap = BitmapFactory.decodeResource(res, yourDrawable);
yourCanvas.drawBitmap(bitmap, 0, 0, yourPaint);
AzizAhmad
źródło
Klasa BitmapFactory nie ma metody „BitmapFactory.decodeResource (Resource, Drawable);” ...
Crisic
@Crisic Przypuszczam, że yourDrawablejest to liczba całkowita.
11
Drawable d = ContextCompat.getDrawable(context, R.drawable.***)
d.setBounds(left, top, right, bottom);
d.draw(canvas);
34m0
źródło
Tworzę Drawable z gerResource (). GetDrawable (id);
Vikram
getDrawable (id) jest przestarzałe, powinieneś albo użyć powyższego wywołania ContextCompat, albo wywołania getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko
1
Dla mnie było to konieczne setBounds. Bez tego nic się nie wyświetlało.
8

Spróbuj tego

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
źródło
Ale jeśli używam canvas.drawBitmap (mBitmap, 0, 0, mBitmapPaint); działa i ładuje zapisany obraz na płótnie, ale jednocześnie cofnij i ponów przestań działać, Sprawdź mój kod 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
źródło