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

안드로이드 캔버스 그리기 질문입니다.

0 추천

캔버스 관련 질문입니다. 첫 번째로 아무곳에 화면을 터치할 때 원이 생기게 하고 다른 곳에 두 번째 터치할 때도 원이 생기면서 첫 번째 원과 직선으로 연결되는 라인이 뜨게 하려고 합니다. 계속 터치할때마다 원이 생기며 그 전에 원과 직선으로 연결시키고 싶은데 어떻게 해야할지 감이 안오네요. invalidate 때문인지 계속 갱신되면서 사라지는데 createbitmap을 해야할지..아래는 실패한 코드입니다.

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyPaintView(this));
        setTitle("FIN01");
    }

    private static class MyPaintView extends View {
        int startX, startY, stopX, stopY = -1;

        public MyPaintView(Context context) { super(context); }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            Paint myPaint = new Paint();
            myPaint.setAntiAlias(true);
            myPaint.setStrokeWidth(10);
            myPaint.setStyle(Paint.Style.FILL);
            myPaint.setColor(Color.BLUE);

            if(startX > 0 && startY > 0) {
                canvas.drawCircle(startX - 5, startY - 5, 30, myPaint);
            }
            canvas.drawLine(startX, startY, stopX - 5, stopY - 5, myPaint);
        }
        
        @Override
        public boolean onTouchEvent(MotionEvent event) {

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    startX = (int) event.getX();
                    startY = (int) event.getY();
                    break;
                case MotionEvent.ACTION_UP:
                    stopX = (int) event.getX();
                    stopY = (int) event.getY();
                    this.invalidate();
            }
            return true;
        }
    }
litdalit (160 포인트) 님이 2021년 12월 11일 질문

1개의 답변

+1 추천
 
채택된 답변
간단히 수정해본 코드입니다. 도움이 되셨으면 좋겠네요.

public class MainActivity extends AppCompatActivity {
    List<MyPos> g_arr;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyPaintView(this));
        setTitle("FIN01");
        g_arr = new ArrayList<>();
    }

    private class MyPos{
        public int posX;
        public int posY;
    }

    private class MyPaintView extends View {
        int startX, startY, stopX, stopY = -1;

        public MyPaintView(Context context) {
            super(context);
        }

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            Paint myPaint = new Paint();
            myPaint.setAntiAlias(true);
            myPaint.setStrokeWidth(10);
            myPaint.setStyle(Paint.Style.FILL);
            myPaint.setColor(Color.BLUE);

            if(g_arr.size()>0) {
                for (int i = 0; i < g_arr.size(); i++) {
                    canvas.drawCircle(g_arr.get(i).posX - 5, g_arr.get(i).posY - 5, 30, myPaint);
                    if (i > 0) {
                        canvas.drawLine(g_arr.get(i-1).posX - 5, g_arr.get(i-1).posY - 5, g_arr.get(i).posX - 5, g_arr.get(i).posY - 5, myPaint);
                    }
                }
            }

        }

        @Override
        public boolean onTouchEvent(MotionEvent event) {

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    break;
                case MotionEvent.ACTION_UP:
                    MyPos myPos = new MyPos();
                    myPos.posX = (int) event.getX();
                    myPos.posY = (int) event.getY();
                    g_arr.add(myPos);

                    this.invalidate();
            }
            return true;
        }
    }
}
익명사용자 님이 2021년 12월 15일 답변
litdalit님이 2021년 12월 15일 채택됨
공부가 됐습니다. 정말 감사합니다
...