diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5203b9e..3f0c202 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -48,7 +48,17 @@ dependencies { testImplementation(libs.junit) androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.espresso.core) + // RecyclerView + implementation("androidx.recyclerview:recyclerview:1.3.2") + // OkHttp + implementation("com.squareup.okhttp3:okhttp:4.12.0") + + // Gson (用于解析 JSON) + implementation("com.google.code.gson:gson:2.10.1") + + // Kotlin 协程 + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3") // CameraX 用于相机预览 implementation("androidx.camera:camera-camera2:1.3.0") diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5ca0a3c..58db0e4 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ - + () fun setFaces(faces: List) { @@ -27,10 +38,27 @@ class FaceOverlayView(context: Context, attrs: AttributeSet?) : View(context, at override fun onDraw(canvas: Canvas) { super.onDraw(canvas) + + val cx = width / 2f + val cy = height * 0.45f + val radius = minOf(width, height) * 0.31f + + maskPath.reset() + maskPath.addRect(0f, 0f, width.toFloat(), height.toFloat(), Path.Direction.CW) + maskPath.addCircle(cx, cy, radius, Path.Direction.CCW) + canvas.drawPath(maskPath, maskPaint) + canvas.drawCircle(cx, cy, radius, framePaint) + + frameRect.set(cx - radius, cy - radius, cx + radius, cy + radius) for (face in faces) { val rect = face.boundingBox - canvas.drawRect(rect, paint) - canvas.drawText("Face", rect.left.toFloat(), rect.top - 10f, textPaint) + val clippedLeft = rect.left.coerceAtLeast(frameRect.left.toInt()).toFloat() + val clippedTop = rect.top.coerceAtLeast(frameRect.top.toInt()).toFloat() + val clippedRight = rect.right.coerceAtMost(frameRect.right.toInt()).toFloat() + val clippedBottom = rect.bottom.coerceAtMost(frameRect.bottom.toInt()).toFloat() + if (clippedRight > clippedLeft && clippedBottom > clippedTop) { + canvas.drawRect(clippedLeft, clippedTop, clippedRight, clippedBottom, facePaint) + } } } } \ No newline at end of file diff --git a/app/src/main/res/drawable/bg_bottom_gradient.xml b/app/src/main/res/drawable/bg_bottom_gradient.xml new file mode 100644 index 0000000..32c7663 --- /dev/null +++ b/app/src/main/res/drawable/bg_bottom_gradient.xml @@ -0,0 +1,6 @@ + + + \ No newline at end of file diff --git a/app/src/main/res/layout/face_verification_activity.xml b/app/src/main/res/layout/face_verification_activity.xml index af7d02a..bed96b9 100644 --- a/app/src/main/res/layout/face_verification_activity.xml +++ b/app/src/main/res/layout/face_verification_activity.xml @@ -6,7 +6,6 @@ android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".login.FaceVerificationActivity"> - + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 8109c71..b6b0314 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -10,5 +10,6 @@ #F0F0F0 #000000 #999999 + #99000000 \ No newline at end of file