Gambar yang dapat digambar di atas kanvas


Jawaban:


181

Cara yang baik untuk menggambar Drawable di atas kanvas bukanlah mendekodekannya sendiri, tetapi menyerahkannya kepada sistem untuk melakukannya:

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

Ini akan bekerja dengan semua jenis drawable, tidak hanya bitmap. Dan itu juga berarti bahwa Anda dapat menggunakan kembali drawable yang sama jika hanya ukurannya yang berubah.


Bagaimana seseorang menggunakan daftar animasi (beberapa bingkai) untuk animasi dengan pendekatan kanvas?
RichieHH

1
Sangat berguna! Setidaknya ketika Anda hanya membutuhkan gambar latar belakang tanpa melibatkan ilmu roket!
Asim

@RichieHH Saya memiliki latar belakang di SurfaceView (mungkin sia-sia) dan tampilan permukaan tersebut disematkan di Framelayout dan framelayout tersebut berisi ImageView yang kemudian saya animasikan - mungkin itu pilihan untuk Anda?
AgentKnopf

4
getDrawable (id) tidak digunakan lagi, Anda harus menggunakan panggilan ContextCompat di atas, atau panggilan getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko

@ Saveen: Apakah Anda yakin? Sejauh yang saya ingat, ini seharusnya berfungsi dari versi Android paling awal.
Gábor

39

Anda perlu memuat gambar Anda sebagai bitmap:

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

Kemudian buat bitmap bisa berubah dan buat kanvas di atasnya:

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

Anda kemudian bisa menggambar di atas kanvas.


Bagaimana jika .png saya besar dan terpotong setelah dimuat? yaitu saya tidak ingin memotongnya. Ini bisa lebih besar dari layar, maka saya akan mencoba membuatnya dapat diperbesar dan dipindahkan. Bagaimana saya bisa melakukan itu? Terima kasih banyak!
Sibbs Berjudi

1
@ perfectionm1ng lihat menggunakan BitmapRegionDecoder. Ini memungkinkan pemuatan parsial untuk gambar besar. Jadi, Anda harus dapat memuat hanya bagian gambar yang Anda render saat ini.
Konstantin Burov

Saya memiliki masalah yang sama saya menggunakan kode Canvas cs = new Canvas (bitmap); Sumber daya 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); } lain {cs.drawBitmap (bitmapxx, 0, 0, tPaint); }
Ahmad Arslan

Bagaimana cara menggambar objek kanvas baru di kanvas onDraw?
Siddarth G

14

Anda juga bisa menggunakan cara ini. itu akan mengubah ukuran drawble besar Anda ke kanvas:

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

Kelas BitmapFactory tidak memiliki metode "BitmapFactory.decodeResource (Resource, Drawable);" ...
Crisic

@Crisic Saya akan menganggap itu yourDrawableadalah integer.

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

Saya membuat Drawable dengan gerResource (). GetDrawable (id);
Vikram

getDrawable (id) tidak digunakan lagi, Anda harus menggunakan panggilan ContextCompat di atas, atau panggilan getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko

1
Bagi saya, itu perlu digunakan setBounds. Tanpa itu, tidak ada yang ditampilkan.

8

coba ini

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

        }

Tetapi jika saya menggunakan canvas.drawBitmap (mBitmap, 0, 0, mBitmapPaint); itu berfungsi dan memuat gambar yang disimpan di kanvas, tetapi pada saat yang sama membatalkan dan mengulang berhenti bekerja, Periksa kode saya 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);

    }

}
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.