2010-01-31 261 views
18

有沒有另一種方法在Android上的畫布上繪製對象?在畫布上繪製對象/圖像

內得出這樣的代碼()不工作:

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

嗯,事實上,它的工作對我的第一個代碼,但是當我轉移這叫做MarkOverlay另一個類,它不工作了。

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

我應該將哪個參數傳遞給MarkerOverlay以使此代碼有效?該錯誤在getResources()中的某處。

僅供參考,canvas.drawOval是完美的工作,但我真的想畫一個不是橢圓形的圖像。 :)

回答

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

你必須釋放與Bitmap.recycle()位圖數據,否則你會得到一個討厭的內存泄漏:在每個繪圖週期中創建一個新的位圖。 – 2013-03-31 07:16:03

+5

不要解碼onDraw中的圖像 - 在渲染循環外完成儘可能多的繁重工作。 – slott 2015-05-07 07:24:21

14

我喜歡做這個,因爲它只是生成圖像一次:

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不進行分配或onDraw有 – user1532390 2013-02-15 15:22:32

+1

拆包的圖像給了我這次日食警告:在抽吸操作避免對象分配:使用Canvas.getClipBounds(矩形),而不是Canvas.getClipBounds(),它分配一個臨時矩形 – oat 2013-12-14 06:40:12

+1

這可能是如果您遵循Eclipse給出的簡單優化器命中,則會更好。 IE瀏覽器。 \t \t canvas.getClipBounds(imageBounds); \t \t mCustomImage.setBounds(imageBounds); 擁有超快的onDraw非常重要。 – slott 2015-05-07 07:30:04