Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
CodeMobile 2018 - Implementing a design languag...
Search
Carrie Hall
April 04, 2018
Programming
1
150
CodeMobile 2018 - Implementing a design language in Android
Carrie Hall
April 04, 2018
Tweet
Share
Other Decks in Programming
See All in Programming
Unicodeどうしてる? PHPから見たUnicode対応と他言語での対応についてのお伺い
youkidearitai
PRO
1
2.6k
AI時代のキャリアプラン「技術の引力」からの脱出と「問い」へのいざない / tech-gravity
minodriven
21
7.3k
コントリビューターによるDenoのすゝめ / Deno Recommendations by a Contributor
petamoriken
0
200
Amazon Bedrockを活用したRAGの品質管理パイプライン構築
tosuri13
5
760
FOSDEM 2026: STUNMESH-go: Building P2P WireGuard Mesh Without Self-Hosted Infrastructure
tjjh89017
0
170
20260127_試行錯誤の結晶を1冊に。著者が解説 先輩データサイエンティストからの指南書 / author's_commentary_ds_instructions_guide
nash_efp
1
980
15年続くIoTサービスのSREエンジニアが挑む分散トレーシング導入
melonps
2
220
IFSによる形状設計/デモシーンの魅力 @ 慶應大学SFC
gam0022
1
310
Grafana:建立系統全知視角的捷徑
blueswen
0
330
責任感のあるCloudWatchアラームを設計しよう
akihisaikeda
3
180
コマンドとリード間の連携に対する脅威分析フレームワーク
pandayumi
1
460
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
200
Featured
See All Featured
YesSQL, Process and Tooling at Scale
rocio
174
15k
Balancing Empowerment & Direction
lara
5
890
Gemini Prompt Engineering: Practical Techniques for Tangible AI Outcomes
mfonobong
2
280
Art, The Web, and Tiny UX
lynnandtonic
304
21k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
1
1.3k
Winning Ecommerce Organic Search in an AI Era - #searchnstuff2025
aleyda
1
1.9k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.7k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
230
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
9.5k
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
62
50k
How to Think Like a Performance Engineer
csswizardry
28
2.4k
Why Your Marketing Sucks and What You Can Do About It - Sophie Logan
marketingsoph
0
76
Transcript
None
Carrie Hall IMPLEMENTING A DESIGN LANGUAGE IN ANDROID
carrie_l_hall This is me! Carrie Hall @carrie_l_hall carriehall
carrie_l_hall the world’s largest music and audio platform
carrie_l_hall 90% mobile
carrie_l_hall 2010
carrie_l_hall 2010
carrie_l_hall 2011 2010
carrie_l_hall 2010 2014 2011 The interface is the brand
carrie_l_hall 2010 2011 2015 2014
carrie_l_hall 2010 2011 2014 2016 2015 material.io
carrie_l_hall DESIGN LANGUAGE
carrie_l_hall Centralised set of principles and reusable components using a
shared language
carrie_l_hall Centralised set of principles and reusable components using a
shared language
carrie_l_hall Centralised set of principles and reusable components using a
shared language
carrie_l_hall Centralised set of principles and reusable components using a
shared language
carrie_l_hall Centralised set of principles and reusable components using a
shared language
carrie_l_hall
carrie_l_hall
carrie_l_hall SOUL SoundCloud User Experience Language
carrie_l_hall Foundation Atoms Components Component library Principles Style Guide
carrie_l_hall Foundation Atoms Components Principles Style Guide Component library
carrie_l_hall
carrie_l_hall
carrie_l_hall Foundation Atoms Components Principles Style Guide Component library
carrie_l_hall
carrie_l_hall Foundation Atoms Components Principles Style Guide Component library
carrie_l_hall
carrie_l_hall
carrie_l_hall
carrie_l_hall Foundation Atoms Components Component library Principles Style Guide
carrie_l_hall SKETCH
carrie_l_hall
carrie_l_hall ZEPLIN SKETCH
carrie_l_hall 216dp
carrie_l_hall 72dp
carrie_l_hall
carrie_l_hall Foundation Atoms Components Component library Principles Style Guide
carrie_l_hall
carrie_l_hall Consistent designs Faster iterations
carrie_l_hall
carrie_l_hall Clean code
carrie_l_hall Meaningful names
carrie_l_hall Decoupled
carrie_l_hall data
carrie_l_hall data
carrie_l_hall style data
carrie_l_hall style animations data
carrie_l_hall style accessibility animations data
carrie_l_hall limits style accessibility animations data
carrie_l_hall formatting data style accessibility animations limits
carrie_l_hall
carrie_l_hall Component library App Components Atoms Foundation
carrie_l_hall File > New > New module
carrie_l_hall Android Library
carrie_l_hall components manifests java res
carrie_l_hall components atoms
carrie_l_hall components atoms foundation
carrie_l_hall
carrie_l_hall compile project(":foundation") Components Atoms Foundation
carrie_l_hall compile project(":atoms") Components Atoms Foundation
carrie_l_hall Components Atoms Foundation App compile project(":components")
carrie_l_hall <public />
carrie_l_hall Library vs Module
carrie_l_hall Components Atoms Foundation App
carrie_l_hall <color name="soundcloudOrange">#ff5500</color> <color name="raven">#333333</color> <color name="platinum">#cccccc</color> <color name="cornflower">#3388dd</color> <color
name="mint">#e5f3f3</color> colors.xml foundation
carrie_l_hall <color name="soundcloudOrange">#ff5500</color> <color name="raven">#333333</color> <color name="platinum">#cccccc</color> <color name="cornflower">#3388dd</color> <color
name="mint">#e5f3f3</color> colors.xml foundation
carrie_l_hall <color name="soundcloudOrange">#ff5500</color> <color name="raven">#333333</color> <color name="platinum">#cccccc</color> <color name="cornflower">#3388dd</color> <color
name="mint">#e5f3f3</color> colors.xml foundation
carrie_l_hall <color name="button_bg">@color/cornflower</color> colors.xml app
carrie_l_hall private fun Int.format(): String { return NumberFormat .getInstance(Locale.getDefault()) .format(this)
} foundation
carrie_l_hall Components Atoms Foundation App
carrie_l_hall atoms
carrie_l_hall atoms 36dp 100dp
carrie_l_hall atoms 16dp 12dp
carrie_l_hall atoms 20dp 10dp 16dp
carrie_l_hall atoms Radius 4dp
carrie_l_hall atoms silver charcoal
carrie_l_hall <ConstraintLayout> <ImageView> <TextView> </ContraintLayout> atoms
carrie_l_hall res layout <> btn_heart_count.xml atoms
carrie_l_hall res values <> styles.xml atoms
carrie_l_hall res values <> styles.xml atoms
carrie_l_hall java com.soundcloud.uicomponents HeartCountButton c atoms
carrie_l_hall class HeartCountButton : ConstraintLayout HeartCountButton c atoms
carrie_l_hall .inflate(R.layout.btn_heart_count,this,true) atoms HeartCountButton c
carrie_l_hall <com.soundcloud.atoms.HeartCountButton android:id="@+id/btn_heart_count" android:layout_width="wrap_content" android:layout_height="wrap_content" /> app
carrie_l_hall interface HeartCount { fun count(count: Int) fun enable() fun
disable() } atoms
carrie_l_hall override fun count(count: Int) { count_text.text = count.toString() }
atoms
carrie_l_hall override fun count(count: Int) { count_text.text = count.format() }
atoms
carrie_l_hall override fun enable() { heart.isSelected = true } atoms
carrie_l_hall override fun enable() { heart.animate() } atoms
carrie_l_hall heartCountButton.count(8355) .enable() .disable() app
carrie_l_hall Components Atoms Foundation App
carrie_l_hall components
carrie_l_hall CompactListItem c <> compact_list_item.xml ... components
carrie_l_hall <com.soundcloud.components.CompactListItem android:id="@+id/compact_list_item" android:layout_width="match_parent" android:layout_height="wrap_content" /> app
carrie_l_hall compactListItem.username(“Username”) .location(“Location”) .followCount(6540) .following(false) .pro(true) app
carrie_l_hall data class CompactListItemViewModel( val lineOne: String, val lineTwo: String,
val followCount: Int, val isFollowing: Boolean, val isPro: Boolean, val image: Bitmap ) {} components
carrie_l_hall data class CompactListItemViewModel( val lineOne: String = "", val
lineTwo: String = "", val followCount: Int, val isFollowing: Boolean = false, val isPro: Boolean = false, val image: Bitmap = null ) {} components
carrie_l_hall CompactListItemViewModel("Username", "Location", 6540, isPro = true) app
carrie_l_hall compactListItem.render(viewModel) app
carrie_l_hall Components Atoms Foundation App Sample App
carrie_l_hall Fast
carrie_l_hall Showcase
carrie_l_hall Sample data
carrie_l_hall
carrie_l_hall tools:src="@tools:sample/avatars" tools:src="@tools:sample/first_names" tools:src="@tools:sample/cities"
carrie_l_hall
carrie_l_hall Edge cases
carrie_l_hall
carrie_l_hall But how did we do it?
carrie_l_hall Future plans
carrie_l_hall I want one!
carrie_l_hall Benefits
carrie_l_hall Work with your design team
carrie_l_hall Build a library which everyone understands
carrie_l_hall Maintain a sample app
@carrie_l_hall THANK YOU