Skip to content

Commit 27903c2

Browse files
Restrict Android builds to arm64-v8a
1 parent 04a8629 commit 27903c2

2 files changed

Lines changed: 49 additions & 9 deletions

File tree

android/app/build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,10 @@ android {
1616
versionCode = 1
1717
versionName = "1.0"
1818

19+
ndk {
20+
abiFilters += "arm64-v8a"
21+
}
22+
1923
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
2024
}
2125

android/app/src/main/java/com/clhs/score/ui/SubjectComponents.kt

Lines changed: 45 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import androidx.compose.ui.Alignment
3434
import androidx.compose.ui.Modifier
3535
import androidx.compose.ui.draw.clip
3636
import androidx.compose.ui.graphics.Color
37+
import androidx.compose.ui.layout.Layout
3738
import androidx.compose.ui.text.font.FontWeight
3839
import androidx.compose.ui.unit.dp
3940
import androidx.compose.ui.unit.sp
@@ -45,6 +46,7 @@ import com.clhs.score.data.scoreDistributions
4546
import com.clhs.score.data.shortenSubjectName
4647
import kotlinx.coroutines.delay
4748
import kotlin.math.floor
49+
import kotlin.math.roundToInt
4850

4951
private val SubjectPositive = Color(0xFF0B7D3B)
5052
private val SubjectWarning = Color(0xFFE87500)
@@ -304,9 +306,15 @@ private fun DistributionRow(item: com.clhs.score.data.ScoreDistribution, total:
304306

305307
@Composable
306308
internal fun StandardPositionBar(score: Double, standard: GradeStandard) {
307-
val marks = listOfNotNull(standard.bottom, standard.back, standard.average, standard.front, standard.top)
308-
val low = marks.minOrNull() ?: 0.0
309-
val high = marks.maxOrNull()?.coerceAtLeast(low + 1.0) ?: 100.0
309+
val marks = listOfNotNull(
310+
standard.bottom?.let { StandardMarkSpec("", it) },
311+
standard.back?.let { StandardMarkSpec("", it) },
312+
standard.average?.let { StandardMarkSpec("", it) },
313+
standard.front?.let { StandardMarkSpec("", it) },
314+
standard.top?.let { StandardMarkSpec("", it) },
315+
)
316+
val low = marks.minOfOrNull { it.value } ?: 0.0
317+
val high = marks.maxOfOrNull { it.value }?.coerceAtLeast(low + 1.0) ?: 100.0
310318
val fraction = ((score - low) / (high - low)).coerceIn(0.0, 1.0).toFloat()
311319
Column(verticalArrangement = Arrangement.spacedBy(8.dp)) {
312320
Text("班級五標", style = MaterialTheme.typography.labelLarge, color = MaterialTheme.colorScheme.onSurfaceVariant)
@@ -330,12 +338,40 @@ internal fun StandardPositionBar(score: Double, standard: GradeStandard) {
330338
.background(MaterialTheme.colorScheme.outlineVariant, RoundedCornerShape(999.dp)),
331339
)
332340
}
333-
Row(horizontalArrangement = Arrangement.spacedBy(8.dp), modifier = Modifier.fillMaxWidth()) {
334-
StandardMark(modifier = Modifier.weight(1f), label = "", value = standard.bottom)
335-
StandardMark(modifier = Modifier.weight(1f), label = "", value = standard.back)
336-
StandardMark(modifier = Modifier.weight(1f), label = "", value = standard.average)
337-
StandardMark(modifier = Modifier.weight(1f), label = "", value = standard.front)
338-
StandardMark(modifier = Modifier.weight(1f), label = "", value = standard.top)
341+
ProportionalStandardMarks(marks = marks, low = low, high = high)
342+
}
343+
}
344+
345+
private data class StandardMarkSpec(
346+
val label: String,
347+
val value: Double,
348+
)
349+
350+
@Composable
351+
private fun ProportionalStandardMarks(marks: List<StandardMarkSpec>, low: Double, high: Double) {
352+
val range = (high - low).takeIf { it > 0.0 } ?: 1.0
353+
Layout(
354+
modifier = Modifier.fillMaxWidth(),
355+
content = {
356+
marks.forEach { mark ->
357+
StandardMark(modifier = Modifier, label = mark.label, value = mark.value)
358+
}
359+
},
360+
) { measurables, constraints ->
361+
val placeables = measurables.map { measurable ->
362+
measurable.measure(constraints.copy(minWidth = 0))
363+
}
364+
val width = constraints.maxWidth
365+
val height = placeables.maxOfOrNull { it.height } ?: 0
366+
layout(width, height) {
367+
placeables.forEachIndexed { index, placeable ->
368+
val mark = marks[index]
369+
val fraction = ((mark.value - low) / range).coerceIn(0.0, 1.0)
370+
val x = (fraction * width - placeable.width / 2.0)
371+
.roundToInt()
372+
.coerceIn(0, (width - placeable.width).coerceAtLeast(0))
373+
placeable.placeRelative(x, 0)
374+
}
339375
}
340376
}
341377
}

0 commit comments

Comments
 (0)