마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Drawing Bitmap 이미지가 저장되지 않습니다.

0 추천

현재 사용 중인 DrawingView의 소스 코드입니다.

 

package exam.test.simplelibtest.customview;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Bitmap.Config;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

public class DrawingView extends View
{
	
	private Bitmap				bitmap;
	
	private Bitmap				beforeDrawing;
	
	private Paint				mPaint;
	private ArrayList<Vertex>	arVertex;
	
	private int					width;
	private int					height;
	
	public DrawingView( Context context )
	{
		super( context );
		init();
		
	}
	
	public DrawingView( Context context, AttributeSet attrs, int defStyle )
	{
		super( context, attrs, defStyle );
		init();
	}
	
	public DrawingView( Context context, AttributeSet attrs )
	{
		super( context, attrs );
		init();
	}
	
	private void init()
	{
		
		mPaint = new Paint();
		mPaint.setColor( Color.BLACK );
		mPaint.setStrokeWidth( 5 );
		mPaint.setAntiAlias( true );
		
		arVertex = new ArrayList<DrawingView.Vertex>();
	}
	
	@Override
	public boolean onTouchEvent( MotionEvent event )
	{
		switch ( event.getAction() )
		{
			case MotionEvent.ACTION_DOWN :
				arVertex.add( new Vertex( event.getX(), event.getY(), false ) );
				break;
			case MotionEvent.ACTION_MOVE :
				arVertex.add( new Vertex( event.getX(), event.getY(), true ) );
		}
		invalidate();

		return true;
	}
	
	public void setBeforeBitmapData( Bitmap beforeData )
	{
		beforeDrawing = beforeData;
	}
	
	@Override
	protected void onDraw( Canvas canvas )
	{
		super.onDraw( canvas );
		
		if ( bitmap == null && beforeDrawing == null )
		{
			bitmap = Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888 );
			canvas = new Canvas( bitmap );
		}
		else if ( bitmap == null && beforeDrawing != null )
		{
			bitmap = beforeDrawing.copy( Config.ARGB_8888, true );
			canvas = new Canvas( bitmap );
		}
		
		for ( int i = 0 ; i < arVertex.size() ; i++ )
		{
			if ( arVertex.get( i ).draw )
			{
				canvas.drawLine( arVertex.get( i - 1 ).x, arVertex.get( i - 1 ).y, arVertex.get( i ).x, arVertex.get( i ).y, mPaint );
			}
			else
			{
				canvas.drawPoint( arVertex.get( i ).x, arVertex.get( i ).y, mPaint );
			}
		}
		
	}
	
	@Override
	protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec )
	{
		
		int heightMode = MeasureSpec.getMode( heightMeasureSpec );
		int heightSize = 0;
		switch ( heightMode )
		{
			case MeasureSpec.UNSPECIFIED :
				heightSize = heightMeasureSpec;
				break;
			case MeasureSpec.AT_MOST : 
				heightSize = 400;
				break;
			case MeasureSpec.EXACTLY :  
				heightSize = MeasureSpec.getSize( heightMeasureSpec );
				break;
		}
		
		int widthMode = MeasureSpec.getMode( widthMeasureSpec );
		int widthSize = 0;
		switch ( widthMode )
		{
			case MeasureSpec.UNSPECIFIED :
				widthSize = widthMeasureSpec;
				break;
			case MeasureSpec.AT_MOST :
				widthSize = 550;
				break;
			case MeasureSpec.EXACTLY : 
				widthSize = MeasureSpec.getSize( widthMeasureSpec );
				break;
		}
		
		this.width = widthSize;
		this.height = heightSize;
		
		setMeasuredDimension( widthSize, heightSize );
		
	}
	
	@Override
	public Bitmap getDrawingCache()
	{
		
		return bitmap;
	}
	
	public static class Vertex
	{
		float	x;
		float	y;
		boolean	draw;
		
		public Vertex( float x, float y, boolean draw )
		{
			this.x = x;
			this.y = y;
			this.draw = draw;
		}
	}
	
}

 

getDrawingCache를 통해 현재까지 그린 bitmap을 가져오고 싶은데, 아무것도 그려지지 않은 bitmap을 리턴합니다.

어느 부분을 수정해야 제대로 된 bitmap을 가져올까요?

 

ESTYLE (160 포인트) 님이 2013년 3월 25일 질문

1개의 답변

0 추천

아... 자문자답이네요... -_-;;;

 

일단은 기존의 Bitmap을 다시 그리는 방법입니다.

 

package exam.test.drawingviewtest.customview;

import java.util.ArrayList;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;

public class DrawingView extends View
{
	
	private Bitmap				bitmap;
	
