캔버스에 드로어 블 이미지


답변:


178

캔버스에 드로어 블을 그리는 좋은 방법은 직접 디코딩하는 것이 아니라 시스템에 맡기는 것입니다.

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

이것은 비트 맵뿐만 아니라 모든 종류의 드로어 블에서 작동합니다. 또한 크기 만 변경되면 동일한 드로어 블을 다시 사용할 수 있습니다.


캔버스 방식으로 애니메이션에 애니메이션 목록 (여러 프레임)을 어떻게 사용합니까?
RichieHH 2014

1
굉장히 유용하다! 적어도 로켓 과학이 포함되지 않은 배경 사진이 필요할 때!
Asim

@RichieHH SurfaceView (적절히 낭비)에 대한 배경이 있고 해당 표면 뷰가 Framelayout에 포함되어 있고 해당 프레임 레이아웃에 ImageView가 포함되어 애니메이션을 적용 할 수 있습니다.
AgentKnopf

4
getDrawable (id)는 더 이상 사용되지 않습니다. 위의 ContextCompat 호출을 사용하거나 getDrawable (id, theme) 호출을 사용해야합니다. developer.android.com/reference/android/content/res/…
wblaschko

@Saveen : 확실합니까? 내가 기억하는 한, 이것은 안드로이드의 초기 버전에서 작동해야합니다.
Gábor

38

이미지를 비트 맵으로로드해야합니다.

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

그런 다음 비트 맵을 변경 가능하게 만들고 그 위에 캔버스를 만듭니다.

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

그런 다음 캔버스에 그릴 수 있습니다.


.png가 크고로드 후 잘 리면 어떻게됩니까? 즉, 나는 그것을 자르고 싶지 않습니다. 화면보다 클 수 있으므로 확대 / 축소 및 이동이 가능하도록 노력하겠습니다. 어떻게해야합니까? 정말 감사합니다!
Sibbs는 도박

1
@ perfectionm1ng BitmapRegionDecoder 사용을 살펴보십시오. 큰 이미지를 부분적으로로드 할 수 있습니다. 따라서 현재 렌더링중인 이미지의 일부만로드 할 수 있어야합니다.
Konstantin Burov 2013

동일한 문제가 있습니다. 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); }
아마드 아르 슬란

새 캔버스 개체를 만들면 onDraw의 캔버스에 어떻게 그려 지나요?
Siddarth G

13

또한이 방법으로 사용할 수 있습니다. 캔버스에 맞게 큰 드로 블이 변경됩니다.

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

BitmapFactory 클래스에 "BitmapFactory.decodeResource (Resource, Drawable);"메소드가 없습니다 ...
Crisic

@Crisic 나는 그것이 yourDrawable정수 라고 가정합니다 .

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

나는 gerResource (). getDrawable (id);
Vikram

getDrawable (id)는 더 이상 사용되지 않습니다. 위의 ContextCompat 호출을 사용하거나 getDrawable (id, theme) 호출을 사용해야합니다. developer.android.com/reference/android/content/res/…
wblaschko

1
저에게는 setBounds. 그것 없이는 아무것도 표시되지 않았습니다.

8

이 시도

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

        }

하지만 canvas.drawBitmap (mBitmap, 0, 0, mBitmapPaint); 그것은 작동하고 캔버스에 저장된 이미지를로드하지만 동시에 실행 취소 및 다시 실행 작업을 중지합니다. 내 코드 확인 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);

    }

}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.