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

안드로이드] 글 색 변경하는 방법 좀 알려주세요!

0 추천

안드로이드 개발을 얼마 하지 않는 초보 개발자입니다. 

지금 그림판을 만들고 있는데...

view에 선을 그리고 

color picker dialog를 사용해서 색 값을 가져오는 것 까지 만들었는데...

색 값을 가져와서 그리면 이미 그린 선들도 색이 다 바뀌어 져 버립니다..ㅠㅠ

이럴땐 어떻게 해야 되나요...ㅠㅠ

그림1그림2

익명사용자 님이 2014년 2월 10일 질문
하나의 뷰안에 페인트 객체 또한 하나인 상태에서 그림을 그리고
인밸리데잇 또는 온드로우에서 새로 그릴테니까 같은 색으로 모두 변경될 수 밖에 없음.

컬러 변경버튼을 추가해서 페인트 객체를 새로 생성해주시면 될거같은데용?

1개의 답변

0 추천
 
채택된 답변
음.. 저는 단색만 사용해서...

일단 제가 생각하는 바를 적어보겠습니다.

redo 기능이 없다는 가정하에서..

ColorPickerDialog 를 실행하기전에 기존에 그려진 선들을 객체로 저장하고 있지 말고, 화면에 그려진 전체를 Bitmap으로 여지껏 그려진 것을 보관하는 것이죠.. 물론 기존에 그려진 선에 대한 객체리스트는 초기화 하고요.. 이러면 일단 색이 변하는 일은 없을 건데.. redo 기능을 구현하기가 힘들겠죠..

 

redo 기능을 구현한다고 하면.. 저같으면 선을 그릴때마다 선을 그릴때 사용한 페인트 객체와 선을 그릴때 사용한 위치정보를 저장할 수 있는 클래스를 만들고 이를 리스트로 관리하게끔 만들 것 같은데요..
dante2k (8,390 포인트) 님이 2014년 2월 11일 답변
먼저 답변에 감사드립니다. ㅎㅎ
근데 아직도 잘 모르겠어서
제가 작성한 코드를 좀 봐주실면 안될까요..ㅠㅠ

--------------------------------------------------------------------------------------------------

import java.util.ArrayList;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.Xfermode;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;

class MyView extends View{
    private Context context;
    public static ArrayList<Vortex> list;
    public static ArrayList<Vortex> save_list;
    private final int CASE_PEN=1;
    private final int CASE_TEXT=2;
    private final int CASE_ERASER=3;
   
    public MyView(Context context) {
            super(context);
            this.context = context;
            list =new ArrayList<Vortex>();
            // TODO Auto-generated constructor stub
        }
    public MyView(Context context,AttributeSet attrs){
        super(context,attrs);
        list =new ArrayList<Vortex>();
    }
    @SuppressLint("DrawAllocation")
    public void onDraw(Canvas canvas){
        canvas.drawColor(Color.WHITE);
        switch(canvas01.m_select_case){
        case CASE_PEN:
            Paint pnt = new Paint();
            Paint b_pnt = new Paint();
            b_pnt.setColor(canvas01.m_pen_color);
            pnt.setAntiAlias(true);
            b_pnt.setAntiAlias(true);
            pnt.setStrokeWidth(canvas01.m_pen_border);
            b_pnt.setStrokeWidth(canvas01.m_pen_border);
            //pnt.setColor(m_pen_color);
            canvas.save();
            if(canvas01.m_pen_color==0){
                pnt.setColor(Color.BLACK);
                for(int i=0;i<list.size();i++){
                    if(list.get(i).isDraw)
                    {
                        canvas.drawLine(list.get(i-1).x,list.get(i-1).y,list.get(i).x,list.get(i).y, pnt);
                    }
                }
            }else{
                for(int i=0;i<list.size();i++){
                    if(list.get(i).isDraw)
                    {
                        canvas.drawLine(list.get(i-1).x,list.get(i-1).y,list.get(i).x,list.get(i).y, b_pnt);
                    }
                }
            }
            //canvas.
           
            break;
        case CASE_TEXT:
            break;
        case CASE_ERASER:
            Paint p_eraser = new Paint();
            Xfermode xmode = new PorterDuffXfermode(PorterDuff.Mode.CLEAR);
            p_eraser.setXfermode(xmode);
           
            for(int i=0;i<list.size();i++){
                if(list.get(i).isDraw)
                {
                    canvas.drawLine(list.get(i-1).x,list.get(i-1).y,list.get(i).x,list.get(i).y, p_eraser);
                }
            }
            break;
        default:
            break;
        }
    }
   
    public boolean onTouchEvent(MotionEvent me){
        int actionId = me.getAction();
        switch(actionId)
        {
        case MotionEvent.ACTION_DOWN :
            list.add(new Vortex(me.getX(),me.getY(),false));
            return true;
        case MotionEvent.ACTION_MOVE :
            Vortex v = new Vortex(me.getX(), me.getY(), true);
            list.add(v);
            this.invalidate();
            return true;
        case MotionEvent.ACTION_UP:
            return true;
        }
        return false;
    }
}
Vortex 객체에 색상 정보 저장하는 필드를 만들어서
해당 객체를 그릴때마다 저장된 색상 정보로 펜의 색상을 바꿔주면 될거 같은데요..
와!!!! 정말 감사합니다!!!
말씀대로 Vortex객체에 색상 정보 입력하고
onDraw에서
pnt.setColor(canvas01.list.get(i).pen_color);
canvas.drawLine(canvas01.list.get(i-1).x,canvas01.list.get(i-1).y,canvas01.list.get(i).x,canvas01.list.get(i).y, pnt);
이렇게 하니까 바로 그려지네요!! 진짜 감사합니다.
...