	private Bitmap				beforeDrawing;
	
	private Paint				mPaint;
	private ArrayList<Vertex>	arVertex;
	
	private int					width;
	private int					height;
	
	public DrawingView( Context context )
	{
		super( context );
		init();
	}
	
	public DrawingView( Context context, AttributeSet attrs, int defStyle )
	{
		super( context, attrs, defStyle );
		init();
	}
	
	public DrawingView( Context context, AttributeSet attrs )
	{
		super( context, attrs );
		init();
	}
	
	private void init()
	{
		mPaint = new Paint();
		mPaint.setColor( Color.BLACK );
		mPaint.setStrokeWidth( 5 );
		mPaint.setAntiAlias( true );
		
		arVertex = new ArrayList<DrawingView.Vertex>();
		
	}
	
	@Override
	public boolean onTouchEvent( MotionEvent event )
	{
		switch ( event.getAction() )
		{
			case MotionEvent.ACTION_DOWN :
				arVertex.add( new Vertex( event.getX(), event.getY(), false ) );
				break;
			case MotionEvent.ACTION_MOVE :
				arVertex.add( new Vertex( event.getX(), event.getY(), true ) );
		}
		invalidate();
		return true;
	}
	
	public void setBeforeBitmapData( Bitmap beforeData )
	{
		if ( !(beforeData.isRecycled()) )
		{
			beforeDrawing = beforeData.copy( Bitmap.Config.ARGB_8888, false );
			beforeData.recycle();
		}
		
	}
	
	@Override
	protected void onDraw( Canvas canvas )
	{
		
		super.onDraw( canvas );
		
		if ( bitmap == null )
		{
			bitmap = Bitmap.createBitmap( width, height, Bitmap.Config.ARGB_8888 );
			canvas = new Canvas( bitmap );
		}
		
		if ( beforeDrawing != null )
		{
			canvas.drawBitmap( beforeDrawing, 0, 0, null );
		}
		
		for ( int i = 0 ; i < arVertex.size() ; i++ )
		{
			if ( arVertex.get( i ).draw )
			{
				canvas.drawLine( arVertex.get( i - 1 ).x, arVertex.get( i - 1 ).y, arVertex.get( i ).x, arVertex.get( i ).y, mPaint );
			}
			else
			{
				canvas.drawPoint( arVertex.get( i ).x, arVertex.get( i ).y, mPaint );
			}
		}
		
	}
	
	@Override
	protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec )
	{
		int heightMode = MeasureSpec.getMode( heightMeasureSpec );
		int heightSize = 0;
		switch ( heightMode )
		{
			case MeasureSpec.UNSPECIFIED :
				heightSize = heightMeasureSpec;
				break;
			case MeasureSpec.AT_MOST :
				heightSize = 400;
				break;
			case MeasureSpec.EXACTLY :
				heightSize = MeasureSpec.getSize( heightMeasureSpec );
				break;
		}
		
		int widthMode = MeasureSpec.getMode( widthMeasureSpec );
		int widthSize = 0;
		switch ( widthMode )
		{
			case MeasureSpec.UNSPECIFIED :
				widthSize = widthMeasureSpec;
				break;
			case MeasureSpec.AT_MOST :
				widthSize = 550;
				break;
			case MeasureSpec.EXACTLY :
				widthSize = MeasureSpec.getSize( widthMeasureSpec );
				break;
		}
		
		this.width = widthSize;
		this.height = heightSize;
		
		setMeasuredDimension( widthSize, heightSize );
		
	}
	
	public void clear()
	{
		arVertex.clear();
		invalidate();
	}
	
	public static class Vertex
	{
		float	x;
		float	y;
		boolean	draw;
		
		public Vertex( float x, float y, boolean draw )
		{
			this.x = x;
			this.y = y;
			this.draw = draw;
		}
	}
	
}

 

... 문제는 한 번 invalidate를 시켜주어야 하네요...

 

ESTYLE (160 포인트) 님이 2013년 3월 25일 답변
안녕하세요
제가 화면 캡쳐기능을 구현중인데 비트맵 널값때문에 못하고 있습니다.getdrawingcache 이부분이 널값이 난다고 하더라구요..
혹시 봐주실수 있으신가요?

http://www.masterqna.com/android/7794/%EB%B9%84%ED%8A%B8%EB%A7%B5-%EB%84%90-%EA%B0%92-%ED%95%B4%EA%B2%B0%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95%EC%9D%80-%EC%96%B4%EB%96%BB%EA%B2%8C-%ED%95%B4%EC%95%BC%ED%95%98%EC%A3%A0

이 글인데 비슷한 현상인지요
...