안녕하세요. 안드로이드 초보 개발자입니다..(구글링으로 소스찾아가면서 하고있습니다...TT)
다름이 아니라 Canvas로 그림을그려 서버에 처음 저장할때는 지우개기능이 잘 됩니다.
그런데 저장한 이미지를 불러와서 수정을 하는경우에 문제가 생깁니다.
문제 내용은 이미지를 불러와 수정을 하고 지우개를 클릭해서 화면을 터치하면
수정한 부분이 화면에서 지워집니다.(기존에 불러온 이미지와 겹치는 부분이 있으면 그 부분도 사라집니다.)
그리고 다시 그리기 도구를 클릭하여 화면을 터치하면 지워졌던부분이 다시 표시됩니다.
아래 해당부분 소스입니다. OnTouchEvent()에서 해결을 해야할거같은데 도무지 모르겠습니다..TT
public class DrawView extends View{
String Tag = "DrawVIew";
private Paint paint = new Paint();
private Path path = new Path();
private int paintColor=0xff000000;
private int paintEraseColor=0xFFFFFF;
private Paint canvasPaint;
private Canvas drawCanvas;
private float mX, mY;
String fileName = "";
int mStrokeWidth = 2;
boolean mEraseMode = false;
private Bitmap canvasBitmap;
public DrawView(Context context){ DrawView 상속사 생략 }
public DrawView(Context context, AttributeSet attrs){ DrawView 상속자 생략}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
//view 핵심 영역
//실제로 화면을 그린다.
if("update".equals(Common.Update_Type) && !"".equals(Common.Update_Treat_Id) ){
Common.Update_Type = "edit";
Thread mThread = new Thread(){
@Override
public void run(){
try{
URL url = new URL(Common.Update_File_Url+Common.Update_Chart_Id+"/"+Common.Update_Treat_Id+"/"+Common.Update_FIle_Name.split("#")[0]);
Log.d(Tag, "url :: "+url);
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
conn.setDoInput(true);
conn.connect();
InputStream is = conn.getInputStream();
canvasBitmap = BitmapFactory.decodeStream(is);
}catch (Exception e){
Log.d(Tag, "Exception connect :: "+e.getMessage());
}
}
};
mThread.start();
try{
mThread.join();
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.drawPath(path, paint);
}catch (Exception e){
Log.d(Tag, "Exception canvas.drawBitmap :: "+e.getMessage());
}
}else{
canvas.drawBitmap(canvasBitmap, 0, 0, canvasPaint);
canvas.drawPath(path, paint);
}
}
@Override
public boolean onTouchEvent(MotionEvent event){
float touchX = event.getX();
float touchY = event.getY();
switch(event.getAction()){
case MotionEvent.ACTION_DOWN: //손가락이 눌렸을떄
path.moveTo(touchX, touchY);
break;
case MotionEvent.ACTION_MOVE:
path.lineTo(touchX, touchY);
break;
case MotionEvent.ACTION_UP:
drawCanvas.drawPath(path, paint);
if(!"edit".equals(Common.Update_Type)) {
path.reset();
}
break;
}
invalidate();
return true;
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh){
//view크기가 변경되었을때 호출
super.onSizeChanged(w, h, oldw, oldh);
canvasBitmap = Bitmap.createBitmap(w,h, Bitmap.Config.ARGB_8888);
drawCanvas = new Canvas(canvasBitmap);
canvasPaint = new Paint(Paint.DITHER_FLAG);
}
public void setColor(String newColor){
invalidate();
paintColor= Color.parseColor(newColor);
paint.setColor(paintColor);
}
// 초기화버튼 수정인경우 초기 서버에서 가져온 이미지를 다시 view
public void reset(){
if("edit".equals(Common.Update_Type)){
path.reset();
}else{
drawCanvas.drawColor(0,PorterDuff.Mode.CLEAR);
}
invalidate();
}
public void updatePaintProperty(int color, int size, boolean booleanValue){
Log.d(Tag,"color :: "+color);
paint.setColor(color);
paint.setStrokeWidth(size);
Log.d(Tag,"booleanValue :: "+booleanValue);
mEraseMode = booleanValue;
}
}
1. 기존에 저장된 이미지.

2. 기존에 저장된 이미지에 추가

3. 지우개 버튼 클릭해서 화면 터치한경우

4. 펜모드로 바꿔 화면을 터치하면 다시 3번 이미지 상태로 돌아갑니다.