diff --git a/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PlacementGuideView.kt b/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PlacementGuideView.kt index c06194d..8d9b8c6 100644 --- a/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PlacementGuideView.kt +++ b/app/src/main/java/com/example/medilightv2android/ui/views/monitoring/PlacementGuideView.kt @@ -368,6 +368,13 @@ fun PlacementGuideView(appState: AppState) { com.example.medilightv2android.R.drawable.sensor_device, ).asImageBitmap() } + // 방향 화살표 PNG (132x112, 우향). 회전 + tint 로 4방향 + 색감 통일. + val arrowBitmap = remember { + android.graphics.BitmapFactory.decodeResource( + context.resources, + com.example.medilightv2android.R.drawable.arrow_transparent, + ).asImageBitmap() + } Canvas(modifier = Modifier.fillMaxSize()) { val w = size.width val h = size.height @@ -416,41 +423,59 @@ fun PlacementGuideView(appState: AppState) { alpha = 0.95f, ) - // ── 방향 화살표 (센서/타원 바깥) — 매 refresh 마다 alpha 깜빡임 ── - // 색감 #FF5722 → #E64A19 (deep orange 700, 일러스트와 톤 맞춤) - // StrokeCap.Round로 끝부분 둥글게 + 굵기 9→10 (가독성) + // ── 방향 화살표 (PNG icon, rotate + tint) — 매 refresh 마다 alpha 깜빡임 ── + // arrow_transparent.png 는 우향(→) 132×112. 회전으로 4방향 처리. + // tint = deep orange 700 (#E64A19) — 일러스트 톤 맞춤 + alpha 로 blink. if (!greenZone) { - val arrowColor = Color(0xFFE64A19).copy(alpha = arrowAlpha) - val arrowLen = 70f - val arrowHead = 28f - val sw = 10f - val cap = androidx.compose.ui.graphics.StrokeCap.Round + val arrowDrawW = 90f + val arrowDrawH = arrowDrawW * (arrowBitmap.height.toFloat() / arrowBitmap.width.toFloat()) val sensorHalfH = h * 0.08f + val gap = 20f - when { - directionIcon.contains("up") -> { - val ay = bladderCy - bladderRy - sensorHalfH - 20f - drawLine(arrowColor, Offset(cx, ay + arrowLen), Offset(cx, ay), strokeWidth = sw, cap = cap) - drawLine(arrowColor, Offset(cx - arrowHead, ay + arrowHead), Offset(cx, ay), strokeWidth = sw, cap = cap) - drawLine(arrowColor, Offset(cx + arrowHead, ay + arrowHead), Offset(cx, ay), strokeWidth = sw, cap = cap) - } - directionIcon.contains("down") -> { - val ay = bladderCy + bladderRy + sensorHalfH + 20f - drawLine(arrowColor, Offset(cx, ay - arrowLen), Offset(cx, ay), strokeWidth = sw, cap = cap) - drawLine(arrowColor, Offset(cx - arrowHead, ay - arrowHead), Offset(cx, ay), strokeWidth = sw, cap = cap) - drawLine(arrowColor, Offset(cx + arrowHead, ay - arrowHead), Offset(cx, ay), strokeWidth = sw, cap = cap) - } - directionIcon.contains("left") -> { - val ax = cx - bladderRx - 30f - drawLine(arrowColor, Offset(ax + arrowLen, bladderCy), Offset(ax, bladderCy), strokeWidth = sw, cap = cap) - drawLine(arrowColor, Offset(ax + arrowHead, bladderCy - arrowHead), Offset(ax, bladderCy), strokeWidth = sw, cap = cap) - drawLine(arrowColor, Offset(ax + arrowHead, bladderCy + arrowHead), Offset(ax, bladderCy), strokeWidth = sw, cap = cap) - } - directionIcon.contains("right") -> { - val ax = cx + bladderRx + 30f - drawLine(arrowColor, Offset(ax - arrowLen, bladderCy), Offset(ax, bladderCy), strokeWidth = sw, cap = cap) - drawLine(arrowColor, Offset(ax - arrowHead, bladderCy - arrowHead), Offset(ax, bladderCy), strokeWidth = sw, cap = cap) - drawLine(arrowColor, Offset(ax - arrowHead, bladderCy + arrowHead), Offset(ax, bladderCy), strokeWidth = sw, cap = cap) + // 화살표 center 위치 + 회전 각도 (icon 이 우향이므로 right=0°) + data class ArrowPlacement(val cxa: Float, val cya: Float, val rot: Float) + val placement: ArrowPlacement? = when { + directionIcon.contains("up") -> ArrowPlacement( + cx, + bladderCy - bladderRy - sensorHalfH - gap - arrowDrawH / 2f, + -90f, + ) + directionIcon.contains("down") -> ArrowPlacement( + cx, + bladderCy + bladderRy + sensorHalfH + gap + arrowDrawH / 2f, + 90f, + ) + directionIcon.contains("left") -> ArrowPlacement( + cx - bladderRx - gap - arrowDrawW / 2f, + bladderCy, + 180f, + ) + directionIcon.contains("right") -> ArrowPlacement( + cx + bladderRx + gap + arrowDrawW / 2f, + bladderCy, + 0f, + ) + else -> null + } + if (placement != null) { + val tint = androidx.compose.ui.graphics.ColorFilter.tint( + Color(0xFFE64A19).copy(alpha = arrowAlpha) + ) + rotate(degrees = placement.rot, pivot = Offset(placement.cxa, placement.cya)) { + drawImage( + image = arrowBitmap, + srcOffset = androidx.compose.ui.unit.IntOffset.Zero, + srcSize = androidx.compose.ui.unit.IntSize(arrowBitmap.width, arrowBitmap.height), + dstOffset = androidx.compose.ui.unit.IntOffset( + (placement.cxa - arrowDrawW / 2f).toInt(), + (placement.cya - arrowDrawH / 2f).toInt(), + ), + dstSize = androidx.compose.ui.unit.IntSize( + arrowDrawW.toInt(), + arrowDrawH.toInt(), + ), + colorFilter = tint, + ) } } } diff --git a/app/src/main/res/drawable/arrow_transparent.png b/app/src/main/res/drawable/arrow_transparent.png new file mode 100644 index 0000000..7b4a6b8 Binary files /dev/null and b/app/src/main/res/drawable/arrow_transparent.png differ