2011-03-03 123 views

回答

7

試試這個

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

     } 
+0

但是,如果使用canvas.drawBitmap(mBitmap,0,0,mBitmapPaint);它可以工作,並將保存的圖像加載到畫布上,但同時撤消和重做停止工作,請檢查我的代碼http://pastebin.com/cP9w6stm – AndroidDev

35

您需要加載圖像作爲位圖:

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

然後使位圖可變的,並創建了它在畫布:

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

然後你可以在畫布上畫畫。

+0

如果我的.png很大並且在加載後會被剪切掉?即我不想裁剪。它可以比屏幕更大,然後我會盡量使它變得可以縮放和移動。我該怎麼做?非常感謝你! –

+1

@ perfectionm1ng看看使用BitmapRegionDecoder。它允許部分加載大圖像。所以你應該只能加載你現在渲染的圖像部分。 –

+0

我使用代碼 Canvas cs = new Canvas(bitmap); Resources res = getResources(); 位圖bitmapx = BitmapFactory.decodeResource(res,R.drawable.overlay_good_full); 位圖bitmapxx = BitmapFactory.decodeResource(res,R.drawable.overlay_bad_full);如果(text.equals(「Good」)) { cs.drawBitmap(bitmapx,0,0,tPaint); } else cs.drawBitmap(bitmapxx,0,0,tPaint); } –

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

    } 

} 
+2

在onDraw中創建一個新的Paint對象對性能不利 –

+0

好吧thnks ..我已經更新了答案 – user1140237

118

的好方法繪製在畫布上繪製對象不是自己的解碼,但它留給系統可以這樣做:

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

這將有各類可繪製的,不僅是位圖工作。而且這也意味着如果只改變大小,您可以再次使用相同的drawable。

+0

如何使用動畫列表(多幀)動畫與畫布方法? – RichieHH

+0

非常有用!至少當你需要一個沒有火箭科學的背景圖片時! – Asim

+0

@RichieHH我在SurfaceView上有我的背景(可以說是浪費),並且表面視圖嵌入在Framelayout中,並且該框架佈局包含ImageView,然後生成動畫 - 也許這是您的選擇? – AgentKnopf

8

也可以使用這種方式。將你的大drawble適合改變你的畫布:

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

BitmapFactory類沒有方法「BitmapFactory.decodeResource(Resource,Drawable);」... – Crisic

+0

@Crisic我會假設'yourDrawable'是一個整數。 –

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

我使用gerResource()創建了Drawable。getDrawable(id); – Vikram

+0

getDrawable(id)已被棄用,您應該使用上面的ContextCompat調用或getDrawable(id,theme)調用。 https://developer.android.com/reference/android/content/res/Resources.html#getDrawable(int) – wblaschko

+0

對我來說,有必要使用'setBounds'。沒有它,沒有任何顯示。 –