Zeichenbares Bild auf einer Leinwand

Antworten:

174

Der gute Weg, ein Drawable auf eine Leinwand zu zeichnen, besteht darin, es nicht selbst zu dekodieren, sondern es dem System zu überlassen, dies zu tun:

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

Dies funktioniert mit allen Arten von Drawables, nicht nur mit Bitmaps. Dies bedeutet auch, dass Sie dasselbe Zeichen erneut verwenden können, wenn sich nur die Größe ändert.

Gábor
quelle
Wie verwendet man eine Animationsliste (mehrere Frames) für die Animation mit dem Canvas-Ansatz?
RichieHH
1
Sehr hilfreich! Zumindest, wenn Sie nur ein Hintergrundbild ohne Raketenwissenschaft benötigen!
Asim
@RichieHH Ich habe meinen Hintergrund in einer Oberflächenansicht (wahrscheinlich eine Verschwendung) und diese Oberflächenansicht ist in eine Framelayout eingebettet und diese Framelayout enthält ImageViews, die ich dann animiere - vielleicht ist das eine Option für Sie?
AgentKnopf
4
getDrawable (id) ist veraltet. Sie sollten entweder den obigen ContextCompat-Aufruf oder den getDrawable-Aufruf (id, theme) verwenden. developer.android.com/reference/android/content/res/…
wblaschko
@ Saveen: Bist du sicher? Soweit ich mich erinnern kann, soll dies ab den frühesten Versionen von Android funktionieren.
Gábor
38

Sie müssen Ihr Bild als Bitmap laden:

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

Machen Sie dann die Bitmap veränderbar und erstellen Sie eine Leinwand darüber:

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

Sie können dann auf die Leinwand zeichnen.

Konstantin Burov
quelle
Was ist, wenn meine .png groß ist und nach dem Laden abgeschnitten wird? dh ich möchte nicht, dass es abgeschnitten wird. Es kann größer sein als der Bildschirm, dann werde ich versuchen, es zoombar und beweglich zu machen. Wie kann ich das machen? Vielen herzlichen Dank!
Sibbs Gambling
1
@ perfectm1ng Schauen Sie sich die Verwendung von BitmapRegionDecoder an. Es ermöglicht das teilweise Laden für große Bilder. Sie sollten also nur den Teil des Bildes laden können, den Sie gerade rendern.
Konstantin Burov
Ich habe das gleiche Problem, ich verwende den Code Canvas cs = new Canvas (Bitmap); Ressourcen 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
Wie wird das Erstellen eines neuen Canvas-Objekts auf der Canvas von onDraw gezeichnet?
Siddarth G
13

Sie können auch auf diese Weise verwenden. es wird deine große Drawble-Passform auf deine Leinwand ändern:

Resources res = getResources();
Bitmap bitmap = BitmapFactory.decodeResource(res, yourDrawable);
yourCanvas.drawBitmap(bitmap, 0, 0, yourPaint);
AzizAhmad
quelle
Die BitmapFactory-Klasse hat keine Methode "BitmapFactory.decodeResource (Resource, Drawable);" ...
Crisic
@Crisic Ich würde annehmen, dass yourDrawabledas eine ganze Zahl ist.
10
Drawable d = ContextCompat.getDrawable(context, R.drawable.***)
d.setBounds(left, top, right, bottom);
d.draw(canvas);
34m0
quelle
Ich erstelle Drawable mit gerResource (). GetDrawable (id);
Vikram
getDrawable (id) ist veraltet. Sie sollten entweder den obigen ContextCompat-Aufruf oder den getDrawable-Aufruf (id, theme) verwenden. developer.android.com/reference/android/content/res/…
wblaschko
1
Für mich war es notwendig zu verwenden setBounds. Ohne sie wurde nichts angezeigt.
ты писюн горбатый. leftто такое links, oben, rechts, unten, надо указывать?
Dyno Cris
8

Versuche dies

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
quelle
Aber wenn ich canvas.drawBitmap verwende (mBitmap, 0, 0, mBitmapPaint); es funktioniert und es das gespeicherte Bild auf der Leinwand laden, aber zugleich Undo und Redo aufhören zu arbeiten, meinen Code überprüfen 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
quelle