package com.example.android1127;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.MotionEvent;
import android.view.View;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
final static int LINE = 1, CIRCLE = 2, RECTANGLE = 3;
static int curShape = LINE;
@Override
public boolean onCreateOptionsMenu(Menu menu){
super.onCreateOptionsMenu(menu);
menu.add(0,1,0,"선 그리기");
menu.add(0,2,0,"원 그리기");
menu.add(0,3,0,"사각형 그리기");
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item){
switch (item.getItemId()){
case 1:
curShape = LINE;
return true;
case 2:
curShape = CIRCLE;
return true;
case 3:
curShape = RECTANGLE;
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(new MyGraphicView(this));
setTitle("my 그림판");
}
// ⭐ 저장할 도형 클래스
private static class Shape {
int type, startX, startY, stopX, stopY;
Shape(int type, int sx, int sy, int ex, int ey){
this.type = type;
this.startX = sx;
this.startY = sy;
this.stopX = ex;
this.stopY = ey;
}
}
private class MyGraphicView extends View {
int startX = -1, startY = -1, stopX = -1, stopY = -1;
// ⭐ 도형 저장 리스트
ArrayList<Shape> shapeList = new ArrayList<>();
public MyGraphicView(Context context) {
super(context);
}
@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_MOVE:
stopX = (int)event.getX();
stopY = (int)event.getY();
invalidate();
break;
case MotionEvent.ACTION_UP:
stopX = (int)event.getX();
stopY = (int)event.getY();
// ⭐ 사용자가 손을 떼면 도형 저장
shapeList.add(new Shape(curShape, startX, startY, stopX, stopY));
invalidate();
break;
}
return true;
}
@Override
protected void onDraw(Canvas canvas){
super.onDraw(canvas);
Paint paint = new Paint();
paint.setAntiAlias(true);
paint.setStrokeWidth(5f);
paint.setStyle(Paint.Style.STROKE);
paint.setColor(Color.RED);
// ⭐ 이미 그려진 도형들을 모두 다시 그림
for (Shape s : shapeList){
drawShape(canvas, paint, s);
}
// 아직 손을 떼기 전 드래그 중일 때 보여주는 미리보기
if (startX >=0 && stopX >= 0){
Shape temp = new Shape(curShape, startX, startY, stopX, stopY);
drawShape(canvas, paint, temp);
}
}
// ⭐ 도형 그리는 공통 메서드
private void drawShape(Canvas canvas, Paint paint, Shape s){
switch (s.type){
case LINE:
canvas.drawLine(s.startX, s.startY, s.stopX, s.stopY, paint);
break;
case CIRCLE:
int radius = (int) Math.sqrt(
Math.pow(s.stopX - s.startX, 2) +
Math.pow(s.stopY - s.startY, 2)
);
canvas.drawCircle(s.startX, s.startY, radius, paint);
break;
case RECTANGLE:
canvas.drawRect(
Math.min(s.startX, s.stopX),
Math.min(s.startY, s.stopY),
Math.max(s.startX, s.stopX),
Math.max(s.startY, s.stopY),
paint
);
break;
}
}
}
}

Empty Activity의 경우 기본으로 설정된 언어가 kt라 java로 작성하고 싶다면
어쩔 수 없이 Empty Views Activity를 활용해 작성해야 한다.
하지만 그럴 경우 메뉴창, 타이틀이 출력되지 않는 문제가 있다.
이 문제를 해결하기 위해서는 보통 values -> themes -> themes.xml 파일로 들어가
숨김처리된 메뉴바를 활성화해야한다.
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<style name="Base.Theme.Android1127" parent="Theme.Material3.DayNight.NoActionBar">
<!-- Customize your light theme here. -->
<!-- <item name="colorPrimary">@color/my_light_primary</item> -->
</style>
<style name="Theme.Android1127" parent="Base.Theme.Android1127" />
</resources>
위 코드를 아래코드로 수정하면 해결된다.
<resources xmlns:tools="http://schemas.android.com/tools">
<!-- Base application theme. -->
<!-- 'NoActionBar'를 제거하여 Material 3의 기본 Action Bar를 사용하도록 변경합니다. -->
<style name="Base.Theme.Android1127" parent="Theme.Material3.DayNight">
<!-- Customize your light theme here. -->
<!-- <item name="colorPrimary">@color/my_light_primary</item> -->
</style>
<style name="Theme.Android1127" parent="Base.Theme.Android1127" />
</resources>

//MainActivity.java
package com.example.a1127_3;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main1);
final Button button1 = findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final String[] versionArray = {"쫄면", "떡볶이", "김밥"};
final boolean[] checkArray = {true, false, true};
AlertDialog.Builder dlg = new AlertDialog.Builder(MainActivity.this);
dlg.setTitle("제목");
dlg.setIcon(R.mipmap.ic_launcher);
// ★ 다중 선택은 setMultiChoiceItems 사용
dlg.setMultiChoiceItems(versionArray, checkArray,
new DialogInterface.OnMultiChoiceClickListener() {
@Override
public void onClick(DialogInterface dialog, int which, boolean isChecked) {
// 체크된 항목을 버튼에 표시 (마지막 체크 기준)
button1.setText(versionArray[which]);
}
});
dlg.setPositiveButton("확인", null);
dlg.setNegativeButton("닫기", null);
dlg.show();
}
});
}
}
<!--main1.xml-->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button1"
android:text="목록 대화상자"
android:textSize="20dp"
/>
</LinearLayout>
사용자 정의 대화상자 시험범위
<!--main1.xml 1차 수정-->
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button1"
android:text="목록 대화상자"
android:textSize="20dp"
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tvName"
android:text="사용자 이름" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/tvEmail"
android:text="이메일"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/button2"
android:text="click here"/>
</LinearLayout>'computing' 카테고리의 다른 글
| javaweb 13 정리 (0) | 2025.11.26 |
|---|---|
| 20251124_iOS12 (0) | 2025.11.24 |
| 20251117 - iOS12 (0) | 2025.11.17 |
| android11 (0) | 2025.11.13 |
| 20251103_iOS10 (0) | 2025.11.03 |