# Android 标尺测量应用 - 实现计划 > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. **Goal:** 构建一款利用手机屏幕进行物理测量的 Android 标尺应用,支持标尺测量和拍照标注两种模式。 **Architecture:** 单 Activity + Jetpack Compose 导航,共享 ViewModel 管理状态,DataStore 持久化设置,CameraX 驱动拍照功能。 **Tech Stack:** Kotlin, Jetpack Compose (BOM 2024.06), Material 3, CameraX 1.3.4, DataStore Preferences **Target/Compile SDK:** 34, Min SDK: 24 --- ## 项目文件结构 ``` android-ruler/ ├── settings.gradle.kts ├── build.gradle.kts ├── gradle.properties ├── gradle/ │ └── wrapper/ │ └── gradle-wrapper.properties ├── app/ │ ├── build.gradle.kts │ └── src/main/ │ ├── AndroidManifest.xml │ ├── java/com/example/androidruler/ │ │ ├── MainActivity.kt │ │ ├── RulerApplication.kt │ │ ├── ui/ │ │ │ ├── RulerScreen.kt │ │ │ ├── RulerCanvas.kt │ │ │ ├── Markers.kt │ │ │ ├── ControlBar.kt │ │ │ ├── photo/ │ │ │ │ ├── PhotoMarkScreen.kt │ │ │ │ ├── CameraCapture.kt │ │ │ │ ├── PhotoEditor.kt │ │ │ │ └── RulerOverlay.kt │ │ │ ├── settings/ │ │ │ │ ├── SettingsScreen.kt │ │ │ │ └── CalibrationScreen.kt │ │ │ └── util/ │ │ │ └── ImageSaver.kt │ │ ├── viewmodel/ │ │ │ └── RulerViewModel.kt │ │ ├── data/ │ │ │ └── SettingsRepository.kt │ │ └── theme/ │ │ └── Theme.kt │ └── res/ │ ├── values/ │ │ ├── strings.xml │ │ └── themes.xml │ └── xml/ │ └── backup_rules.xml ``` --- ### Task 1: 项目脚手架 **Files:** - Create: `settings.gradle.kts` - Create: `build.gradle.kts` - Create: `gradle.properties` - Create: `gradle/wrapper/gradle-wrapper.properties` - Create: `app/build.gradle.kts` - Create: `app/src/main/AndroidManifest.xml` - Create: `app/src/main/res/values/strings.xml` - Create: `app/src/main/res/values/themes.xml` - Create: `app/src/main/res/xml/backup_rules.xml` - [ ] **Step 1: 创建 settings.gradle.kts** ```kotlin pluginManagement { repositories { google() mavenCentral() gradlePluginPortal() } } dependencyResolutionManagement { repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS) repositories { google() mavenCentral() } } rootProject.name = "android-ruler" include(":app") ``` - [ ] **Step 2: 创建根 build.gradle.kts** ```kotlin plugins { id("com.android.application") version "8.2.2" apply false id("org.jetbrains.kotlin.android") version "1.9.22" apply false } ``` - [ ] **Step 3: 创建 gradle.properties** ```properties org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 android.useAndroidX=true kotlin.code.style=official android.nonTransitiveRClass=true ``` - [ ] **Step 4: 创建 gradle-wrapper.properties** ``` distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists ``` - [ ] **Step 5: 创建 app/build.gradle.kts** ```kotlin plugins { id("com.android.application") id("org.jetbrains.kotlin.android") } android { namespace = "com.example.androidruler" compileSdk = 34 defaultConfig { applicationId = "com.example.androidruler" minSdk = 24 targetSdk = 34 versionCode = 1 versionName = "1.0" } buildTypes { release { isMinifyEnabled = false proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro") } } compileOptions { sourceCompatibility = JavaVersion.VERSION_17 targetCompatibility = JavaVersion.VERSION_17 } kotlinOptions { jvmTarget = "17" } buildFeatures { compose = true } composeOptions { kotlinCompilerExtensionVersion = "1.5.8" } packaging { resources { excludes += "/META-INF/{AL2.0,LGPL2.1}" } } } dependencies { val composeBom = platform("androidx.compose:compose-bom:2024.06.00") implementation(composeBom) implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") implementation("androidx.activity:activity-compose:1.8.2") implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-graphics") implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.material3:material3") implementation("androidx.compose.material:material-icons-extended") implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.7.0") implementation("androidx.datastore:datastore-preferences:1.0.0") // CameraX val cameraxVersion = "1.3.4" implementation("androidx.camera:camera-core:${cameraxVersion}") implementation("androidx.camera:camera-camera2:${cameraxVersion}") implementation("androidx.camera:camera-lifecycle:${cameraxVersion}") implementation("androidx.camera:camera-view:${cameraxVersion}") debugImplementation("androidx.compose.ui:ui-tooling") debugImplementation("androidx.compose.ui:ui-test-manifest") } ``` - [ ] **Step 6: 创建 AndroidManifest.xml** ```xml ``` - [ ] **Step 7: 创建 strings.xml** ```xml 标尺 ``` - [ ] **Step 8: 创建 themes.xml** ```xml