2010-01-31 44 views
18

Có cách nào khác để vẽ một đối tượng trên canvas trong Android không?vẽ đối tượng/hình ảnh trên canvas

Mã này bên trong bốc thăm() không hoạt động:

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.pushpin);
canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);

Vâng trên thực tế, nó làm việc trên mã 1st của tôi, nhưng khi tôi đã chuyển giao này sang một lớp được gọi là MarkOverlay, nó không làm việc nữa.

markerOverlay = new MarkerOverlay(getApplicationContext(), p); 
         listOfOverlays.add(markerOverlay);

Tôi nên chuyển thông số nào cho MarkerOverlay để làm cho mã này hoạt động? Lỗi ở đâu đó trong hàm getResources().

FYI, canvas.drawOval hoàn toàn hoạt động nhưng tôi thực sự muốn vẽ Hình ảnh không phải Hình bầu dục. :)

Trả lời

22
package com.canvas; 

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.View; 

public class Keypaint extends View { 
    Paint p; 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     p=new Paint(); 
     Bitmap b=BitmapFactory.decodeResource(getResources(), R.drawable.icon); 
     p.setColor(Color.RED); 
     canvas.drawBitmap(b, 0, 0, p); 
    } 

    public Keypaint(Context context) { 
     super(context); 
    } 
} 
+7

Bạn cần phải giải phóng dữ liệu Bitmap với Bitmap.recycle() hoặc nếu không bạn sẽ có được một sự rò rỉ bộ nhớ khó chịu: tạo một bitmap mới trong mỗi chu kỳ vẽ. –

+5

Không giải mã hình ảnh trong onDraw - thực hiện càng nhiều việc nâng hạng nặng bên ngoài vòng lặp render. – slott

14

tôi thích để làm điều này vì nó chỉ tạo ra hình ảnh một lần:

public class CustomView extends View { 

    private Drawable mCustomImage; 

    public CustomView(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     mCustomImage = context.getResources().getDrawable(R.drawable.my_image); 
    } 

    ... 

    protected void onDraw(Canvas canvas) { 
     Rect imageBounds = canvas.getClipBounds(); // Adjust this for where you want it 

     mCustomImage.setBounds(imageBounds); 
     mCustomImage.draw(canvas); 
    } 
} 
+5

+1 để không phân bổ hoặc giải nén ảnh trong onDraw – user1532390

+1

cho tôi cảnh báo nhật thực này: Tránh phân bổ đối tượng trong quá trình vẽ: Sử dụng Canvas.getClipBounds (Rect) thay vì Canvas.getClipBounds() phân bổ Rect tạm thời – oat

+1

Điều này có thể thậm chí còn tốt hơn nếu bạn làm theo các lần truy cập trình tối ưu hóa đơn giản do Eclipse đưa ra. I E. \t \t canvas.getClipBounds (imageBounds); \t \t mCustomImage.setBounds (imageBounds); Có một onDraw siêu nhanh là rất quan trọng. – slott

Các vấn đề liên quan