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

안드로이드 서버에 저장된 이미지를 불러와 수정하는 방법 문의

0 추천

안녕하세요. 안드로이드 초보 개발자입니다..(구글링으로 소스찾아가면서 하고있습니다...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번 이미지 상태로 돌아갑니다.

REDORI (350 포인트) 님이 2018년 1월 30일 질문
REDORI님이 2018년 1월 30일 수정
답변좀부탁드립니다. TT
아주 많은 수정이필요한건가요 T_T?

답변 달기

· 글에 소스 코드 보기 좋게 넣는 법
· 질문에 대해 추가적인 질문이나 의견이 있으면 답변이 아니라 댓글로 달아주시기 바랍니다.
표시할 이름 (옵션):
개인정보: 당신의 이메일은 이 알림을 보내는데만 사용됩니다.
스팸 차단 검사:
스팸 검사를 다시 받지 않으려면 로그인하거나 혹은 가입 하세요.
...