# compose-ui

Published articles for compose-ui.

This is one page of public article previews, not the complete archive. Follow Next page to continue. Summaries are not the original full articles.

## Media3 1.11 adds customizable Compose player controls, gestures, and video preloading

DevFeed: [Media3 1.11 adds customizable Compose player controls, gestures, and video preloading](<https://devfeed.tech/articles/media3-1-11-what-s-new-22695.md>)

Original publisher: [Read original article](<http://android-developers.googleblog.com/2026/08/media3-1-11-whats-new.html>)

Author: Android Developers (noreply@blogger.com)

Published: 2026-08-11T16:00:00Z

Content type: release

Language: en

Sources: [Android Developers Blog](<https://devfeed.tech/sources/android-developers-blog-3.md>)

Topics: [media3](<https://devfeed.tech/topics/media3.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Playback](<https://devfeed.tech/topics/playback.md>), [Android](<https://devfeed.tech/topics/android.md>), [ExoPlayer](<https://devfeed.tech/topics/exoplayer.md>), [Ktor](<https://devfeed.tech/topics/ktor.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [audio](<https://devfeed.tech/tags/audio.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [exoplayer](<https://devfeed.tech/tags/exoplayer.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [ktor](<https://devfeed.tech/tags/ktor.md>), [media](<https://devfeed.tech/tags/media.md>), [media3](<https://devfeed.tech/tags/media3.md>), [playback](<https://devfeed.tech/tags/playback.md>), [release](<https://devfeed.tech/tags/release.md>), [releases](<https://devfeed.tech/tags/releases.md>), [video](<https://devfeed.tech/tags/video.md>)

### AI overview

Android Media3 1.11 introduces customizable Jetpack Compose player layouts, gesture-based playback controls, player recycling and preloading for short-form video feeds, improved Cast integration, a Ktor HTTP client extension, and new Ogg and WAV muxing utilities.

### Source excerpt

Posted by Toni Heidenreich, Software Engineer, Android Media3 1.11 is out. Powering the vast majority of top Android media apps, this release brings new features, bug fixes, and improvements across playback, editing, and UI components. We're expanding our Jetpack Compose UI modules with customizable Player slots and easy to use defaults, interactive gestures, state observers, and short-form video preloading using PlayerPool. We also modernized the Media3 Cast integration with SystemUI Output Switcher support, introduced a new Ktor HTTP client network extension, and added new muxing utilities for Ogg and WAV files. Read on for key highlights, and check out the full release notes for a comprehensive list of changes. Playback UI and Compose With Android becoming Compose-first, we are continuing to expand the media3-ui-compose and media3-ui-compose-material3 modules. This update introduces more granular control over your player layout, richer interaction patterns, and deeper integration with Material3. Customizable Player layout The Material 3 Player Composable now supports dedicated content slots for topControls, centerControls, bottomControls, and errorOverlay. You can drop in your own Composables or use the ready-made defaults published in PlayerDefaults: Player( player = player, topControls = { PlayerDefaults.TopControls(player) }, centerControls = { PlayerDefaults.CenterControls(player) }, bottomControls = { PlayerDefaults.BottomControls(player) }, ) The Player Composable also integrates FocusRequester support, enabling seamless D-pad and keyboard navigation on Android TV, foldables, and desktop environments. Example for a Composable Player with customized controls Gestures and playback speed control PlaybackSpeedState now provides a fast-forward/slow-motion API. The demo-compose app showcases this with a long-press gesture to fast-forward playback and seeking with double tap. Combined with the ProgressSlider introduced in 1.10, the Compose player UI now offers ric

## Announcing Jetpack Compose Mechanisms: The Book and Course on How Compose Actually Works

DevFeed: [Announcing Jetpack Compose Mechanisms: The Book and Course on How Compose Actually Works](<https://devfeed.tech/articles/announcing-jetpack-compose-mechanisms-the-book-and-course-on-how-compose-actually-works-25925.md>)

Original publisher: [Read original article](<https://skydoves.medium.com/announcing-jetpack-compose-mechanisms-the-book-and-course-on-how-compose-actually-works-23f5c29016a9?source=rss-9bb203a4ab2e------2>)

Author: Jaewoong Eum

Published: 2026-06-21T01:38:50Z

Content type: article

Language: en

Sources: [Stories by Jaewoong Eum on Medium](<https://devfeed.tech/sources/stories-by-jaewoong-eum-on-medium.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Compiler](<https://devfeed.tech/topics/compiler.md>), [.env](<https://devfeed.tech/topics/dotenv.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-compose](<https://devfeed.tech/tags/android-compose.md>), [article](<https://devfeed.tech/tags/article.md>), [compiler](<https://devfeed.tech/tags/compiler.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [course](<https://devfeed.tech/tags/course.md>), [developer](<https://devfeed.tech/tags/developer.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>)

### AI overview

This developer article explains how Jetpack Compose works beneath the @Composable function. It examines compiler-generated function signatures, restart groups and skip checks, and how remember stores values by position in the runtime slot table. It also introduces a book and companion course covering these mechanisms.

### Source excerpt

You hit a recomposition that made no sense. You opened the function, read it twice, and still could not see why it ran again. Maybe you added a remember, shuffled a parameter, and it went away, and you never learned why. Every Compose developer has lived some version of that moment. This post is about the question you quietly moved past: what is actually happening under that @Composable function? In this article, you'll look at three of those puzzles up close, the function that is not the function you wrote, a value that survives by position, and a screen that looks clean while it burns frames. Then you'll see what the book built to answer them covers across its four parts, and how the companion course turns that reading into practice. The gap between using and understanding Most developers know how to use Compose. Far fewer know what runs underneath a @Composable function, and that gap stays invisible until the day a screen recomposes more than it should, a type refuses to skip, or a list drops frames during a scroll. At that point the usual advice runs out, and you are left guessing at a system you cannot see. Here is the kind of thing worth being able to see. You write this: https://medium.com/media/24487ffb0b09b137a227ad928968b886/href The compiler rewrites the signature to fun Greeting(name: String, $composer: Composer?, $changed: Int), wraps the body in a restart group, and adds a skip check that can bypass the entire function when name has not changed since the last composition. Every part of that rewrite has a reason. Once you can read the output, recomposition stops being something that happens to you and becomes something you can trace. Where does a remembered value actually go? You call remember { mutableStateOf(0) } dozens of times a day and trust that the value comes back. But where does it actually go? Not into a variable, not into a map, not into a field on your composable. https://medium.com/media/c6aa8065dea93696c4a4bb2e7bbb27ee/href Because remembe

## Composables One: Universal Components for Compose UI

DevFeed: [Composables One: Universal Components for Compose UI](<https://devfeed.tech/articles/composables-one-universal-components-for-compose-ui-28445.md>)

Original publisher: [Read original article](<https://composables.com/blog/composables-one>)

Author: Alex Styl

Published: 2025-09-30T00:00:00Z

Content type: article

Language: en

Sources: [Composables - Concise, no-fluff video tutorials for Android developers](<https://devfeed.tech/sources/composables-concise-no-fluff-video-tutorials-for-android-developers.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [compose-multiplatform](<https://devfeed.tech/topics/compose-multiplatform.md>), [Library](<https://devfeed.tech/topics/library.md>), [ui](<https://devfeed.tech/topics/ui.md>), [cross-platform](<https://devfeed.tech/topics/cross-platform.md>), [Design system](<https://devfeed.tech/topics/design-system.md>), [Developer experience](<https://devfeed.tech/topics/developer-experience.md>)

Tags: [api](<https://devfeed.tech/tags/api.md>), [components](<https://devfeed.tech/tags/components.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-multiplatform](<https://devfeed.tech/tags/compose-multiplatform.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [cross-platform](<https://devfeed.tech/tags/cross-platform.md>), [design-system](<https://devfeed.tech/tags/design-system.md>), [library](<https://devfeed.tech/tags/library.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [navigation](<https://devfeed.tech/tags/navigation.md>), [open-source](<https://devfeed.tech/tags/open-source.md>), [user-experience](<https://devfeed.tech/tags/user-experience.md>)

### AI overview

The article introduces Composables One, a universal component library for Compose Multiplatform. Built on Compose Unstyled rather than Material Compose, it provides platform-adaptive components, keyboard navigation, screen scaffolds, and a customizable codebase distributed as a ZIP file.

### Source excerpt

A component library for Compose UI, built from scratch without Material Compose, so that you can build apps that look like yours, not Google's.

## Re-introducing Paparazzi's Accessibility Snapshots

DevFeed: [Re-introducing Paparazzi's Accessibility Snapshots](<https://devfeed.tech/articles/re-introducing-paparazzi-s-accessibility-snapshots-29013.md>)

Original publisher: [Read original article](<https://code.cash.app/paparazzi-accessibility-snapshots>)

Author: Colin Marsch

Published: 2025-07-14T00:00:00Z

Content type: tutorial

Language: en

Sources: [Cash App Code Blog](<https://devfeed.tech/sources/cash-app-code-blog.md>)

Topics: [Accessibility](<https://devfeed.tech/topics/accessibility.md>), [Testing](<https://devfeed.tech/topics/testing.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [Android](<https://devfeed.tech/topics/android.md>)

Tags: [accessibility](<https://devfeed.tech/tags/accessibility.md>), [accessibility-testing](<https://devfeed.tech/tags/accessibility-testing.md>), [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [library](<https://devfeed.tech/tags/library.md>), [test](<https://devfeed.tech/tags/test.md>), [testing](<https://devfeed.tech/tags/testing.md>)

### AI overview

This article explains Paparazzi's accessibility snapshots for Android UI tests. It describes how the snapshots expose semantic accessibility properties and layout bounds for legacy Android views and Compose UI, and how they can be recorded and verified like regular Paparazzi tests. The article cautions that snapshots should supplement, not replace, a broader accessibility testing strategy.

### Source excerpt

Overview

## Improve Compose UI with Spacing Constants

DevFeed: [Improve Compose UI with Spacing Constants](<https://devfeed.tech/articles/improve-compose-ui-with-spacing-constants-25098.md>)

Original publisher: [Read original article](<https://dladukedev.com/articles/043_spacing_constants_compose_ui/>)

Published: 2024-09-05T00:00:00Z

Content type: tutorial

Language: en

Sources: [Donovan LaDuke - Developer](<https://devfeed.tech/sources/donovan-laduke-developer.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>), [Code review](<https://devfeed.tech/topics/code-review.md>)

Tags: [code-review](<https://devfeed.tech/tags/code-review.md>), [collaboration](<https://devfeed.tech/tags/collaboration.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

A guide to improving Jetpack Compose UI consistency by adopting spacing constants based on an 8pt grid. It demonstrates using Kotlin sealed classes or enums and overloads for spacing modifiers or composables, then replacing hard-coded spacing values with constrained components.

### Source excerpt

Create better developer ergonomics and a more cohesive design language by exposing a set of string constants

## Jetpack Compose Clip or Cut a Composable with Custom Image Shape

DevFeed: [Jetpack Compose Clip or Cut a Composable with Custom Image Shape](<https://devfeed.tech/articles/jetpack-compose-clip-or-cut-a-composable-with-custom-image-shape-25850.md>)

Original publisher: [Read original article](<https://medium.com/@banmarkovic/jetpack-compose-clip-or-cut-a-composable-with-custom-image-shape-062dde54d4b2?source=rss-8aced922ece------2>)

Author: Ban Markovic

Published: 2024-02-14T17:25:40Z

Content type: tutorial

Language: en

Sources: [Stories by Ban Markovic on Medium](<https://devfeed.tech/sources/stories-by-ban-markovic-on-medium.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Graphics](<https://devfeed.tech/topics/graphics.md>)

Tags: [alignment](<https://devfeed.tech/tags/alignment.md>), [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [building](<https://devfeed.tech/tags/building.md>), [component](<https://devfeed.tech/tags/component.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [customization](<https://devfeed.tech/tags/customization.md>), [extend](<https://devfeed.tech/tags/extend.md>), [images](<https://devfeed.tech/tags/images.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [layout](<https://devfeed.tech/tags/layout.md>), [merge](<https://devfeed.tech/tags/merge.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

A tutorial showing how to clip a Jetpack Compose composable to a custom image shape. It builds a health-bar example, then uses PorterDuff operators and Modifier.drawWithContent to combine the image shape with colored content.

### Source excerpt

As an Android developer, I face all sorts of challenges provided to me by my fellow designers. One of them was actually building an UI component that has a custom shape in a form of an image. This was required because we wanted to display a special type of a progress bar by fulfilling the image shape with gradient. Because I didn't find this functionality trivial to implement, I decided to show how I solved this issue with some fun example. Example Here is a simple game where I utilized cutting of my composable. The game consists of one plane with full health. Upon each hit, it looses 10% of its health. Game is over once the plane remains with no health. Game Setup First, let me show you how I formed the basic layout for this game. It will contain the gray square and Hit button. Column( modifier = Modifier.fillMaxSize().background(Color.Black), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Box( modifier = Modifier .size(240.dp) .background(Color.LightGray) ) Spacer(modifier = Modifier.height(40.dp)) Button( onClick = { /* TODO */ } ) { Text("HIT") } } Next step, is to create custom Composable called SquareHealth. SquareHealth is expecting the progress value (from 0.0 to 1.0). This will determine the height of the green area inside my gray square (aligned at bottom). It will represent remaining health for my Square. @Composable fun SquareHealth(healthPercentage: Float) { Box( modifier = Modifier .size(240.dp) .background(Color.LightGray) ) { Box( modifier = Modifier .fillMaxWidth() .height((240 * healthPercentage).dp) .background(Color.Green) .align(Alignment.BottomCenter) ) } } Now, I can call it instead of the static gray Box inside my screen. The basic layout is now set, and I just need to set initial health progress to 1.0, and enable my button to decrease the health percentage by 0.1 on each click. var healthPercentage by remember { mutableStateOf(1.0f) } Column( modifier = Modifier .fillMaxSize() .background(Co

## Building a sub-sampling image viewer for Compose UI

DevFeed: [Building a sub-sampling image viewer for Compose UI](<https://devfeed.tech/articles/building-a-sub-sampling-image-viewer-for-compose-ui-29021.md>)

Original publisher: [Read original article](<https://saket.me/compose-sub-sampling-image-viewer/>)

Author: Saket Narayan

Published: 2023-08-09T21:07:52Z

Content type: tutorial

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Library](<https://devfeed.tech/topics/library.md>)

Tags: [4k](<https://devfeed.tech/tags/4k.md>), [android](<https://devfeed.tech/tags/android.md>), [building](<https://devfeed.tech/tags/building.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [deep](<https://devfeed.tech/tags/deep.md>), [developers](<https://devfeed.tech/tags/developers.md>), [display](<https://devfeed.tech/tags/display.md>), [image](<https://devfeed.tech/tags/image.md>), [library](<https://devfeed.tech/tags/library.md>), [loading](<https://devfeed.tech/tags/loading.md>), [memory](<https://devfeed.tech/tags/memory.md>), [ui](<https://devfeed.tech/tags/ui.md>), [zoom](<https://devfeed.tech/tags/zoom.md>)

### AI overview

An Android developer describes building Telephoto, a zoomable image viewer for Compose UI. The article explains sub-sampling and tiling techniques for displaying large images while reducing memory usage.

### Source excerpt

How do you display a 100mb image on Android without running into OutOfMemoryError? You can't. But you can cheat. For years Android developers have used Dave Morrissey's excellent library, subsampling-scale-image-view for displaying large bitmaps with deep zoom. It optimizes memory usage by loading lower resolution bitmaps whenever possible and avoiding loading parts of the original [...] The post Building a sub-sampling image viewer for Compose UI appeared first on Saket Narayan.

## Simplifying State Management with Compose

DevFeed: [Simplifying State Management with Compose](<https://devfeed.tech/articles/simplifying-state-management-with-compose-20043.md>)

Original publisher: [Read original article](<https://technology.doximity.com/articles/simplifying-state-management-with-compose>)

Author: Doximity

Published: 2023-07-05T19:45:00Z

Content type: tutorial

Language: en

Sources: [Doximity](<https://devfeed.tech/sources/doximity.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Development](<https://devfeed.tech/topics/development.md>), [interoperability](<https://devfeed.tech/topics/interoperability.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [architecture](<https://devfeed.tech/tags/architecture.md>), [clean-architecture](<https://devfeed.tech/tags/clean-architecture.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [interoperability](<https://devfeed.tech/tags/interoperability.md>), [state](<https://devfeed.tech/tags/state.md>), [state-management](<https://devfeed.tech/tags/state-management.md>), [xml](<https://devfeed.tech/tags/xml.md>)

### AI overview

This tutorial explains how Doximity's Android team experimented with using the Compose Runtime instead of ViewModels to manage screen state in the refreshed Amion physician scheduling tool. It describes the related presentation-layer and clean-architecture patterns, including interoperability with existing XML and Compose UI, and introduces foundations for a follow-up note-taking app.

### Source excerpt

The recent release of Doximity's refreshed physician scheduling tool Amion involved a significant overhaul of the user interface (UI) layer using Jetpack Compose. As part of the development process, we decided to experiment with shifting from ViewModels to utilizing the Compose Runtime for managing screen state. This article explores the motivations behind this approach and demonstrates an overall improvement to the view layer and presentation logic using the patterns developed in Amion 6.0.0. Note: This is part one of a two-part article. In part two, we will build a note-taking app using the foundations covered here. Understanding the Presentation Layer The Android team at Doximity builds apps following the basic principles of clean architecture, which involves separating the app into layers, each with their own responsibilities. In our app, we have a view layer, responsible for rendering UI components (Compose UI, XML views, etc.), and a presentation logic layer, responsible for producing screen state. Every navigable point in the app corresponds to one or more UI components and is associated with one or more screen state producers. Inspiration and Initial Experiments The decision to leverage Compose for managing state was inspired by (at the risk of sounding like r/mAndroidDev) Jake Wharton's article The State of Managing State (with Compose). While the release of Circuit occurred midway through our development, it was deemed more of a framework that required significant buy-in, whereas we aimed to build a flexible pattern with smoother interoperability with our existing architecture, that at the time mostly utilized ViewModel with XML and Compose UI. When we think about the presentation layer in Android as developers, we have to think about: What is the state of the screen? That is, not just when the user first sees it, but what does it look like when it's loading, what happens when there is an error, how will the state of components of the screen interact, and

## Lessons Learned with Jetpack Compose

DevFeed: [Lessons Learned with Jetpack Compose](<https://devfeed.tech/articles/lessons-learned-with-jetpack-compose-23972.md>)

Original publisher: [Read original article](<https://medium.com/making-meetup/lessons-learned-with-jetpack-compose-29ab74387fc?source=rss----6981e268ba45---4>)

Author: Joe Williams

Published: 2023-05-12T15:44:18Z

Content type: tutorial

Language: en

Sources: [Making Meetup - Medium](<https://devfeed.tech/sources/making-meetup-medium.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Android](<https://devfeed.tech/topics/android.md>), [XML](<https://devfeed.tech/topics/xml.md>), [Android Studio](<https://devfeed.tech/topics/android-studio.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-studio](<https://devfeed.tech/tags/android-studio.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [declarative](<https://devfeed.tech/tags/declarative.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [meetup](<https://devfeed.tech/tags/meetup.md>), [swiftui](<https://devfeed.tech/tags/swiftui.md>), [view-binding](<https://devfeed.tech/tags/view-binding.md>)

### AI overview

This developer article shares Meetup's experience adopting Jetpack Compose alongside SwiftUI and integrating Compose into an existing Android app. It explains the benefits of declarative UI, including faster UI development and simpler component reuse, while discussing the transition from XML layouts and view binding. It also covers Compose previews, Live Edit, and ComposeView and AndroidView for integration with traditional layouts.

### Source excerpt

Photo by Brett Jordan on Unsplash At Meetup, we are all-in on declarative UI. Our Organizer app was built from the ground up with Jetpack Compose and SwiftUI. We like it so much we've been integrating it into our existing Meetup app whenever possible. That road has not always been a smooth one, though, and we'd like to share some of what we've learned on that journey. Making the switch is worth it No doubt, some developers are hesitant to pick up yet another newly emerging Android technology. I certainly was. It's tempting to stay in the comfort of XML layouts and view binding. But wouldn't it be nice to create a screen with just one file? Do you really want to keep filling in boilerplate code for RecyclerViews and Adapters? We found that once everyone is on the same page with Compose, UI development speeds up significantly. Reusing a UI component is now just a matter of writing the declaration for it. No more extending a view, dropping it into an XML file, and then hooking up the backing code. Set up previews and use Live Edit When switching from XML layouts to Compose, the first downside that may jump out at developers is one of previewing the UI. For standard XML, changes made are reflected immediately in the design view, while Compose requires the app to be built. There are two things that can help alleviate this problem: Previews and the Live Edit feature. Declaring previews allows you to see how your composables will look in a running app. This is especially useful for commonly used elements. For instance, we have a MeetupButton that gets used across both of our apps, so having previews of each version of it helps us quickly identify which one to use when we're building a screen. Previews also make it easy to test layouts without repeatedly running your application and simulating states: Alongside previews, Live Edit lets you make changes to your composables while the app is running and see those changes immediately. Simply deploy your app from Android Studio

## Jetpack Compose OTP input field

DevFeed: [Jetpack Compose OTP input field](<https://devfeed.tech/articles/jetpack-compose-otp-input-field-25853.md>)

Original publisher: [Read original article](<https://proandroiddev.com/jetpack-compose-otp-input-field-bcfa22c85e5f?source=rss-8aced922ece------2>)

Author: Ban Markovic

Published: 2022-12-19T14:51:05Z

Content type: tutorial

Language: en

Sources: [Stories by Ban Markovic on Medium](<https://devfeed.tech/sources/stories-by-ban-markovic-on-medium.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [android-development](<https://devfeed.tech/topics/android-development.md>), [Mobile](<https://devfeed.tech/topics/mobile.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Code](<https://devfeed.tech/topics/code.md>), [Development](<https://devfeed.tech/topics/development.md>), [Authentication](<https://devfeed.tech/topics/authentication.md>), [implementation](<https://devfeed.tech/topics/implementation.md>), [Material Design](<https://devfeed.tech/topics/material-design.md>), [passwords](<https://devfeed.tech/topics/passwords.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-development](<https://devfeed.tech/tags/android-development.md>), [androiddev](<https://devfeed.tech/tags/androiddev.md>), [authentication](<https://devfeed.tech/tags/authentication.md>), [code](<https://devfeed.tech/tags/code.md>), [component](<https://devfeed.tech/tags/component.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [development](<https://devfeed.tech/tags/development.md>), [implementation](<https://devfeed.tech/tags/implementation.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [material-design](<https://devfeed.tech/tags/material-design.md>), [mobile](<https://devfeed.tech/tags/mobile.md>), [mobile-apps](<https://devfeed.tech/tags/mobile-apps.md>), [otp](<https://devfeed.tech/tags/otp.md>), [password](<https://devfeed.tech/tags/password.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

A tutorial on building a customizable one-time password input field for Android with Jetpack Compose and BasicTextField. It explains why BasicTextField can be preferable to Material TextField for customization, configures a numeric password keyboard, and limits input to six digits.

### Source excerpt

One-time password (OTP), also called dynamic password, one-time PIN, and one-time authorization code (OTAC), is password that is only valid for one login session. Most commonly, it is received in a format of 4 or 6 digit code, through SMS, and it used for implementation of two-factor authentication. Implementing OTP support inside our mobile apps requires us to build a custom UI input field, which should be strictly customized for handling the received OTP code. Motivation Since Jetpack Compose is a new UI toolkit for Android development, I wanted to write an article regarding how we can make our own custom OTP input field using BasicTextField. Custom OTP input Creating input fields with Compose UI is quite simple. There is already an existing Material component called TextField, that we can use. It has a lot of built-in functionalities because it follows Material design principles. That also comes with some drawbacks, for example, if we wanted to customize our input field, we would have struggled to do so with TextField, because it isn't as flexible. That's why we need another component that is a bit lower-level compared to TextField, but it enables us to customize it the way that suits us the best. I'm talking about BasicTextField. Implementation Firstly, lets implement a simple BasicTextField that enables it to open a keyboard with only numbers. We can do that by setting up the keybaordOptions parameter with keyboardType set to NumberPassword. If you've wondered why we use NumberPassword and not just Number, it is because the keyboard that is opened for the Number keyboard type contains dot, comma and dash characters, and we don't need anything other than digits inside our OTP input field. Next step we need to do is to implement more restrictions inside our input field. In case we know that our OTP must be a 6 digit code, our input field should be able to receive max 6 digits, and not allow user to input more than that. To accomplish max characters restriction, w

## Compose UI for iOS - Touchlab

DevFeed: [Compose UI for iOS - Touchlab](<https://devfeed.tech/articles/compose-ui-for-ios-touchlab-38185.md>)

Original publisher: [Read original article](<https://touchlab.co/compose-ui-for-ios>)

Published: 2022-09-19T14:04:34Z

Content type: tutorial

Language: en

Sources: [Touchlab | Enterprise Mobile Innovation & Development](<https://devfeed.tech/sources/touchlab-enterprise-mobile-innovation-development.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [iOS](<https://devfeed.tech/topics/ios.md>), [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [SwiftUI](<https://devfeed.tech/topics/swiftui.md>), [ui](<https://devfeed.tech/topics/ui.md>), [Development](<https://devfeed.tech/topics/development.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [ios](<https://devfeed.tech/tags/ios.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [native](<https://devfeed.tech/tags/native.md>), [swiftui](<https://devfeed.tech/tags/swiftui.md>)

### AI overview

The article describes using Compose for iOS and Android UI in the Droidcon app built with Kotlin Multiplatform. It explains potential benefits such as sharing UI code, using Kotlin, improving compatibility with Kotlin view models, and using Material Design, while noting that Compose for iOS was not production ready at the time of writing.

### Source excerpt

While Compose for iOS is not production ready yet and may never fully replace native iOS UI, it's definitely worth it to try it out.

## AutoSize TextField in Android Jetpack Compose

DevFeed: [AutoSize TextField in Android Jetpack Compose](<https://devfeed.tech/articles/autosize-textfield-in-android-jetpack-compose-25846.md>)

Original publisher: [Read original article](<https://medium.com/@banmarkovic/autosize-textfield-in-android-jetpack-compose-7d2a601636f5?source=rss-8aced922ece------2>)

Author: Ban Markovic

Published: 2022-08-08T08:55:06Z

Content type: tutorial

Language: en

Sources: [Stories by Ban Markovic on Medium](<https://devfeed.tech/sources/stories-by-ban-markovic-on-medium.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [ui](<https://devfeed.tech/topics/ui.md>), [XML](<https://devfeed.tech/topics/xml.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [android-app-development](<https://devfeed.tech/tags/android-app-development.md>), [android-jetpack](<https://devfeed.tech/tags/android-jetpack.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

This tutorial explains how to implement an autosizing TextField in Android Jetpack Compose. It calculates the input field's available width, measures text using ParagraphIntrinsics, and decreases the font size until the text fits within the field while accounting for default horizontal padding.

### Source excerpt

By introducing Jetpack Compose UI framework, Android has made huge improvement towards speeding up the process of developing Android apps. The only drawback at the moment is that the framework is still young, therefore quite a few features are lacking when compared to the previous View system (XML). One of the latest struggles I had with Jetpack Compose was the implementation of the input field that resizes its font when the text is wider than the input field. Autosizing input field In this post, I'm going to cover steps necessary for the implementation of mentioned TextField in JetpackCompose. In case you are impatient and you want to check Github repo immediately, here is the link with working example. What are we trying to accomplish here Every time our text exceeds the width of our TextField box, we must calculate the new font size to make our content fit within the boundaries of the TextField box. Solution For this specific purpose, we will leverage a few of the features that Jetpack Compose has made available. But first, let's break this work down into three smaller ones so that we can tackle them one at a time: calculate the max width of the input field, calculate the width of the text with given font size, decrease the font size until the width of the given text fits the max width of the input field. 1. Max width of the input field Since working solely with TextField won't give us the information about its width, we are going to use one of the Jetpack Compose composables called BoxWithConstraints, as a parent of our TextField. It can help us get the maxWidth info. BoxWithConstraints(modifier = modifier.fillMaxWidth()) { val textFieldDefaultHorPad = 16.dp val maxInputWidth = maxWidth - 2 * textFieldDefaultHorPad TextField(...) } Here, it's important to note that TextField contains default horizontal padding that is 16 dp on each side, that's why we are calculating our maxInputWidth by subtracting two paddings from BoxWithConstraints maxWidth. If we didn't sub

## Drawing custom text spans in Compose UI

DevFeed: [Drawing custom text spans in Compose UI](<https://devfeed.tech/articles/drawing-custom-text-spans-in-compose-ui-29020.md>)

Original publisher: [Read original article](<https://saket.me/compose-custom-text-spans/>)

Author: Saket Narayan

Published: 2022-07-12T15:49:24Z

Content type: tutorial

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [implementation](<https://devfeed.tech/topics/implementation.md>), [Code](<https://devfeed.tech/topics/code.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [animation](<https://devfeed.tech/tags/animation.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [library](<https://devfeed.tech/tags/library.md>), [modifiers](<https://devfeed.tech/tags/modifiers.md>), [porting](<https://devfeed.tech/tags/porting.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

A tutorial on drawing custom text decorations in Compose UI by annotating text, calculating layout coordinates, and manually rendering animated squiggly underlines. It also demonstrates rounded-corner text backgrounds and packages the implementation as a reusable library.

### Source excerpt

While exploring how text paragraphs are rendered in Compose UI, I nerd sniped myself into porting squiggly underlines from Sam Ruston's Buzzkill app. Sam's animation was implemented using TextView custom spans, but Compose UI does not offer any alternatives for them yet. While our friends at Google are prototyping text modifiers (first, second), I figured [...] The post Drawing custom text spans in Compose UI appeared first on Saket Narayan.

## Card Soccer

DevFeed: [Card Soccer](<https://devfeed.tech/articles/card-soccer-38598.md>)

Original publisher: [Read original article](<https://krossovochkin.com/apps/card-soccer/>)

Published: 2022-07-10T00:00:00Z

Content type: tutorial

Language: en

Sources: [Vasya Drobushkov](<https://devfeed.tech/sources/vasya-drobushkov.md>)

Topics: [Kotlin Multiplatform](<https://devfeed.tech/topics/kotlin-multiplatform.md>), [multiplatform](<https://devfeed.tech/topics/multiplatform.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [compose-for-desktop](<https://devfeed.tech/topics/compose-for-desktop.md>), [Web](<https://devfeed.tech/topics/web.md>)

Tags: [ai](<https://devfeed.tech/tags/ai.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [desktop](<https://devfeed.tech/tags/desktop.md>), [game](<https://devfeed.tech/tags/game.md>), [how-to](<https://devfeed.tech/tags/how-to.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [kotlin-multiplatform](<https://devfeed.tech/tags/kotlin-multiplatform.md>), [multiplatform](<https://devfeed.tech/tags/multiplatform.md>), [port](<https://devfeed.tech/tags/port.md>), [strategies](<https://devfeed.tech/tags/strategies.md>), [web](<https://devfeed.tech/tags/web.md>)

### AI overview

Card Soccer is a turn-based card game against an AI opponent. Players move a card-based ball through rows by matching its value or suit, using passes or shots to score goals. The author describes developing desktop and web versions with Kotlin Multiplatform and Jetpack Compose UI.

### Source excerpt

How to play The goal of the game is to win AI opponent by scoring more goals. The game is turn based. On your turn you should move the "ball" (card opened from your deck) to opponents goal. You start from the row that is close to your goal: you should select a card in a row and if it matches by value or suite - proceed to the next row up until the opponent's goal. If there is no match - your turn is over. You can select opened and closed cards. If the whole row is opened - you can skip it and procced to the next one. You score when your "ball" matches opponent goal.

## Composed modifiers in Jetpack Compose

DevFeed: [Composed modifiers in Jetpack Compose](<https://devfeed.tech/articles/composed-modifiers-in-jetpack-compose-27464.md>)

Original publisher: [Read original article](<https://jorgecastilloprz.github.io/composed-modifiers-in-jetpack-compose>)

Author: Jorge Castillo

Published: 2022-04-04T10:00:00Z

Content type: tutorial

Language: en

Sources: [👨💻 Jorge Castillo](<https://devfeed.tech/sources/jorge-castillo.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [context](<https://devfeed.tech/topics/context.md>), [factory function](<https://devfeed.tech/topics/factory-function.md>), [Library](<https://devfeed.tech/topics/library.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [context](<https://devfeed.tech/tags/context.md>), [extension-function](<https://devfeed.tech/tags/extension-function.md>), [factory-function](<https://devfeed.tech/tags/factory-function.md>), [jetpack](<https://devfeed.tech/tags/jetpack.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [modifiers](<https://devfeed.tech/tags/modifiers.md>), [state](<https://devfeed.tech/tags/state.md>), [stateful](<https://devfeed.tech/tags/stateful.md>), [stateless](<https://devfeed.tech/tags/stateless.md>)

### AI overview

This tutorial explains the difference between standard and composed modifiers in Jetpack Compose. Standard modifiers use extension functions and are stateless, while composed modifiers support state and access to composition context by creating them within a Composition.

### Source excerpt

Learn about composed modifiers and compare those to standard ones.

## Magic Sprinkles at DevFest UK Ireland

DevFeed: [Magic Sprinkles at DevFest UK Ireland](<https://devfeed.tech/articles/magic-sprinkles-at-devfest-uk-ireland-32068.md>)

Original publisher: [Read original article](<https://www.maiatoday.net/p/magic-sprinkles-at-devfest-uk-ireland/>)

Published: 2022-01-29T10:53:10Z

Content type: tutorial

Language: en

Sources: [maiatoday](<https://devfeed.tech/sources/maiatoday.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [API](<https://devfeed.tech/topics/api.md>)

Tags: [animate](<https://devfeed.tech/tags/animate.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-animation](<https://devfeed.tech/tags/compose-animation.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [devfest](<https://devfeed.tech/tags/devfest.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [repo](<https://devfeed.tech/tags/repo.md>), [sample](<https://devfeed.tech/tags/sample.md>), [talk](<https://devfeed.tech/tags/talk.md>), [ui-components](<https://devfeed.tech/tags/ui-components.md>), [video](<https://devfeed.tech/tags/video.md>)

### AI overview

A shorter version of a DevFest UK Ireland talk introducing Jetpack Compose animations. It covers the animation API, simple quick-win animations, and more complex custom animations, with examples in a sample app and companion code repository.

### Source excerpt

A shorter version of my Magic Sprinkles talk presented at DevFest UK Ireland Magic Sprinkles: Adding animations to your app with Jetpack Compose I have some Jetpack Compose UI components in my app and now I want to add animations, where do I start? In this presentation I will look briefly at the Jetpack Compose animation api to get an overview of the animation system. Then I will look at a few quick win simple animations that can add some magic to your app. I will dive into more complex and custom animations to see what is possible. All of these experiments will be illustrated in a sample app provided in a companion repo. At the end of this talk you will: have an overview of how animation works in Jetpack Compose have some practical animation examples that you can add to your app immediately have an idea of what is possible with complex and custom animations have a code repo of examples Repo Slides Video

## Graduating from View IDs

DevFeed: [Graduating from View IDs](<https://devfeed.tech/articles/graduating-from-view-ids-29028.md>)

Original publisher: [Read original article](<https://saket.me/graduating-from-view-ids/>)

Author: Saket Narayan

Published: 2021-12-02T08:55:21Z

Content type: opinion

Language: en

Sources: [Saket Narayan](<https://devfeed.tech/sources/saket-narayan.md>)

Topics: [Compose](<https://devfeed.tech/topics/compose.md>), [ui](<https://devfeed.tech/topics/ui.md>), [configuration](<https://devfeed.tech/topics/configuration.md>), [Kotlin](<https://devfeed.tech/topics/kotlin.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [history](<https://devfeed.tech/tags/history.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [kotlin](<https://devfeed.tech/tags/kotlin.md>), [screen](<https://devfeed.tech/tags/screen.md>), [state](<https://devfeed.tech/tags/state.md>), [ui](<https://devfeed.tech/tags/ui.md>)

### AI overview

The article argues that Compose UI reduces the need to assign and maintain View IDs for state restoration. It contrasts this with traditional layouts, where missing IDs can prevent scroll position from surviving configuration changes, and explains that Compose can generate stable keys based on code location and handle state restoration automatically in many cases.

### Source excerpt

I found an old screen in Cash App today that wasn't retaining its scroll position across configuration changes. A peek into git history revealed that the author forgot to assign an ID to its scrollable layout for enabling state restoration. And would you even blame them? Sure, View IDs are necessary, but maintaining them manually [...] The post Graduating from View IDs appeared first on Saket Narayan.

## Jetpack Compose: First Impressions and Learning Resources

DevFeed: [Jetpack Compose: First Impressions and Learning Resources](<https://devfeed.tech/articles/jetpack-compose-first-impressions-and-learning-resources-27037.md>)

Original publisher: [Read original article](<https://getstream.io/blog/jetpack-compose-impressions-resources/>)

Author: Márton Braun

Published: 2021-03-05T19:00:00Z

Content type: opinion

Language: en

Sources: [zsmb.co](<https://devfeed.tech/sources/zsmb-co.md>)

Topics: [Jetpack Compose](<https://devfeed.tech/topics/jetpack-compose.md>), [Compose](<https://devfeed.tech/topics/compose.md>), [Android](<https://devfeed.tech/topics/android.md>), [SDK](<https://devfeed.tech/topics/sdk.md>)

Tags: [android](<https://devfeed.tech/tags/android.md>), [app](<https://devfeed.tech/tags/app.md>), [components](<https://devfeed.tech/tags/components.md>), [compose](<https://devfeed.tech/tags/compose.md>), [compose-ui](<https://devfeed.tech/tags/compose-ui.md>), [getting-started](<https://devfeed.tech/tags/getting-started.md>), [jetpack-compose](<https://devfeed.tech/tags/jetpack-compose.md>), [learning](<https://devfeed.tech/tags/learning.md>), [modular](<https://devfeed.tech/tags/modular.md>), [resources](<https://devfeed.tech/tags/resources.md>), [sdk](<https://devfeed.tech/tags/sdk.md>), [ui-components](<https://devfeed.tech/tags/ui-components.md>)

### AI overview

The article shares first impressions of Jetpack Compose in beta and recommends learning resources for getting started. It also describes a modular SDK that provides customizable Compose UI components for Android apps.

### Source excerpt

Jetpack Compose is finally in beta. Here are my first impressions using its beta, and some recommended resources for getting started with it.