|
1 | | -[](https://confluence.jetbrains.com/display/ALL/JetBrains+on+GitHub) |
2 | | -[](https://opensource.org/licenses/Apache-2.0) |
3 | | -# [Compose Multiplatform](https://github.com/JetBrains/compose-multiplatform) application |
4 | | - |
5 | | -> **Note** |
6 | | -> The iOS part of Compose Multiplatform is in Alpha. It may change incompatibly and require manual migration in the |
7 | | -> future. |
8 | | -> If you have any issues, please report them on [GitHub](https://github.com/JetBrains/compose-multiplatform/issues). |
9 | | -
|
10 | | -You can use this template to start developing your |
11 | | -own [Compose Multiplatform](https://github.com/JetBrains/compose-multiplatform#readme) application targeting desktop, |
12 | | -Android, and iOS. |
13 | | -Follow our tutorial below to get your first Compose Multiplatform app up and running. |
14 | | -The result will be a [Kotlin Multiplatform](https://kotlinlang.org/docs/multiplatform.html) project that uses the |
15 | | -Compose Multiplatform UI framework. |
16 | | - |
17 | | -<img src="readme_images/banner.png" height="350"> |
18 | | - |
19 | | -## Set up the environment |
20 | | - |
21 | | -> **Warning** |
22 | | -> You need a Mac with macOS to write and run iOS-specific code on simulated or real devices. |
23 | | -> This is an Apple requirement. |
24 | | -
|
25 | | -To work with this template, you need the following: |
26 | | - |
27 | | -* A machine running a recent version of macOS |
28 | | -* [Xcode](https://apps.apple.com/us/app/xcode/id497799835) |
29 | | -* [Android Studio](https://developer.android.com/studio) |
30 | | -* The [Kotlin Multiplatform Mobile plugin](https://plugins.jetbrains.com/plugin/14936-kotlin-multiplatform-mobile) |
31 | | -* The [CocoaPods dependency manager](https://kotlinlang.org/docs/native-cocoapods.html) |
32 | | - |
33 | | -### Check your environment |
34 | | - |
35 | | -Before you start, use the [KDoctor](https://github.com/Kotlin/kdoctor) tool to ensure that your development environment |
36 | | -is configured correctly: |
37 | | - |
38 | | -1. Install KDoctor with [Homebrew](https://brew.sh/): |
39 | | - |
40 | | - ```text |
41 | | - brew install kdoctor |
42 | | - ``` |
43 | | -
|
44 | | -2. Run KDoctor in your terminal: |
45 | | -
|
46 | | - ```text |
47 | | - kdoctor |
48 | | - ``` |
49 | | -
|
50 | | - If everything is set up correctly, you'll see valid output: |
51 | | -
|
52 | | - ```text |
53 | | - Environment diagnose (to see all details, use -v option): |
54 | | - [✓] Operation System |
55 | | - [✓] Java |
56 | | - [✓] Android Studio |
57 | | - [✓] Xcode |
58 | | - [✓] Cocoapods |
59 | | - |
60 | | - Conclusion: |
61 | | - ✓ Your system is ready for Kotlin Multiplatform Mobile development! |
62 | | - ``` |
63 | | - |
64 | | -Otherwise, KDoctor will highlight which parts of your setup still need to be configured and will suggest a way to fix |
65 | | -them. |
66 | | - |
67 | | -## Examine the project structure |
68 | | - |
69 | | -Open the project in Android Studio and switch the view from **Android** to **Project** to see all the files and targets |
70 | | -belonging to the project: |
71 | | - |
72 | | -<img src="readme_images/open_project_view.png" height="300px"> |
73 | | - |
74 | | -Your Compose Multiplatform project includes 4 modules: |
75 | | - |
76 | | -### `shared` |
77 | | - |
78 | | -This is a Kotlin module that contains the logic common for desktop, Android, and iOS applications, that is, the code you |
79 | | -share between platforms. |
80 | | - |
81 | | -This `shared` module is also where you'll write your Compose Multiplatform code. |
82 | | -In `shared/src/commonMain/kotlin/App.kt`, you can find the shared root `@Composable` function for your app. |
83 | | - |
84 | | -It uses Gradle as the build system. You can add dependencies and change settings in `shared/build.gradle.kts`. |
85 | | -The `shared` module builds into a Java library, an Android library, and an iOS framework. |
86 | | - |
87 | | -### `desktopApp` |
88 | | - |
89 | | -This is a Kotlin module that builds into a desktop application. It uses Gradle as the build system. The `desktopApp` |
90 | | -module depends on and uses the `shared` module as a regular library. |
91 | | - |
92 | | -### `androidApp` |
93 | | - |
94 | | -This is a Kotlin module that builds into an Android application. It uses Gradle as the build system. |
95 | | -The `androidApp` module depends on and uses the `shared` module as a regular Android library. |
96 | | - |
97 | | -### `iosApp` |
98 | | - |
99 | | -This is an Xcode project that builds into an iOS application. |
100 | | -It depends on and uses the `shared` module as a CocoaPods dependency. |
101 | | - |
102 | | -## Run your application |
103 | | - |
104 | | -### On desktop |
105 | | - |
106 | | -To run your desktop application in Android Studio, select `desktopApp` in the list of run configurations and click **Run**: |
107 | | - |
108 | | -<img src="readme_images/run_on_desktop.png" height="60px"><br /> |
109 | | - |
110 | | -<img src="readme_images/desktop_app_running.png" height="300px"> |
111 | | - |
112 | | -You can also run Gradle tasks in the terminal: |
113 | | - |
114 | | -* `./gradlew run` to run application |
115 | | -* `./gradlew package` to store native distribution into `build/compose/binaries` |
116 | | - |
117 | | -### On Android |
118 | | - |
119 | | -To run your application on an Android emulator: |
120 | | - |
121 | | -1. Ensure you have an Android virtual device available. |
122 | | - Otherwise, [create one](https://developer.android.com/studio/run/managing-avds#createavd). |
123 | | -2. In the list of run configurations, select `androidApp`. |
124 | | -3. Choose your virtual device and click **Run**: |
125 | | - |
126 | | - <img src="readme_images/run_on_android.png" height="60px"><br /> |
127 | | - |
128 | | - <img src="readme_images/android_app_running.png" height="300px"> |
129 | | - |
130 | | -<details> |
131 | | - <summary>Alternatively, use Gradle</summary> |
132 | | - |
133 | | -To install an Android application on a real Android device or an emulator, run `./gradlew installDebug` in the terminal. |
134 | | - |
135 | | -</details> |
136 | | - |
137 | | -### On iOS |
138 | | - |
139 | | -#### Running on a simulator |
140 | | - |
141 | | -To run your application on an iOS simulator in Android Studio, modify the `iosApp` run configuration: |
142 | | - |
143 | | -1. In the list of run configurations, select **Edit Configurations**: |
144 | | - |
145 | | - <img src="readme_images/edit_run_config.png" height="200px"> |
146 | | - |
147 | | -2. Navigate to **iOS Application** | **iosApp**. |
148 | | -3. In the **Execution target** list, select your target device. Click **OK**: |
149 | | - |
150 | | - <img src="readme_images/target_device.png" height="400px"> |
151 | | - |
152 | | -4. The `iosApp` run configuration is now available. Click **Run** next to your virtual device: |
153 | | - |
154 | | - <img src="readme_images/ios_app_running.png" height="300px"> |
155 | | - |
156 | | -#### Running on a real iOS device |
157 | | - |
158 | | -You can run your Compose Multiplatform application on a real iOS device for free. |
159 | | -To do so, you'll need the following: |
160 | | - |
161 | | -* The `TEAM_ID` associated with your [Apple ID](https://support.apple.com/en-us/HT204316) |
162 | | -* The iOS device registered in Xcode |
163 | | - |
164 | | -> **Note** |
165 | | -> Before you continue, we suggest creating a simple "Hello, world!" project in Xcode to ensure you can successfully run |
166 | | -> apps on your device. |
167 | | -> You can follow the instructions below or watch |
168 | | -> this [Stanford CS193P lecture recording](https://youtu.be/bqu6BquVi2M?start=716&end=1399). |
169 | | -
|
170 | | -<details> |
171 | | -<summary>How to create and run a simple project in Xcode</summary> |
172 | | - |
173 | | -1. On the Xcode welcome screen, select **Create a new project in Xcode**. |
174 | | -2. On the **iOS** tab, choose the **App** template. Click **Next**. |
175 | | -3. Specify the product name and keep other settings default. Click **Next**. |
176 | | -4. Select where to store the project on your computer and click **Create**. You'll see an app that displays "Hello, |
177 | | - world!" on the device screen. |
178 | | -5. At the top of your Xcode screen, click on the device name near the **Run** button. |
179 | | -6. Plug your device into the computer. You'll see this device in the list of run options. |
180 | | -7. Choose your device and click **Run**. |
181 | | - |
182 | | -</details> |
183 | | - |
184 | | -##### Finding your Team ID |
185 | | - |
186 | | -In the terminal, run `kdoctor --team-ids` to find your Team ID. |
187 | | -KDoctor will list all Team IDs currently configured on your system, for example: |
188 | | - |
189 | | -```text |
190 | | -3ABC246XYZ (Max Sample) |
191 | | -ZABCW6SXYZ (SampleTech Inc.) |
| 1 | +# compose-progressIndicator-multiplatform |
| 2 | +This Library is a Multiplatform version of [compose-progressIndicator](https://github.com/KevinnZou/compose-progressIndicator) which |
| 3 | +is designed to improve the [LinearProgressIndicator](https://foso.github.io/Jetpack-Compose-Playground/material/linearprogressindicator/) provided by Jetpack Compose. |
| 4 | +Beside the base functionality provided by LinearProgressIndicator, This library supports the round corners for progressbar, thumb at the end of the bar, and the animations when progress changed. |
| 5 | +Developers can customize the size, position, and the color of the thumb. |
| 6 | + |
| 7 | +<img src="media/simple-indicator.gif" width=300> |
| 8 | + |
| 9 | +# Usage |
| 10 | +All functionalities mentioned above are implemented in one component: [SimpleProgressIndicatorWithAnim](https://github.com/KevinnZou/compose-progressIndicator-multiplatform/blob/main/progressIndicator/src/commonMain/kotlin/progressindicator/SimpleProgressIndicator.kt) |
| 11 | +```kotlin |
| 12 | +@Composable |
| 13 | +fun SimpleProgressIndicatorWithAnim( |
| 14 | + modifier: Modifier = Modifier, |
| 15 | + progress: Float = 0.7f, |
| 16 | + progressBarColor: Color = Color.Red, |
| 17 | + cornerRadius: Dp = 0.dp, |
| 18 | + trackColor: Color = Color(0XFFFBE8E8), |
| 19 | + thumbRadius: Dp = 0.dp, |
| 20 | + thumbColor: Color = Color.White, |
| 21 | + thumbOffset: Dp = thumbRadius, |
| 22 | + animationSpec: AnimationSpec<Float> = SimpleProgressIndicatorDefaults.SimpleProgressAnimationSpec, |
| 23 | +) {} |
| 24 | +``` |
| 25 | +you can use it simply like that |
| 26 | +```kotlin |
| 27 | +SimpleProgressIndicatorWithAnim( |
| 28 | + modifier = Modifier |
| 29 | + .padding(15.dp) |
| 30 | + .fillMaxWidth() |
| 31 | + .height(4.dp), |
| 32 | + progress, |
| 33 | + cornerRadius = 35.dp, |
| 34 | + thumbRadius = 1.dp, |
| 35 | + thumbOffset = 1.5.dp |
| 36 | + ) |
| 37 | +``` |
| 38 | +If you do not want to have animation, then you can use [SimpleProgressIndicator](https://github.com/KevinnZou/compose-progressIndicator-multiplatform/blob/main/progressIndicator/src/commonMain/kotlin/progressindicator/SimpleProgressIndicator.kt) |
| 39 | +```kotlin |
| 40 | +@Composable |
| 41 | +fun SimpleProgressIndicator( |
| 42 | + modifier: Modifier = Modifier, |
| 43 | + progress: Float = 0.7f, |
| 44 | + progressBarColor: Color = Color.Red, |
| 45 | + cornerRadius: Dp = 0.dp, |
| 46 | + trackColor: Color = Color(0XFFFBE8E8), |
| 47 | + thumbRadius: Dp = 0.dp, |
| 48 | + thumbColor: Color = Color.White, |
| 49 | + thumbOffset: Dp = thumbRadius |
| 50 | +) {} |
192 | 51 | ``` |
193 | 52 |
|
194 | | -<details> |
195 | | -<summary>Alternative way to find your Team ID</summary> |
196 | | - |
197 | | -If KDoctor doesn't work for you, try this alternative method: |
198 | | - |
199 | | -1. In Android Studio, run the `iosApp` configuration with the selected real device. The build should fail. |
200 | | -2. Go to Xcode and select **Open a project or file**. |
201 | | -3. Navigate to the `iosApp/iosApp.xcworkspace` file of your project. |
202 | | -4. In the left-hand menu, select `iosApp`. |
203 | | -5. Navigate to **Signing & Capabilities**. |
204 | | -6. In the **Team** list, select your team. |
205 | | - |
206 | | -If you haven't set up your team yet, use the **Add account** option and follow the steps. |
207 | | - |
208 | | -</details> |
209 | | - |
210 | | -To run the application, set the `TEAM_ID`: |
211 | | - |
212 | | -1. In the template, navigate to the `iosApp/Configuration/Config.xcconfig` file. |
213 | | -2. Set your `TEAM_ID`. |
214 | | -3. Re-open the project in Android Studio. It should show the registered iOS device in the `iosApp` run configuration. |
215 | | - |
216 | | -## Make your first changes |
217 | | - |
218 | | -You can now make some changes in the code and check that they are visible in both the iOS and Android applications at |
219 | | -the same time: |
220 | | - |
221 | | -1. In Android Studio, navigate to the `shared/src/commonMain/kotlin/App.kt` file. |
222 | | - This is the common entry point for your Compose Multiplatform app. |
223 | | - |
224 | | - Here, you see the code responsible for rendering the "Hello, World!" button and the animated Compose Multiplatform logo: |
225 | | - |
226 | | - ```kotlin |
227 | | - @OptIn(ExperimentalResourceApi::class) |
228 | | - @Composable |
229 | | - internal fun App() { |
230 | | - MaterialTheme { |
231 | | - var greetingText by remember { mutableStateOf("Hello, World!") } |
232 | | - var showImage by remember { mutableStateOf(false) } |
233 | | - Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) { |
234 | | - Button(onClick = { |
235 | | - greetingText = "Hello, ${getPlatformName()}" |
236 | | - showImage = !showImage |
237 | | - }) { |
238 | | - Text(greetingText) |
239 | | - } |
240 | | - AnimatedVisibility(showImage) { |
241 | | - Image( |
242 | | - painterResource("compose-multiplatform.xml"), |
243 | | - null |
244 | | - ) |
245 | | - } |
246 | | - } |
247 | | - } |
248 | | - } |
249 | | - ``` |
250 | | - |
251 | | -2. Update the shared code by adding a text field that will update the name displayed on the button: |
252 | | - |
253 | | - ```diff |
254 | | - @OptIn(ExperimentalResourceApi::class) |
255 | | - @Composable |
256 | | - internal fun App() { |
257 | | - MaterialTheme { |
258 | | - var greetingText by remember { mutableStateOf("Hello, World!") } |
259 | | - var showImage by remember { mutableStateOf(false) } |
260 | | - Column(Modifier.fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally) { |
261 | | - Button(onClick = { |
262 | | - greetingText = "Hello, ${getPlatformName()}" |
263 | | - showImage = !showImage |
264 | | - }) { |
265 | | - Text(greetingText) |
266 | | - } |
267 | | - + TextField(greetingText, onValueChange = { greetingText = it }) |
268 | | - AnimatedVisibility(showImage) { |
269 | | - Image( |
270 | | - painterResource("compose-multiplatform.xml"), |
271 | | - null |
272 | | - ) |
273 | | - } |
274 | | - } |
275 | | - } |
276 | | - } |
277 | | - ``` |
278 | | - |
279 | | -3. Re-run the `desktopApp`, `androidApp`, and `iosApp` configurations. You'll see this change reflected in all three |
280 | | - apps: |
281 | | - |
282 | | - <img src="readme_images/text_field_added.png" height="350px"> |
283 | | - |
284 | | -## How to configure the iOS application |
285 | | - |
286 | | -To get a better understanding of this template's setup and learn how to configure the basic properties of your iOS app without Xcode, |
287 | | -open the `iosApp/Configuration/Config.xcconfig` file in Android Studio. The configuration file contains: |
288 | | - |
289 | | -* `APP_NAME`, a target executable and an application bundle name. |
290 | | -* `BUNDLE_ID`, |
291 | | - which [uniquely identifies the app throughout the system](https://developer.apple.com/documentation/bundleresources/information_property_list/cfbundleidentifier#discussion). |
292 | | -* `TEAM_ID`, [a unique identifier generated by Apple that's assigned to your team](https://developer.apple.com/help/account/manage-your-team/locate-your-team-id/#:~:text=A%20Team%20ID%20is%20a,developer%20in%20App%20Store%20Connect). |
293 | | - |
294 | | -To configure the `APP_NAME` option, open `Config.xcconfig` in any text editor *before opening* the project in Android |
295 | | -Studio, and then set the desired name. |
296 | | - |
297 | | -If you need to change this option after you open the project in Android Studio, do the following: |
298 | | - |
299 | | -1. Close the project in Android Studio. |
300 | | -2. Run `./cleanup.sh` in your terminal. |
301 | | -3. Change the setting. |
302 | | -4. Open the project in Android Studio again. |
303 | | - |
304 | | -To configure advanced settings, use Xcode. After opening the project in Android Studio, |
305 | | -open the `iosApp/iosApp.xcworkspace` file in Xcode and make changes there. |
| 53 | +## Download |
306 | 54 |
|
307 | | -## Next steps |
| 55 | +[](https://search.maven.org/artifact/io.github.kevinnzou/compose-progressIndicator-multiplatform) |
308 | 56 |
|
309 | | -We encourage you to explore Compose Multiplatform further and try out more projects: |
| 57 | +```groovy |
| 58 | +repositories { |
| 59 | + mavenCentral() |
| 60 | +} |
310 | 61 |
|
311 | | -* [Create an application targeting iOS and Android with Compose Multiplatform](https://github.com/JetBrains/compose-multiplatform-ios-android-template#readme) |
312 | | -* [Create an application targeting Windows, macOS, and Linux with Compose Multiplatform for Desktop](https://github.com/JetBrains/compose-multiplatform-desktop-template#readme) |
313 | | -* [Complete more Compose Multiplatform tutorials](https://github.com/JetBrains/compose-multiplatform/blob/master/tutorials/README.md) |
314 | | -* [Explore some more advanced Compose Multiplatform example projects](https://github.com/JetBrains/compose-multiplatform/blob/master/examples/README.md) |
| 62 | +dependencies { |
| 63 | + implementation "io.github.kevinnzou:compose-progressIndicator-multiplatform:1.0.0" |
| 64 | +} |
| 65 | +``` |
0 commit comments