Hình ảnh có thể vẽ trên canvas


Câu trả lời:


178

Cách tốt để vẽ Drawable trên canvas không phải là tự giải mã nó mà là để hệ thống làm như vậy:

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

Điều này sẽ hoạt động với tất cả các loại có thể vẽ, không chỉ bitmap. Và nó cũng có nghĩa là bạn có thể sử dụng lại chính cái có thể vẽ đó một lần nữa nếu chỉ thay đổi kích thước.


Làm cách nào để sử dụng một danh sách hoạt ảnh (nhiều khung hình) cho hoạt ảnh với cách tiếp cận canvas?
RichieHH

1
Rất hữu ích! Ít nhất là khi bạn chỉ cần một bức ảnh nền không liên quan đến khoa học tên lửa!
Asim

@RichieHH Tôi có nền tảng của mình trên SurfaceView (có thể là lãng phí) và chế độ xem bề mặt đó được nhúng trong Framelayout và framelayout đó chứa ImageViews mà sau đó tôi tạo hoạt ảnh - có thể đó là một lựa chọn cho bạn?
AgentKnopf

4
getDrawable (id) không được dùng nữa, bạn nên sử dụng lệnh gọi ContextCompat ở trên hoặc lệnh gọi getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko

@Saveen: Bạn có chắc không? Theo như tôi có thể nhớ, điều này được cho là hoạt động từ các phiên bản Android đầu tiên.
Gábor

38

Bạn cần tải hình ảnh của mình dưới dạng bitmap:

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

Sau đó, làm cho bitmap có thể thay đổi và tạo một canvas trên đó:

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

Sau đó, bạn có thể vẽ trên canvas.


Điều gì sẽ xảy ra nếu .png của tôi lớn và nó bị cắt sau khi được tải? tức là tôi không muốn cắt nó. Nó có thể lớn hơn màn hình, sau đó tôi sẽ cố gắng làm cho nó có thể thu phóng và di chuyển được. Làm thế nào tôi có thể làm điều đó? Cảm ơn bạn rất nhiều!
Sibbs Gambling

1
@ perfectm1ng xem bằng cách sử dụng BitmapRegionDecoder. Nó cho phép tải một phần cho hình ảnh lớn. Vì vậy, bạn sẽ chỉ có thể tải phần hình ảnh mà bạn đang hiển thị vào lúc này.
Konstantin Burov

Tôi gặp vấn đề tương tự, tôi đang sử dụng mã Canvas cs = new Canvas (bitmap); Tài nguyên 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 ("Tốt")) {cs.drawBitmap (bitmapx, 0, 0, tPaint); } else {cs.drawBitmap (bitmapxx, 0, 0, tPaint); }
Ahmad Arslan

Làm thế nào để tạo đối tượng canvas mới vẽ trên canvas của onDraw?
Siddarth G

13

bạn cũng có thể sử dụng cách này. nó sẽ thay đổi sự phù hợp có thể kéo lớn của bạn với canvas của bạn:

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

Lớp BitmapFactory không có phương thức "BitmapFactory.decodeResource (Resource, Drawable);" ...
Crisic

@Crisic Tôi sẽ giả sử đó yourDrawablelà một số nguyên.

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

Tôi tạo Drawable bằng gerResource (). GetDrawable (id);
Vikram

getDrawable (id) không được dùng nữa, bạn nên sử dụng lệnh gọi ContextCompat ở trên hoặc lệnh gọi getDrawable (id, theme). developer.android.com/reference/android/content/res/…
wblaschko

1
Đối với tôi, nó là cần thiết để sử dụng setBounds. Không có nó, không có gì được hiển thị.

8

thử cái này

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

        }

Nhưng nếu tôi sử dụng canvas.drawBitmap (mBitmap, 0, 0, mBitmapPaint); nó hoạt động và nó tải hình ảnh đã lưu trên canvas, nhưng đồng thời hoàn tác và làm lại ngừng hoạt động. Hãy kiểm tra mã của tôi 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);

    }

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.