Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[둘리] 뷰 챌린지 미션 1단계 제출합니다. #14

Merged
merged 24 commits into from
Oct 1, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
ed6898e
feat: 레이아웃 그리기
hyemdooly Sep 29, 2023
0e4dbd0
feat: 선을 그릴 수 있는 기능 추가
hyemdooly Sep 29, 2023
4b31375
feat: button listener 설정
hyemdooly Sep 29, 2023
970025b
feat: UI State 추가
hyemdooly Sep 29, 2023
56ddb01
feat: RecyclerView 어댑터 연결
hyemdooly Sep 29, 2023
14a1889
feat: PaintView 연결
hyemdooly Sep 29, 2023
cacf0fd
feat: Point 생성
hyemdooly Sep 29, 2023
2a97a99
refactor: 네이밍 수정 및 함수 리팩터링
hyemdooly Sep 29, 2023
37d0ad4
feat: Line 클래스 생성
hyemdooly Sep 29, 2023
7a8823e
refactor: 아이템 높이, 너비 변경
hyemdooly Sep 29, 2023
9b6da38
refactor: 패키지 이동
hyemdooly Sep 29, 2023
71214e0
feat: 각각 다른 paint에 대한 line 그리기 지원
hyemdooly Sep 29, 2023
100f930
feat: colors 뷰 margin 적용
hyemdooly Sep 29, 2023
93ab0a8
refactor: 필요없는 플러그인 삭제, 네이밍 변경
hyemdooly Oct 1, 2023
68e1f78
refactor: DataBindingUtil 대신 다른 코드로 변경
hyemdooly Oct 1, 2023
cc8c325
refactor: 변수 네이밍 변경
hyemdooly Oct 1, 2023
8783cab
refactor: 구성 변경 대응 및 CanvasView에서 CustomColor를 사용하도록 수정
hyemdooly Oct 1, 2023
ed6ecda
refactor: 코드 줄임
hyemdooly Oct 1, 2023
6852594
refactor: CustomColor 네이밍 수정
hyemdooly Oct 1, 2023
89deedc
refactor: 함수 네이밍 수정
hyemdooly Oct 1, 2023
2c91a84
refactor: 설정이 바뀌었을 때만 line을 추가하도록 수정
hyemdooly Oct 1, 2023
894e464
refactor: 네이밍 수정
hyemdooly Oct 1, 2023
e0fc87e
refactor: ktlint 재적용
hyemdooly Oct 1, 2023
345cc70
refactor: default 값 이동
hyemdooly Oct 1, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
feat: 선을 그릴 수 있는 기능 추가
  • Loading branch information
hyemdooly committed Sep 29, 2023
commit 0e4dbd04f6974ada146883ba79efbad9487dc421
8 changes: 7 additions & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@

plugins {
id("com.android.application")
id("org.jetbrains.kotlin.android")
id("kotlin-kapt")
tmdgh1592 marked this conversation as resolved.
Show resolved Hide resolved
}

android {
Expand All @@ -22,7 +24,7 @@ android {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
"proguard-rules.pro",
)
}
}
Expand All @@ -33,6 +35,10 @@ android {
kotlinOptions {
jvmTarget = "11"
}

buildFeatures {
dataBinding = true
}
}

dependencies {
Expand Down
11 changes: 8 additions & 3 deletions app/src/main/java/woowacourse/paint/MainActivity.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,18 @@ package woowacourse.paint

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity

import androidx.databinding.DataBindingUtil
import woowacourse.paint.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
setupBinding()
}

private fun setupBinding() {
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
tmdgh1592 marked this conversation as resolved.
Show resolved Hide resolved
binding.lifecycleOwner = this
}
}
47 changes: 46 additions & 1 deletion app/src/main/java/woowacourse/paint/PaintView.kt
Original file line number Diff line number Diff line change
@@ -1,7 +1,52 @@
package woowacourse.paint

import android.content.Context
import android.graphics.Canvas
import android.graphics.Color
import android.graphics.Paint
import android.graphics.Path
import android.graphics.Point
import android.util.AttributeSet
import android.view.MotionEvent
import android.view.View

class PaintView(context: Context) : View(context) {
class PaintView(context: Context, attr: AttributeSet) : View(
context,
attr,
) {
private val path = Path()
private val paint = Paint()

private var startPoint = Point()

init {
paint.isAntiAlias = true
paint.color = Color.BLACK
paint.style = Paint.Style.STROKE
paint.strokeJoin = Paint.Join.ROUND
paint.strokeWidth = 5f // 선의 두께를 조절할 수 있습니다.
}

override fun onDraw(canvas: Canvas) {
super.onDraw(canvas)
canvas.drawPath(path, paint)
}

override fun onTouchEvent(event: MotionEvent): Boolean {
val pointX = event.x
val pointY = event.y

when (event.action) {
MotionEvent.ACTION_DOWN -> startPoint = Point(pointX.toInt(), pointY.toInt())
MotionEvent.ACTION_MOVE -> {
path.moveTo(startPoint.x.toFloat(), startPoint.y.toFloat())
path.lineTo(pointX, pointY)
startPoint = Point(pointX.toInt(), pointY.toInt())
invalidate()
}

else -> super.onTouchEvent(event)
}
return true
}
}
120 changes: 62 additions & 58 deletions app/src/main/res/layout/activity_main.xml
Original file line number Diff line number Diff line change
@@ -1,59 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http:https://schemas.android.com/apk/res/android"
xmlns:app="http:https://schemas.android.com/apk/res-auto"
xmlns:tools="http:https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<woowacourse.paint.PaintView
android:id="@+id/pv_paper"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/rs_thickness_changer"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<com.google.android.material.slider.RangeSlider
android:id="@+id/rs_thickness_changer"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/rv_colors"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_colors"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/rs_thickness_changer"
tools:listitem="@layout/item_color_palette" />

<Button
android:id="@+id/btn_change_color"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="@string/main_change_color"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/btn_change_thickness"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent" />

<Button
android:id="@+id/btn_change_thickness"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="@string/main_change_thickness"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/btn_change_color"
app:layout_constraintTop_toBottomOf="@id/rv_colors" />


</androidx.constraintlayout.widget.ConstraintLayout>
<layout>


<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http:https://schemas.android.com/apk/res/android"
xmlns:app="http:https://schemas.android.com/apk/res-auto"
xmlns:tools="http:https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">

<woowacourse.paint.PaintView
android:id="@+id/pv_paper"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/rs_thickness_changer"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />

<com.google.android.material.slider.RangeSlider
android:id="@+id/rs_thickness_changer"
android:layout_width="0dp"
android:layout_height="wrap_content"
app:layout_constraintBottom_toTopOf="@id/rv_colors"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv_colors"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/rs_thickness_changer"
tools:listitem="@layout/item_color_palette" />

<Button
android:id="@+id/btn_change_color"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="@string/main_change_color"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@id/btn_change_thickness"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintStart_toStartOf="parent" />

<Button
android:id="@+id/btn_change_thickness"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_margin="10dp"
android:text="@string/main_change_thickness"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@id/btn_change_color"
app:layout_constraintTop_toBottomOf="@id/rv_colors" />


</androidx.constraintlayout.widget.ConstraintLayout>
</layout>