본문 바로가기

대학교 과제/모바일프로그래밍 [ 2 - 2 ]

[모바일 프로그래밍 과제] - 9주차 ( Paint 메소드, ArrayList)

반응형

1.과제  안내문, 예시 출력화면


과제안내문


 C++을 공부할 때 Vector와 같은 STL 자료구조에 대해 공부한적이 있었다. 자바에서는 가변저항을 사용한 적은 없지만 이렇게 공부한 덕분에 조금 쉽게 이해할 수 있었다. 아십게도 자바의 가변저항에 대해서는 자세하게 설명하지 않을 것이다. 이 과제는 Paint() 클래스를 다루는 과제이기 때문이다. 다음은 문제 풀이이다.

 

2. 문제풀이

 

- ArrayList

 

 그래도 ArrayList에 대한 기본적인 설명은 하고자 한다. ArrayList는 다음과 같이 선언할 수 있다.

 

ArrayList<자료형> 리스트이름 = new ArrayList<자료형>();

 

 ArrayList의 가장 좋은 점은 가변리스트 즉, 초반에 크기를 정하지 않아도 되는 리스트라는 것이다. 백준을 많이 풀어보신 분은 알겠지만, 이것은 정말 큰 장점이다. 리스트에 요소를 추가하는 방법은 다음과 같다.

 

리스트이름.add(데이터);

 

 이렇게 추가된 데이터는 리스트의 가장 마지막 순서로 추가된다.

 

- onDraw() 메소드

 

 onDraw() 메소드의 경우 Paint객체를 선언해 다양한 그림을 그릴 수 있는 메소드이다. 보통은 레이아웃을 대신할 새로운 클래스를 만들고 그 안에 넣어주는 경우가 많다. 필자도 MyGraphicView라는 새로운 클래스를 만들고 이를 setContentView()메소드를 통해 레이아웃으로 지정해주었다.다음은 필자가 작성한 클래스와 메소드이다.

 

private static class MyGraphicView extends View {

    ArrayList<Point> pointList = new ArrayList<Point>();

    public MyGraphicView(Context context){
        super(context);
    }
    public boolean onTouchEvent(MotionEvent event){

        if(event.getAction() == MotionEvent.ACTION_UP){
            Point point = new Point();
            point.setX((int) event.getX());
            point.setY((int) event.getY());
            pointList.add(point);
            this.invalidate();
        }
        return true;
    }

    protected void onDraw(Canvas canvas){
        super.onDraw(canvas);
        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStrokeWidth(0);
        paint.setColor(Color.RED);

        for(Point p : pointList){
            canvas.drawCircle(p.getX(),p.getY(),100,paint);
        }

    }
}

 

 여기서 onTouchEvent() 메소드를 추가하여 화면을 터지할 때마다 동작할 코드를 작성하였다.  그 전에 먼저 Point Class에 대해 설명하겠다. onDraw()메소드를 통해 원을 그리려면 drawCircle()메소드를 사용하면 된다. 여기서는 원이 생성될 중점의 x좌표와 y좌표의 위치가 필요한데, 결국 이 두가지를 멤버로 가지는 Point클래스를 작성하였다. 다음은 Point Class이다.

 

private static class Point{

	private int x;
    private int y;

	public Point(){
        x = y = -1;
    }

    public int getX() {return x;}
    public int getY() {return y;}
    public void setX(int input) {x = input;}
    public void setY(int input) {y = input;}
}

 

- 알고리즘

 

 알고리즘은 간단하다. OnDraw() 메소드와 같은 경우, 전에 그린 도형이나 기록들은 삭제한 후 안에 있는 코드를 다시 실행하게 된다. 따라서 그전에 그렸던 원들을 저장하는 공간이 필요한데, 그것이 바로 pointList이다. 버튼을 터치할 때마다 이 리스트  안에 포인트들을 저장한 후, 저장과 동시에 this.invalidate() 메소드를 통해 기존에 그려진 것들을 초기화 하고, OnDraw() 메소들을 다시 실행한다. 그렇게 되면 리스트에 저장된 포인트들의 값으로 원들이 그려진다. 다음은 전체  코드이다.

 

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MyGraphicView(this));
    }

    private static class MyGraphicView extends View {

        ArrayList<Point> pointList = new ArrayList<Point>();

        public MyGraphicView(Context context){
            super(context);
        }
        public boolean onTouchEvent(MotionEvent event){

            if(event.getAction() == MotionEvent.ACTION_UP){
                Point point = new Point();
                point.setX((int) event.getX());
                point.setY((int) event.getY());
                pointList.add(point);
                this.invalidate();
            }
            return true;
        }

        protected void onDraw(Canvas canvas){
            super.onDraw(canvas);
            Paint paint = new Paint();
            paint.setAntiAlias(true);
            paint.setStrokeWidth(0);
            paint.setColor(Color.RED);



            for(Point p : pointList){
                canvas.drawCircle(p.getX(),p.getY(),100,paint);
            }

        }
    }

    private static class Point{

        private int x;
        private int y;

        public Point(){
            x = y = -1;
        }

        public int getX() {return x;}
        public int getY() {return y;}
        public void setX(int input) {x = input;}
        public void setY(int input) {y = input;}
    }

}
반응형