2011-03-03 8 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)를 사용하는 경우는 : 그것은 당신의 캔버스에 큰 drawble에 맞게 변경됩니다 그것은 작동하고 그것은 캔버스에 저장된 이미지를로드하지만 동시에 취소 및 다시 작업을 멈추고 내 코드를 확인하십시오 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

@perfectm1ng BitmapRegionDecoder를 사용하여보세요. 큰 이미지를 부분로드 할 수 있습니다. 따라서 현재 렌더링하고있는 이미지의 일부분 만로드 할 수 있어야합니다. –

+0

동일한 문제가 있습니다. 코드 Canvas cs = new Canvas (bitmap); 리소스 res = getResources(); 비트 맵 bitmapx = BitmapFactory.decodeResource (res, R.drawable.overlay_good_full); 비트 맵 bitmapxx = BitmapFactory.decodeResource (res, R.drawable.overlay_bad_full); if (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

괜찮습니다. 대답을 업데이트했습니다. – user1140237

118

캔버스에 그리기를 그릴 수있는 좋은 방법은 스스로를 디코딩하지만, 그렇게 할 수있는 시스템으로 떠나되지 않습니다

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

이 드로어 블의 모든 종류의,뿐만 아니라 비트 맵으로 작동합니다. 또한 크기가 변경된 경우 다시 같은 드로어 블을 다시 사용할 수 있음을 의미합니다.

+0

캔버스 방식으로 애니메이션에 애니메이션 목록 (여러 프레임)을 사용하는 방법은 무엇입니까? – RichieHH

+0

매우 유용합니다! 최소한 로켓 과학이없는 배경 그림 만 필요할 때! – Asim

+0

@RichieHH SurfaceView (적절하게 낭비)에 내 배경이 있고 그 표면 뷰가 Framelayout에 포함되어 있고 그 framelayout에 애니메이션을 적용한 ImageView가 포함되어 있습니다. – AgentKnopf

8

이 방법을 사용할 수도 있습니다.

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'를 사용해야했습니다. 그것 없이는 아무것도 표시되지 않았습니다. –

관련 문제