41554 blogs · [ { "id": "01a0d795-34bf-718a-a779-0dc7e87abc80", "title": "Haze 2.0", "url": "https://chrisbanes.me/posts/haze-2.0.0/", "published_at": "2026-09-22T09:54:00+00:00" }, { "id": "01a0d795-34bf-718a-a779-0dc7e943c6c4", "title": "Compose has progressive blur. Do you still need Haze?", "url": "https://chrisbanes.me/posts/compose-progressive-blur/", "published_at": "2026-09-13T13:46:16+00:00" }, { "id": "01a07df2-4002-7394-91c9-47619dc50fbf", "title": "Shopping Is Not a Category", "url": "https://chrisbanes.me/posts/shopping-is-not-a-category/", "published_at": "2026-07-22T09:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-47619e1616a5", "title": "Haze 2.0: A Pluggable Visual Effects Engine", "url": "https://chrisbanes.me/posts/haze-2.0/", "published_at": "2026-04-29T08:25:00+00:00" }, { "id": "01a08d27-0ec3-73ab-8714-bcf575700a12", "title": "Haze 2.0: A Pluggable Visual Effects Engine", "url": "https://chrisbanes.me/posts/haze-2.0-alpha/", "published_at": "2026-04-29T08:25:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-47619eb4d505", "title": "The Disappearing Middle: How AI Coding Tools Are Breaking Software Apprenticeship", "url": "https://chrisbanes.me/posts/disappearing-middle-ai-software-apprenticeship/", "published_at": "2025-12-29T12:07:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-47619f52063c", "title": "Multiplatform Strings", "url": "https://chrisbanes.me/posts/multiplatform-strings/", "published_at": "2025-02-20T11:45:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-47619fe7e94f", "title": "Should you use Kotlin Sequences for Performance?", "url": "https://chrisbanes.me/posts/use-sequence/", "published_at": "2025-02-13T11:45:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a0305fc5", "title": "Haze - Real time background blurring", "url": "https://chrisbanes.me/talks/haze-tech-talk/", "published_at": "2024-12-06T14:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a0654631", "title": "Haze 1.0", "url": "https://chrisbanes.me/posts/haze-1.0/", "published_at": "2024-11-07T12:07:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a0c2377e", "title": "Retaining beyond ViewModels", "url": "https://chrisbanes.me/posts/retaining-beyond-viewmodels/", "published_at": "2024-03-21T11:20:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a17bb131", "title": "SwiftUI for Jetpack Compose developers - State (I)", "url": "https://chrisbanes.me/posts/swiftui-for-jetpack-compose-devs-state/", "published_at": "2023-12-04T14:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a226cdfc", "title": "Parallax effect in Jetpack Compose", "url": "https://chrisbanes.me/posts/parallax-effect-compose/", "published_at": "2023-09-12T12:54:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a2581bbf", "title": "Branching out to Jetpack Compose", "url": "https://chrisbanes.me/talks/branching-out-to-jetpack-compose/", "published_at": "2022-06-03T16:54:21+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a28ad9f5", "title": "Composable metrics", "url": "https://chrisbanes.me/posts/composable-metrics/", "published_at": "2022-04-11T10:08:47+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a3454fd1", "title": "Slotting in with Compose UI", "url": "https://chrisbanes.me/posts/slotting-in-with-compose-ui/", "published_at": "2021-12-06T14:37:55+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a42b0b0f", "title": "Always provide a Modifier parameter", "url": "https://chrisbanes.me/posts/always-provide-a-modifier/", "published_at": "2021-10-22T09:52:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a43eae00", "title": "Becoming a Xoogler", "url": "https://chrisbanes.me/posts/becoming-xoogler/", "published_at": "2021-08-20T11:18:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a4eeb675", "title": "Publishing to Maven Central", "url": "https://chrisbanes.me/posts/publishing-to-maven-central/", "published_at": "2021-02-04T09:26:44+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a58794b0", "title": "New website... again", "url": "https://chrisbanes.me/posts/new-website/", "published_at": "2021-01-05T13:39:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a62fc844", "title": "Chris Banes", "url": "https://chrisbanes.me/resume/", "published_at": "2020-11-28T16:18:21+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a715083f", "title": "Me", "url": "https://chrisbanes.me/me/", "published_at": "2020-11-28T16:17:33+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a74d2489", "title": "Compose for Existing Apps", "url": "https://chrisbanes.me/talks/compose-for-existing-apps-dcemea/", "published_at": "2020-10-09T13:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a78a8325", "title": "Compose for Existing Apps", "url": "https://chrisbanes.me/talks/compose-for-existing-apps-11w/", "published_at": "2020-08-26T11:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a8080aae", "title": "Animating your Keyboard", "url": "https://chrisbanes.me/talks/animating-your-keyboard/", "published_at": "2020-08-24T13:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a89762fb", "title": "Suspending over Views", "url": "https://chrisbanes.me/posts/suspending-views/", "published_at": "2019-12-03T00:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761a94f015e", "title": "Suspending over Views — Example", "url": "https://chrisbanes.me/posts/suspending-views-example/", "published_at": "2019-12-03T00:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761aa2848e8", "title": "Developing Themes with Style", "url": "https://chrisbanes.me/talks/developing-themes-with-style-syd/", "published_at": "2019-11-16T11:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761aa6abb46", "title": "Developing Themes with Style", "url": "https://chrisbanes.me/talks/developing-themes-with-style-ads/", "published_at": "2019-10-24T13:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761ab3a3b1d", "title": "Going edge-to-edge with Gesture Navigation", "url": "https://chrisbanes.me/talks/going-edge-to-edge-ads/", "published_at": "2019-10-23T13:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761abf9df54", "title": "Going edge-to-edge with Gesture Navigation", "url": "https://chrisbanes.me/talks/going-edge-to-edge-bangkok/", "published_at": "2019-07-07T13:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761acee7fd5", "title": "Developing Themes with Style", "url": "https://chrisbanes.me/talks/developing-themes-with-style-berlin/", "published_at": "2019-07-03T13:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761ad8e3880", "title": "Going edge-to-edge with Gesture Navigation", "url": "https://chrisbanes.me/talks/going-edge-to-edge-with-gesture-navigation/", "published_at": "2019-07-02T13:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761add8b2c1", "title": "Supporting mobile usability with Dark Theme and Gestures in Android Q", "url": "https://chrisbanes.me/talks/gesture-nav-dark-theme/", "published_at": "2019-05-09T11:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761ade82e55", "title": "WindowInsets — Listeners to layouts", "url": "https://chrisbanes.me/posts/insets-listeners-to-layouts/", "published_at": "2019-04-11T22:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761ae7d53c5", "title": "Santa Tracker - Moving to Android App Bundle", "url": "https://chrisbanes.me/talks/santa-tracker-moving-app-bundle-sydney/", "published_at": "2019-02-19T14:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761ae91c76a", "title": "Santa Tracker - Moving to Android App Bundle", "url": "https://chrisbanes.me/talks/santa-tracker-moving-app-bundle-shibuya/", "published_at": "2019-02-06T18:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761af5c63d7", "title": "Data Binding — Lessons Learnt", "url": "https://chrisbanes.me/posts/data-binding-lessons-learnt/", "published_at": "2019-01-09T00:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761afe442fe", "title": "Android Suspenders", "url": "https://chrisbanes.me/talks/android-suspenders-ads/", "published_at": "2018-11-07T14:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761b0cf4d8d", "title": "Android Suspenders", "url": "https://chrisbanes.me/talks/android-suspenders-devfest/", "published_at": "2018-10-27T13:00:00+00:00" }, { "id": "01a07df2-4002-7394-91c9-4761b18b9bf0", "title": "Android Suspenders", "url": "https://chrisbanes.me/talks/android-suspenders/", "published_at": "2018-10-03T13:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b4197ed91", "title": "CI cache key over many files", "url": "https://chrisbanes.me/posts/circleci-cache-files/", "published_at": "2018-06-07T22:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b421cbfb8", "title": "RxJava to Kotlin coroutines", "url": "https://chrisbanes.me/posts/rxjava-to-kotlin-coroutines/", "published_at": "2018-05-02T13:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b42951de3", "title": "Windows Insets + Fragment Transitions", "url": "https://chrisbanes.me/posts/window-insets-fragment-transitions/", "published_at": "2018-03-01T00:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b429c0779", "title": "Fragment Transitions", "url": "https://chrisbanes.me/posts/fragmented-transitions/", "published_at": "2018-02-18T00:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b42d49784", "title": "Becoming a master window fitter 🔧", "url": "https://chrisbanes.me/talks/becoming-a-master-window-fitter-lon/", "published_at": "2017-10-27T13:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b42db06bb", "title": "Room + Date / Time", "url": "https://chrisbanes.me/posts/room-time/", "published_at": "2017-10-18T10:30:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b42eb38d0", "title": "Becoming a master window fitter 🔧", "url": "https://chrisbanes.me/talks/becoming-a-master-window-fitter-nyc-2/", "published_at": "2017-09-25T13:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b435000a9", "title": "Carry on Scrolling", "url": "https://chrisbanes.me/posts/carry-on-scrolling/", "published_at": "2017-06-09T22:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b440ac635", "title": "Jekyll + Firebase Hosting", "url": "https://chrisbanes.me/posts/jekyll-firebase/", "published_at": "2017-06-02T13:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b4431a6de", "title": "Support Libraries - v25 and beyond", "url": "https://chrisbanes.me/talks/support-library-25-beyond/", "published_at": "2017-01-23T14:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b44f96695", "title": "Why isn’t my animation running?", "url": "https://chrisbanes.me/posts/animation-not-running/", "published_at": "2016-12-05T00:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b456a942c", "title": "Designing the Design Support Library", "url": "https://chrisbanes.me/talks/designing-the-design-library-lon/", "published_at": "2016-10-27T13:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b45a2b7ba", "title": "Nested scrolling - living life on the edge", "url": "https://chrisbanes.me/talks/designing-the-design-library-jp/", "published_at": "2016-10-09T13:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b45b89a55", "title": "Secrets of the Support Library", "url": "https://chrisbanes.me/talks/secrets-of-the-support-library/", "published_at": "2016-09-30T13:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b45eb8e56", "title": "Android Themes & Styles demystified", "url": "https://chrisbanes.me/talks/themes-and-styles-demystified-de/", "published_at": "2016-06-16T13:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b46614f53", "title": "Android Themes & Styles demystified", "url": "https://chrisbanes.me/talks/themes-and-styles-demystified/", "published_at": "2016-05-18T08:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b466daf8b", "title": "What's New in the Support Library", "url": "https://chrisbanes.me/talks/whats-new-in-support-library/", "published_at": "2016-05-17T13:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b46b66f5a", "title": "AppCompat v23.2 — Age of the vectors", "url": "https://chrisbanes.me/posts/appcompat-vector/", "published_at": "2016-02-25T00:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b46f130c4", "title": "DayNight — Adding a dark theme to your app", "url": "https://chrisbanes.me/posts/daynight/", "published_at": "2016-02-25T00:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b4743ed59", "title": "Support Library - Guts and Glory", "url": "https://chrisbanes.me/talks/support-lib-guts-glory/", "published_at": "2015-11-23T14:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b47814698", "title": "Support Library - Guts and Glory", "url": "https://chrisbanes.me/talks/support-lib-guts-glory-lon/", "published_at": "2015-10-29T14:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b47b313b2", "title": "What’s New in Android UI Engineering", "url": "https://chrisbanes.me/talks/whats-new-in-ui-engineering/", "published_at": "2015-08-28T08:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b47e2dcab", "title": "Support Libraries v22.1.0", "url": "https://chrisbanes.me/posts/support-libraries-v22-1-0/", "published_at": "2015-04-22T10:30:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b487878e1", "title": "Theme vs Style", "url": "https://chrisbanes.me/posts/theme-vs-style/", "published_at": "2014-11-12T16:28:02+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b49679a94", "title": "Papercraft", "url": "https://chrisbanes.me/talks/papercraft/", "published_at": "2014-10-31T12:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b4a1e2b10", "title": "Palette v21", "url": "https://chrisbanes.me/posts/palette-v21/", "published_at": "2014-10-20T14:04:27+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b4a320b3e", "title": "appcompat v21: material design for pre-Lollipop devices!", "url": "https://chrisbanes.me/posts/appcompat-v21/", "published_at": "2014-10-17T10:07:54+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b4ab95f8a", "title": "SystemUiHelper", "url": "https://chrisbanes.me/posts/systemuihelper/", "published_at": "2014-08-29T09:35:58+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b4b77ecbf", "title": "Palette preview", "url": "https://chrisbanes.me/posts/palette-preview/", "published_at": "2014-07-04T09:21:36+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b4bbc0a93", "title": "Philm is now open source", "url": "https://chrisbanes.me/posts/philm-is-now-open-source/", "published_at": "2014-06-18T14:48:44+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b4c811de8", "title": "Measuring Text", "url": "https://chrisbanes.me/posts/measuring-text/", "published_at": "2014-03-27T15:08:04+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b4ce7bc2b", "title": "Colour Matching - Part 2", "url": "https://chrisbanes.me/posts/colour-matching-pt-2/", "published_at": "2014-03-10T15:48:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b4d7f603d", "title": "New blog... again", "url": "https://chrisbanes.me/posts/new-blog-again/", "published_at": "2014-02-24T13:42:51+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b4dfad383", "title": "Colour Matching", "url": "https://chrisbanes.me/posts/colour-matching/", "published_at": "2014-02-18T10:14:12+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b4e8f8a3a", "title": "(My) Open Source Libraries", "url": "https://chrisbanes.me/posts/my-open-source-libraries/", "published_at": "2013-09-10T08:53:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b4f4af4c9", "title": "Pushing AARs to Maven Central", "url": "https://chrisbanes.me/posts/pushing-aars-to-maven-central/", "published_at": "2013-08-27T09:05:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b4ff7cb17", "title": "ActionBar-PullToRefresh", "url": "https://chrisbanes.me/posts/actionbar-pulltorefresh/", "published_at": "2013-06-22T11:42:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b50631d7f", "title": "IntelliJ Copyright Profile for Android", "url": "https://chrisbanes.me/posts/intellij-copyright-profile-for-android/", "published_at": "2013-06-01T10:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b5100ebc3", "title": "Checkable Views", "url": "https://chrisbanes.me/posts/checkable-views/", "published_at": "2013-03-22T00:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b51e4dba0", "title": "ListView - Keeping Position", "url": "https://chrisbanes.me/posts/listview-keeping-position/", "published_at": "2013-02-21T00:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b520c8946", "title": "Android-PullToRefresh – Stopping Development", "url": "https://chrisbanes.me/posts/android-pulltorefresh-stopping-dev/", "published_at": "2013-01-30T00:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b521ebd17", "title": "Snippet: Animated Action Bar Items", "url": "https://chrisbanes.me/posts/snippet-animated-action-bar-items/", "published_at": "2013-01-29T00:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b526fa8ab", "title": "Android-BitmapCache v2.1", "url": "https://chrisbanes.me/posts/android-bitmapcache-v2-1/", "published_at": "2013-01-24T00:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b52d888f7", "title": "photup is now open source.", "url": "https://chrisbanes.me/posts/photup-is-now-open-source/", "published_at": "2013-01-19T00:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b52e9e2d6", "title": "Snippet: ImageView Layout Optimisation", "url": "https://chrisbanes.me/posts/snippet-imageview-layout-optimisation/", "published_at": "2013-01-17T00:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b537dd510", "title": "Snippet: DateUtils", "url": "https://chrisbanes.me/posts/snippet-dateutils/", "published_at": "2013-01-15T00:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b54371b95", "title": "Android-BitmapCache… the rebirth.", "url": "https://chrisbanes.me/posts/android-bitmapcache-8230-the-rebirth/", "published_at": "2012-12-18T00:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b5471287c", "title": "PhotoView v1.1", "url": "https://chrisbanes.me/posts/photoview-v1-1/", "published_at": "2012-10-12T11:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b54911ec8", "title": "photup v1.x", "url": "https://chrisbanes.me/posts/photup-v1-x/", "published_at": "2012-08-28T22:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b549c67ec", "title": "photup v0.9 beta 2", "url": "https://chrisbanes.me/posts/photup-v0-9-beta-2/", "published_at": "2012-07-12T22:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b54f7f166", "title": "photup v0.9 beta 1", "url": "https://chrisbanes.me/posts/photup-v0-9-beta-1/", "published_at": "2012-07-08T22:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b55f5de9e", "title": "Android Bitmap Caching… revisited", "url": "https://chrisbanes.me/posts/android-bitmap-caching-8230-revisited/", "published_at": "2012-06-30T22:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b564523b5", "title": "Raspberry Pi: Media Server Pt. 1", "url": "https://chrisbanes.me/posts/raspberry-pi-media-server-pt-1/", "published_at": "2012-06-09T22:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b572e1c45", "title": "Raspberry Pi: Overclocking", "url": "https://chrisbanes.me/posts/raspberry-pi-overclocking/", "published_at": "2012-05-29T10:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b58165401", "title": "Raspberry Pi: Initial Setup", "url": "https://chrisbanes.me/posts/raspberry-pi-initial-setup/", "published_at": "2012-05-27T22:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b586c94f6", "title": "Pull-to-Refresh Customisable Drawable", "url": "https://chrisbanes.me/posts/pull-to-refresh-customisable-drawable/", "published_at": "2012-05-23T22:00:00+00:00" }, { "id": "01a07df2-4003-71c7-b635-2e7b58d3ff09", "title": "Pull-to-Refresh Indicator Concept", "url": "https://chrisbanes.me/posts/pull-to-refresh-indicator-concept/", "published_at": "2012-05-22T22:00:00+00:00" } ] posts Claim your blog
Back to Chris Banes
Blog · corpus.blog/blogs/chrisbanes.me/posts

Chris Banes

chrisbanes.me

2026

2025

2024

2023

2022

2021

2020

28 Nov 2020

2019

2018

2017

2016

2015

2014

2013

2012