본문 바로가기

동방프로젝트

실습, 직풀 9-2) 그림판 만들기

package com.example.helloandroid;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Build;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

@SuppressWarnings("deprecation")

//간단 그림판 앱.
//화면을 손가락으로 터치, 드래그해서 선 또는 원을 그리는 앱 작성
//선을 그릴지, 원을 그릴지 옵션으로 선택

public class MainActivity extends AppCompatActivity {

//전역상수 선언. 메뉴에서 선택한 것이 선인지 원인지 구분
final static int LINE=1, CIRCLE=2;
static int curShape=LINE;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyGraphView(this));
setTitle("간단 그림판");
}

//옵션메뉴는 onCreate()와 같은 레벨에서 만들어야 한다.
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, 1, 0, "선 그리기");
menu.add(0, 2, 0, "원 그리기");
return true;
}

public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()) {
case 1:
curShape = LINE;
return true;
case 2:
curShape=CIRCLE;
return true;
}
return super.onOptionsItemSelected(item);
}

private class MyGraphView extends View {
int startX=-1, startY=-1, stopX=-1, stopY=-1;
public MyGraphView(Context context) {
super(context);
}

@RequiresApi(api= Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onTouchEvent(MotionEvent event){
switch(event.getAction()) {
//처음 터치했을 때가 선의시작점 또는 원의 중심점이 됨
//이를 기억한다.
case MotionEvent.ACTION_DOWN:
startX=(int)event.getX();
startY=(int)event.getY();
break;
/*
화면을 터치한 상태에서 드래그하면 액션무브. 이를 up
, 즉 손가락을 화면에서 뗄 때의 효과와 동일취급하는
이유는, 드래그할 때마다 그려지는 선
이나 원이 손가락을 계속 따라다니며 흔적이 보이는
효과를 줘야하기 때문. 화면에서 손가락 때면 up발생
ontouchevent는 더이상 실행 안됨.
, 시작점과 끝점이 결정되는 것.
invalidate를 호출시, 화면이 무효화되고
ondarw()메소드를 자동으로 실행
*/
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
stopX=(int)event.getX();
stopY=(int)event.getY();
this.invalidate();
break;
}
return true;
}

protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();
//페인트에 선 두께, 채우기방법, 선 색상 지정
paint.setAntiAlias(true);
paint.setStrokeWidth(5);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.RED);

switch(curShape) {
case LINE:
canvas.drawLine(startX, startY, stopX, stopY,
paint);
break;
case CIRCLE:
int radius=(int)Math.sqrt(Math.pow(stopX-
startX, 2) + Math.pow(stopY-
startY, 2));
canvas.drawCircle(startX, startY, radius,
paint);
break;
}
}
}
}

///////////////////////

package com.example.helloandroid;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Build;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.SubMenu;
import android.view.View;

import androidx.annotation.RequiresApi;
import androidx.appcompat.app.AppCompatActivity;

@SuppressWarnings("deprecation")

//간단 그림판 앱.
//화면을 손가락으로 터치, 드래그해서 선 또는 원을 그리는 앱 작성
//선을 그릴지, 원을 그릴지 옵션으로 선택

//실습은, 클릭한 두 점을 끝점으로 하는 사각형이 추가로 그려지게 한다
//색상이 옶녀메뉴에서 선택되게 한다. 서브메뉴를 통해, r g b
public class MainActivity extends AppCompatActivity {

//전역상수 선언. 메뉴에서 선택한 것이 선인지 원인지 구분
final static int LINE=1, CIRCLE=2,RECT=3,
color_RED=4,color_GREEN=5,color_BLUE=6;
static int curShape=LINE;
int current_color=color_RED;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyGraphView(this));
setTitle("간단 그림판");
}

//옵션메뉴는 onCreate()와 같은 레벨에서 만들어야 한다.
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, 1, 0, "선 그리기");
menu.add(0, 2, 0, "원 그리기");
menu.add(0, 3, 0, "사각형 그리기");

SubMenu sub= menu.addSubMenu("색상 변경");
sub.add(0, 4, 0, "빨강");
sub.add(0, 5, 0, "녹색");
sub.add(0, 6, 0, "파랑");
return true;
}

public boolean onOptionsItemSelected(MenuItem item){
switch(item.getItemId()) {
case 1:
curShape = LINE;
return true;
case 2:
curShape=CIRCLE;
return true;
case 3:
curShape=RECT;
return true;
case 4:
current_color=color_RED;
return true;
case 5:
current_color=color_GREEN;
return true;
case 6:
current_color=color_BLUE;
return true;
}
return super.onOptionsItemSelected(item);
}

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

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

@RequiresApi(api= Build.VERSION_CODES.LOLLIPOP)
@Override
public boolean onTouchEvent(MotionEvent event){

switch(event.getAction()) {
//처음 터치했을 때가 선의시작점 또는 원의 중심점이 됨
//이를 기억한다.
case MotionEvent.ACTION_DOWN:
startX=(int)event.getX();
startY =(int)event.getY();
break;
/*
화면을 터치한 상태에서 드래그하면 액션무브. 이를 up
, 즉 손가락을 화면에서 뗄 때의 효과와 동일취급하는
이유는, 드래그할 때마다 그려지는 선
이나 원이 손가락을 계속 따라다니며 흔적이 보이는
효과를 줘야하기 때문. 화면에서 손가락 때면 up발생
ontouchevent는 더이상 실행 안됨.
, 시작점과 끝점이 결정되는 것.
invalidate를 호출시, 화면이 무효화되고
ondarw()메소드를 자동으로 실행
*/
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_UP:
stopX=(int)event.getX();
stopY=(int)event.getY();
this.invalidate();
break;
}
return true;
}

protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint=new Paint();
//페인트에 선 두께, 채우기방법, 선 색상 지정
paint.setAntiAlias(true);
paint.setStrokeWidth(5);
paint.setStyle(Paint.Style.STROKE);
// paint.setColor(Color.RED);

switch(curShape) {
case LINE:
canvas.drawLine(startX, startY, stopX, stopY,
paint);
break;
case CIRCLE:
int radius=(int)Math.sqrt(Math.pow(stopX-
startX, 2) + Math.pow(stopY-
startY, 2));
canvas.drawCircle(startX, startY, radius,
paint);
break;
case RECT:
canvas.drawRect(new Rect(startX, startY,
stopX, stopY), paint);
break;
}

switch(current_color)
{
case color_RED:
paint.setColor(Color.RED);
break;
case color_GREEN:
paint.setColor(Color.GREEN);
break;
case color_BLUE:
paint.setColor(Color.BLUE);
break;
}
}
}
}

'동방프로젝트' 카테고리의 다른 글

개선그림판 9-3  (2) 2020.08.17
그림판 만들기(9-3)  (0) 2020.08.17
실습, 직풀 8-2)  (0) 2020.08.17
sd카드 작업 1  (0) 2020.08.16
직풀 8-1  (0) 2020.08.16