SlideShare a Scribd company logo
1 of 48
Download to read offline
머터리얼 디자인 테마와 플러터
조은실
디자이너 님들
개발자가 다 안 된다고 하니까 힘드시죠?
개발자 님들
디자이너가 듣도 보도 못한 디자인 주니까
힘드시죠?
이 발표를 통해
디자이너 님들
디자인 테마 변경을 위해 어떤 정보를
개발자에게 제공해주면 좋을지
이 발표를 통해
개발자 님들
디자인 테마 변경을 통해 일괄적으로
디자인을 반영하고 개발하는 방법을
함께 고민하고 알아갔으면 좋겠습니다.
Material Theme Editor
머터리얼 테마 에디터
나만의 머터리얼 테마를 만들고
색상, 모양 및 타이포그래피 스타일을 적용하여
디자인 라이브러리를 만들어주는 툴
왜 사용했나요?
디자인 전문가가 아니여도
나만의 머터리얼 디자인 테마를
손쉽게 만들수 있어요.
with
Flutter
플러터
iOS, 안드로이드에서
고품질 네이티브 인터페이스를 만들기 위한
구글의 모바일 앱 SDK
왜 사용했나요?
제일 많은
머터리얼 디자인 컴포넌트를(MDC-Flutter)
지원해요.
with
더 알고 가기
Google
Material Design Roadmap
https://github.com/material-components/material-components/blob/develop/ROADMAP.md
Flutter
Material Components Widgets
https://flutter.io/widgets/material/
할 일
Color Theme
컬러
colors.dart
const themePrimary = const Color(0xFFEDE3D0);
const themePrimaryDark = const Color(0xFFAD8D4D);
const themePrimaryLight = const Color(0xFFffffff);
const themeSecondary = const Color(0xFF000000);
const themeSecondaryDark = const Color(0xFF000000);
const themeSecondaryLight = const Color(0xFF434343);
const themeSurface = const Color(0xFFffffff);
const themeSurfaceDark = const Color(0xFFf6f6f6);
const themeSurfaceLight = const Color(0xFFffffff);
const themePrimaryText = const Color(0xFF060606);
const themeSecondaryText = const Color(0xFFffffff);
const themeSurfaceText = const Color(0xFF060606);
const themeErrorRed = const Color(0xFFC5032B);
themes.dart
ThemeData buildFirstTheme() {
final ThemeData base = ThemeData.light();
return base.copyWith(
primaryColor: themePrimary,
primaryColorLight: themePrimaryLight,
primaryColorDark: themePrimaryDark,
accentColor: themeSecondary,
buttonColor: themeSecondary,
backgroundColor: themeSurface,
errorColor: themeErrorRed,
);
}
app.dart
final ThemeData firstTheme = buildFirstTheme();
@override
Widget build(BuildContext context) {
return MaterialApp(
title: appName,
home: Backdrop(
frontLayer: HomePage(),
backLayer: BackPage(
onTap: _onProductTap,
productItem: _productItem
)
),
...
theme: firstTheme
);
}
detail.dart
@override
Widget build(BuildContext context) {
...
return Scaffold(
appBar: AppBar(
title: Text(productItem.hashtag.toUpperCase()),
leading: IconButton(
icon: Icon(Icons.arrow_back),
onPressed: () {
Navigator.pop(context);
},
)
),
body: Stack(
children: <Widget>[
...
Positioned(
top: 16.0,
right: 16.0,
child: FloatingActionButton(
onPressed: () {},
child: Icon(Icons.favorite),
),
)
],
)
);
}
login.dart
@override
Widget build(BuildContext context) {
return Scaffold(
body: Container(
color: themePrimary,
child: ListView(
padding: EdgeInsets.symmetric(horizontal: 24.0, vertical: 24.0),
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
FlatButton(
onPressed: () {},
child: Text('Sign up')
)
],
),
...
RaisedButton(
onPressed: () {
Navigator.pop(context);
},
child: Text('Login')
),
...
Typography Theme
타이포그래피
Headline 3 / Gilroy ExtraBold
Headline 4 / Gilroy ExtraBold
Headline 5 / Gilroy ExtraBold
Headline 6 / Gilroy ExtraBold
Body 1 / Gilroy Light
Body 2 / Gilroy Light
Subtitle 1 / Gilroy ExtraBold
BUTTON / Gilroy ExtraBold
pubspec.yaml
fonts:
- family: Gilroy
fonts:
- asset: fonts/Gilroy-ExtraBold.otf
- asset: fonts/Gilroy-Light.otf
themes.dart
TextTheme _buildTextTheme(TextTheme base, Color themeTextColor) {
return base.copyWith(
display2: base.display2.copyWith(
fontSize: 48.0,
fontWeight: FontWeight.bold
),
display1: base.display1.copyWith(
fontSize: 40.0,
fontWeight: FontWeight.bold
),
headline: base.headline.copyWith(
fontSize: 24.0,
fontWeight: FontWeight.bold
),
title: base.title.copyWith(
fontSize: 20.0,
fontWeight: FontWeight.bold
),
subhead: base.subhead.copyWith(
fontSize: 16.0,
fontWeight: FontWeight.bold
),
body2: base.body2.copyWith(
fontSize: 16.0
),
body1: base.body1.copyWith(
fontSize: 14.0
),
button: base.button.copyWith(
fontSize: 20.0,
fontWeight: FontWeight.bold
),
).apply(
fontFamily: 'Gilroy',
displayColor: themeTextColor,
bodyColor: themeTextColor
);
}
themes.dart
ThemeData buildAppTheme() {
final ThemeData base = ThemeData.light();
return base.copyWith(
...
textTheme: _buildTextTheme(base.textTheme, themeSurfaceText),
primaryTextTheme: _buildTextTheme(base.primaryTextTheme, themePrimaryText),
accentTextTheme: _buildTextTheme(base.accentTextTheme, themeSecondaryText)
);
}
product_item_list.dart
Text(
title,
style: themeData.primaryTextTheme.headline,
),
product_item_card.dart
Text(
productItem.title.toUpperCase(),
textAlign: TextAlign.left,
overflow: TextOverflow.ellipsis,
maxLines: 2,
style: theme.textTheme.subhead,
),
...
Text(
productItem.subTitle,
textAlign: TextAlign.left,
overflow: TextOverflow.ellipsis,
maxLines: 2,
style: theme.textTheme.body1,
),
...
child: Text(
'# ${productItem.hashtag}',
style: theme.accentTextTheme.headline,
),
detail.dart
Text(
productItem.title,
style: theme.primaryTextTheme.headline,
),
...
Text(
formatter.format(productItem.price),
style: theme.textTheme.display1,
),
Text(
'원',
style: theme.textTheme.title,
)
...
Text(
productItem.gender + 'n' +
'착용 모델 사이즈 : ${productItem.modelSize}' + 'n' +
'착용 사이즈 : ${productItem.size}' + 'n' +
'디테일 핏 : 루즈',
style: theme.textTheme.body2,
),
...
Text(
productItem.description,
style: theme.textTheme.body2,
)
...
RaisedButton(
onPressed: () {},
child: Text(
'BUY',
style: theme.accentTextTheme.button
)
),
home.dart
Text(
productItem.title.replaceAll(' ', 'n'),
textAlign: textAlign,
style: theme.primaryTextTheme.display2
),
...
child: RaisedButton(
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) =>
DetailPage(
productItem: productItem
),
),
);
},
child: Text(
'BUY',
style: theme.accentTextTheme.button
),
),
...
Icon, Button Theme
아이콘, 버튼 테마
themes.dart
ThemeData buildAppTheme() {
final ThemeData base = ThemeData.light();
return base.copyWith(
...
buttonColor: themeSecondary,
...
primaryIconTheme: _buildIconTheme(base.iconTheme, themeSecondary),
buttonTheme: _buildButtonTheme(base.buttonTheme, 48.0),
);
}
...
IconThemeData _buildIconTheme(IconThemeData base, Color color) {
return base.copyWith(color: color, opacity: 0.5);
}
ButtonThemeData _buildButtonTheme(ButtonThemeData base, double height) {
return base.copyWith(height: height);
}
Shape
모양
themes.dart
ShapeBorder buildButtonShapeBorder() {
return BeveledRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(7.0))
);
}
login.dart
RaisedButton(
onPressed: () {
Navigator.pop(context);
},
shape: buildButtonShapeBorder(),
child: Text(
'Login',
style: theme.accentTextTheme.button
)
),
home.dart
child: RaisedButton(
...
color: themeSecondary_50,
shape: buildButtonShapeBorder(),
child: Text(
'BUY',
style: theme.accentTextTheme.button
),
),
backdrop.dart
@override
Widget build(BuildContext context) {
return Material(
elevation: 8.0,
shape: BeveledRectangleBorder(
borderRadius: BorderRadius.only(topLeft: Radius.circular(24.0))
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Expanded(
child: child,
),
],
),
);
}
Second Theme
두번째 테마
Color Theme & Shape
컬러 / 모양
colors.dart
const themePrimary = const Color(0xFFd1c4e9);
const themePrimaryDark = const Color(0xFF9078c8);
const themePrimaryLight = const Color(0xFFece8f5);
const themeSecondary = const Color(0xFFf8bbd0);
const themeSecondaryDark = const Color(0xFFe06b92);
const themeSecondaryLight = const Color(0xFFf8e5ec);
const themeSurface = const Color(0xFFffffff);
const themeSurfaceDark = const Color(0xFFf6f6f6);
const themeSurfaceLight = const Color(0xFFffffff);
const themePrimaryText = const Color(0xFF040404);
const themeSecondaryText = const Color(0xFF040404);
const themeSurfaceText = const Color(0xFF040404);
const themeSecondary_50 = const Color(0x50f8bbd0);
themes.dart
ThemeData buildAppTheme() {
final ThemeData base = ThemeData.light();
return base.copyWith(
...
primaryIconTheme: _buildIconTheme(base.iconTheme, Colors.black54),
accentIconTheme: _buildIconTheme(base.iconTheme, Colors.black),
...
);
}
ShapeBorder buildButtonShapeBorder() {
return RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(18.0))
);
}
backdrop.dart
@override
Widget build(BuildContext context) {
return Material(
elevation: 8.0,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(24.0), topRight: Radius.circular(24.0)
)
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: <Widget>[
Expanded(
child: child,
),
],
),
);
}
Second Theme
두번째 테마
Third Theme
세번째 테마
Color & Typography Theme
컬러 / 타이포그래피
Headline 3 / Nanum ExtraBold
Headline 4 / Nanum ExtraBold
Headline 5 / Nanum ExtraBold
Headline 6 / Nanum ExtraBold
Body 1 / Nanum Light
Body 2 / Nanum Light
Subtitle 1 / Nanum ExtraBold
BUTTON / Nanum ExtraBold
pubspec.yaml
fonts:
- family: Nanum
fonts:
- asset: fonts/NanumSquareRoundEB.ttf
- asset: fonts/NanumSquareRoundL.ttf
colors.dart
const themePrimary = const Color(0xFF003a71);
const themePrimaryDark = const Color(0xFF072151);
const themePrimaryLight = const Color(0xFF244a80);
const themeSecondary = const Color(0xFFcc60fd);
const themeSecondaryDark = const Color(0xFFa02be9);
const themeSecondaryLight = const Color(0xFFe3c1fa);
const themeSurface = const Color(0xFF0d1a2a);
const themeSurfaceDark = const Color(0xFF000000);
const themeSurfaceLight = const Color(0xFF303e53);
const themePrimaryText = const Color(0xFFffffff);
const themeSecondaryText = const Color(0xFFffffff);
const themeSurfaceText = const Color(0xFFffffff);
const themeSecondary_50 = const Color(0x50cc60fd);
themes.dart
ThemeData buildAppTheme() {
final ThemeData base = ThemeData.dark();
return base.copyWith(
...
scaffoldBackgroundColor: themeSurface,
...
primaryIconTheme: _buildIconTheme(base.iconTheme, Colors.white70),
accentIconTheme: _buildIconTheme(base.iconTheme, Colors.white),
...
);
}
themes.dart
TextTheme _buildTextTheme(TextTheme base, Color themeTextColor) {
return base.copyWith(
display2: base.display2.copyWith(
fontSize: 48.0,
fontWeight: FontWeight.bold
),
display1: base.display1.copyWith(
fontSize: 40.0,
fontWeight: FontWeight.bold
),
headline: base.headline.copyWith(
fontSize: 24.0,
fontWeight: FontWeight.bold
),
title: base.title.copyWith(
fontSize: 20.0,
fontWeight: FontWeight.bold
),
subhead: base.subhead.copyWith(
fontSize: 16.0,
fontWeight: FontWeight.bold
),
body2: base.body2.copyWith(
fontSize: 16.0
),
body1: base.body1.copyWith(
fontSize: 14.0
),
button: base.button.copyWith(
fontSize: 20.0,
fontWeight: FontWeight.bold
),
).apply(
fontFamily: 'Nanum',
displayColor: themeTextColor,
bodyColor: themeTextColor
);
}
Third Theme
세번째 테마
이 발표를 통해
디자이너 님들
메인 디자인 컬러와 타이포그래피를 정하고,
파생시킨 공통적인 테마 요소를
개발자에게 공유해주세요.
이 발표를 통해
개발자 님들
더이상 각 화면마다
컬러나 폰트를 지정하지 마세요.
공통적인 테마를 정의하고
컴포넌트들에 스타일을 적용하여
1분 만에 디자인을 변경하고 퇴근하세요.
추가로
포인트 디자인
디자이너 님들 욕심 내세요.
개발자 님들 개발 해주세요.
추가로
협업
사전적 의미
많은 사람이 일정한 계획 아래 노동을 분담하여
협동적, 조직적으로 일하는 것
나의 의미
서로가 어떤 것을 필요로 하는지
궁금해하고 알아가는 과정으로
좋은 결과물이 탄생되는 것
웃으며 협업합시다. J
샘플 소스
https://github.com/EunsilJo/flutter_sample
이미지 참조
https://material.io/tools/, Google
https://www.sketchapp.com, Sketch
https://www.emanprague.com/en/blog/lets-develop-a-mobile-app-in-flutter-13/, Filip Šmíd
https://ko.wikipedia.org/wiki/안드로이드_스튜디오, Wikipedia
https://unsplash.com/@hustwilson, Hust Wilson
김태훈 디자이너님
https://www.facebook.com/abcdeha
감사합니다.

More Related Content

Similar to Material Design Theme & Flutter by Eunsil Jo

HTML Lab ProjectTo create a simple web page you will need to use.docx
HTML Lab ProjectTo create a simple web page you will need to use.docxHTML Lab ProjectTo create a simple web page you will need to use.docx
HTML Lab ProjectTo create a simple web page you will need to use.docxfideladallimore
 
Twig for Drupal @ Frontendunited Amsterdam 2012
Twig for Drupal @ Frontendunited Amsterdam 2012Twig for Drupal @ Frontendunited Amsterdam 2012
Twig for Drupal @ Frontendunited Amsterdam 2012Rene Bakx
 
Le Wagon Tokyo | Build your Landing Page in 2 hours
Le Wagon Tokyo | Build your Landing Page in 2 hoursLe Wagon Tokyo | Build your Landing Page in 2 hours
Le Wagon Tokyo | Build your Landing Page in 2 hoursYannKlein2
 
Display Suite: A Themers Perspective
Display Suite: A Themers PerspectiveDisplay Suite: A Themers Perspective
Display Suite: A Themers PerspectiveMediacurrent
 
Working with color and font
Working with color and fontWorking with color and font
Working with color and fontmyrajendra
 
Joomla! Day UK 2009 Basic Templates
Joomla! Day UK 2009 Basic TemplatesJoomla! Day UK 2009 Basic Templates
Joomla! Day UK 2009 Basic TemplatesAndy Wallace
 
Joomla Day UK 2009 Basic Templates
Joomla Day UK 2009 Basic TemplatesJoomla Day UK 2009 Basic Templates
Joomla Day UK 2009 Basic TemplatesChris Davenport
 
WordPress Theme Design - Rich Media Institute Workshop
WordPress Theme Design - Rich Media Institute WorkshopWordPress Theme Design - Rich Media Institute Workshop
WordPress Theme Design - Rich Media Institute WorkshopBrendan Sera-Shriar
 
The Ring programming language version 1.4.1 book - Part 14 of 31
The Ring programming language version 1.4.1 book - Part 14 of 31The Ring programming language version 1.4.1 book - Part 14 of 31
The Ring programming language version 1.4.1 book - Part 14 of 31Mahmoud Samir Fayed
 
CrowdFusion: The Front-End Edition, Part I: Presentation Layer
CrowdFusion: The Front-End Edition, Part I: Presentation LayerCrowdFusion: The Front-End Edition, Part I: Presentation Layer
CrowdFusion: The Front-End Edition, Part I: Presentation Layergraybill
 
RPE - Template formating, style and stylesheet usage
RPE - Template formating, style and stylesheet usageRPE - Template formating, style and stylesheet usage
RPE - Template formating, style and stylesheet usageGEBS Reporting
 
WordPress Theme Workshop: Part 4
WordPress Theme Workshop: Part 4WordPress Theme Workshop: Part 4
WordPress Theme Workshop: Part 4David Bisset
 
The Ring programming language version 1.3 book - Part 37 of 88
The Ring programming language version 1.3 book - Part 37 of 88The Ring programming language version 1.3 book - Part 37 of 88
The Ring programming language version 1.3 book - Part 37 of 88Mahmoud Samir Fayed
 
Le wagon workshop - 2h landing page - Andre Ferrer
Le wagon   workshop - 2h landing page - Andre FerrerLe wagon   workshop - 2h landing page - Andre Ferrer
Le wagon workshop - 2h landing page - Andre FerrerAndré Ferrer
 
10 WordPress Theme Hacks to Improve Your Site
10 WordPress Theme Hacks to Improve Your Site10 WordPress Theme Hacks to Improve Your Site
10 WordPress Theme Hacks to Improve Your SiteMorten Rand-Hendriksen
 
Introduction to Drupal (7) Theming
Introduction to Drupal (7) ThemingIntroduction to Drupal (7) Theming
Introduction to Drupal (7) ThemingRobert Carr
 

Similar to Material Design Theme & Flutter by Eunsil Jo (20)

2h landing page
2h landing page 2h landing page
2h landing page
 
HTML Lab ProjectTo create a simple web page you will need to use.docx
HTML Lab ProjectTo create a simple web page you will need to use.docxHTML Lab ProjectTo create a simple web page you will need to use.docx
HTML Lab ProjectTo create a simple web page you will need to use.docx
 
Le Wagon - Landing page
Le Wagon - Landing pageLe Wagon - Landing page
Le Wagon - Landing page
 
Twig for Drupal @ Frontendunited Amsterdam 2012
Twig for Drupal @ Frontendunited Amsterdam 2012Twig for Drupal @ Frontendunited Amsterdam 2012
Twig for Drupal @ Frontendunited Amsterdam 2012
 
Le Wagon Tokyo | Build your Landing Page in 2 hours
Le Wagon Tokyo | Build your Landing Page in 2 hoursLe Wagon Tokyo | Build your Landing Page in 2 hours
Le Wagon Tokyo | Build your Landing Page in 2 hours
 
Display Suite: A Themers Perspective
Display Suite: A Themers PerspectiveDisplay Suite: A Themers Perspective
Display Suite: A Themers Perspective
 
Working with color and font
Working with color and fontWorking with color and font
Working with color and font
 
Joomla! Day UK 2009 Basic Templates
Joomla! Day UK 2009 Basic TemplatesJoomla! Day UK 2009 Basic Templates
Joomla! Day UK 2009 Basic Templates
 
Joomla Day UK 2009 Basic Templates
Joomla Day UK 2009 Basic TemplatesJoomla Day UK 2009 Basic Templates
Joomla Day UK 2009 Basic Templates
 
WordPress Theme Design - Rich Media Institute Workshop
WordPress Theme Design - Rich Media Institute WorkshopWordPress Theme Design - Rich Media Institute Workshop
WordPress Theme Design - Rich Media Institute Workshop
 
The Ring programming language version 1.4.1 book - Part 14 of 31
The Ring programming language version 1.4.1 book - Part 14 of 31The Ring programming language version 1.4.1 book - Part 14 of 31
The Ring programming language version 1.4.1 book - Part 14 of 31
 
CrowdFusion: The Front-End Edition, Part I: Presentation Layer
CrowdFusion: The Front-End Edition, Part I: Presentation LayerCrowdFusion: The Front-End Edition, Part I: Presentation Layer
CrowdFusion: The Front-End Edition, Part I: Presentation Layer
 
RPE - Template formating, style and stylesheet usage
RPE - Template formating, style and stylesheet usageRPE - Template formating, style and stylesheet usage
RPE - Template formating, style and stylesheet usage
 
WebDesigning.pptx
WebDesigning.pptxWebDesigning.pptx
WebDesigning.pptx
 
WordPress Theme Workshop: Part 4
WordPress Theme Workshop: Part 4WordPress Theme Workshop: Part 4
WordPress Theme Workshop: Part 4
 
The Ring programming language version 1.3 book - Part 37 of 88
The Ring programming language version 1.3 book - Part 37 of 88The Ring programming language version 1.3 book - Part 37 of 88
The Ring programming language version 1.3 book - Part 37 of 88
 
Le wagon workshop - 2h landing page - Andre Ferrer
Le wagon   workshop - 2h landing page - Andre FerrerLe wagon   workshop - 2h landing page - Andre Ferrer
Le wagon workshop - 2h landing page - Andre Ferrer
 
Supercharge your ui
Supercharge your uiSupercharge your ui
Supercharge your ui
 
10 WordPress Theme Hacks to Improve Your Site
10 WordPress Theme Hacks to Improve Your Site10 WordPress Theme Hacks to Improve Your Site
10 WordPress Theme Hacks to Improve Your Site
 
Introduction to Drupal (7) Theming
Introduction to Drupal (7) ThemingIntroduction to Drupal (7) Theming
Introduction to Drupal (7) Theming
 

Recently uploaded

What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number SystemsJheuzeDellosa
 
Engage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyEngage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyFrank van der Linden
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfkalichargn70th171
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...soniya singh
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationkaushalgiri8080
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxTier1 app
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfkalichargn70th171
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxbodapatigopi8531
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...Christina Lin
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEOrtus Solutions, Corp
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptkotipi9215
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 

Recently uploaded (20)

What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number Systems
 
Engage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The UglyEngage Usergroup 2024 - The Good The Bad_The Ugly
Engage Usergroup 2024 - The Good The Bad_The Ugly
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
 
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
Russian Call Girls in Karol Bagh Aasnvi ➡️ 8264348440 💋📞 Independent Escort S...
 
Project Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanationProject Based Learning (A.I).pptx detail explanation
Project Based Learning (A.I).pptx detail explanation
 
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptxKnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
KnowAPIs-UnknownPerf-jaxMainz-2024 (1).pptx
 
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdfLearn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
Learn the Fundamentals of XCUITest Framework_ A Beginner's Guide.pdf
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
 
Hand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptxHand gesture recognition PROJECT PPT.pptx
Hand gesture recognition PROJECT PPT.pptx
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASEBATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
BATTLEFIELD ORM: TIPS, TACTICS AND STRATEGIES FOR CONQUERING YOUR DATABASE
 
chapter--4-software-project-planning.ppt
chapter--4-software-project-planning.pptchapter--4-software-project-planning.ppt
chapter--4-software-project-planning.ppt
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...Call Girls In Mukherjee Nagar 📱  9999965857  🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
Call Girls In Mukherjee Nagar 📱 9999965857 🤩 Delhi 🫦 HOT AND SEXY VVIP 🍎 SE...
 

Material Design Theme & Flutter by Eunsil Jo

  • 1. 머터리얼 디자인 테마와 플러터 조은실
  • 2. 디자이너 님들 개발자가 다 안 된다고 하니까 힘드시죠?
  • 3. 개발자 님들 디자이너가 듣도 보도 못한 디자인 주니까 힘드시죠?
  • 4. 이 발표를 통해 디자이너 님들 디자인 테마 변경을 위해 어떤 정보를 개발자에게 제공해주면 좋을지
  • 5. 이 발표를 통해 개발자 님들 디자인 테마 변경을 통해 일괄적으로 디자인을 반영하고 개발하는 방법을
  • 7. Material Theme Editor 머터리얼 테마 에디터 나만의 머터리얼 테마를 만들고 색상, 모양 및 타이포그래피 스타일을 적용하여 디자인 라이브러리를 만들어주는 툴
  • 8. 왜 사용했나요? 디자인 전문가가 아니여도 나만의 머터리얼 디자인 테마를 손쉽게 만들수 있어요. with
  • 9. Flutter 플러터 iOS, 안드로이드에서 고품질 네이티브 인터페이스를 만들기 위한 구글의 모바일 앱 SDK
  • 10. 왜 사용했나요? 제일 많은 머터리얼 디자인 컴포넌트를(MDC-Flutter) 지원해요. with
  • 11. 더 알고 가기 Google Material Design Roadmap https://github.com/material-components/material-components/blob/develop/ROADMAP.md Flutter Material Components Widgets https://flutter.io/widgets/material/
  • 14. colors.dart const themePrimary = const Color(0xFFEDE3D0); const themePrimaryDark = const Color(0xFFAD8D4D); const themePrimaryLight = const Color(0xFFffffff); const themeSecondary = const Color(0xFF000000); const themeSecondaryDark = const Color(0xFF000000); const themeSecondaryLight = const Color(0xFF434343); const themeSurface = const Color(0xFFffffff); const themeSurfaceDark = const Color(0xFFf6f6f6); const themeSurfaceLight = const Color(0xFFffffff); const themePrimaryText = const Color(0xFF060606); const themeSecondaryText = const Color(0xFFffffff); const themeSurfaceText = const Color(0xFF060606); const themeErrorRed = const Color(0xFFC5032B);
  • 15. themes.dart ThemeData buildFirstTheme() { final ThemeData base = ThemeData.light(); return base.copyWith( primaryColor: themePrimary, primaryColorLight: themePrimaryLight, primaryColorDark: themePrimaryDark, accentColor: themeSecondary, buttonColor: themeSecondary, backgroundColor: themeSurface, errorColor: themeErrorRed, ); } app.dart final ThemeData firstTheme = buildFirstTheme(); @override Widget build(BuildContext context) { return MaterialApp( title: appName, home: Backdrop( frontLayer: HomePage(), backLayer: BackPage( onTap: _onProductTap, productItem: _productItem ) ), ... theme: firstTheme ); }
  • 16. detail.dart @override Widget build(BuildContext context) { ... return Scaffold( appBar: AppBar( title: Text(productItem.hashtag.toUpperCase()), leading: IconButton( icon: Icon(Icons.arrow_back), onPressed: () { Navigator.pop(context); }, ) ), body: Stack( children: <Widget>[ ... Positioned( top: 16.0, right: 16.0, child: FloatingActionButton( onPressed: () {}, child: Icon(Icons.favorite), ), ) ], ) ); }
  • 17. login.dart @override Widget build(BuildContext context) { return Scaffold( body: Container( color: themePrimary, child: ListView( padding: EdgeInsets.symmetric(horizontal: 24.0, vertical: 24.0), children: <Widget>[ Row( mainAxisAlignment: MainAxisAlignment.end, children: <Widget>[ FlatButton( onPressed: () {}, child: Text('Sign up') ) ], ), ... RaisedButton( onPressed: () { Navigator.pop(context); }, child: Text('Login') ), ...
  • 18. Typography Theme 타이포그래피 Headline 3 / Gilroy ExtraBold Headline 4 / Gilroy ExtraBold Headline 5 / Gilroy ExtraBold Headline 6 / Gilroy ExtraBold Body 1 / Gilroy Light Body 2 / Gilroy Light Subtitle 1 / Gilroy ExtraBold BUTTON / Gilroy ExtraBold
  • 19. pubspec.yaml fonts: - family: Gilroy fonts: - asset: fonts/Gilroy-ExtraBold.otf - asset: fonts/Gilroy-Light.otf
  • 20. themes.dart TextTheme _buildTextTheme(TextTheme base, Color themeTextColor) { return base.copyWith( display2: base.display2.copyWith( fontSize: 48.0, fontWeight: FontWeight.bold ), display1: base.display1.copyWith( fontSize: 40.0, fontWeight: FontWeight.bold ), headline: base.headline.copyWith( fontSize: 24.0, fontWeight: FontWeight.bold ), title: base.title.copyWith( fontSize: 20.0, fontWeight: FontWeight.bold ), subhead: base.subhead.copyWith( fontSize: 16.0, fontWeight: FontWeight.bold ), body2: base.body2.copyWith( fontSize: 16.0 ), body1: base.body1.copyWith( fontSize: 14.0 ), button: base.button.copyWith( fontSize: 20.0, fontWeight: FontWeight.bold ), ).apply( fontFamily: 'Gilroy', displayColor: themeTextColor, bodyColor: themeTextColor ); }
  • 21. themes.dart ThemeData buildAppTheme() { final ThemeData base = ThemeData.light(); return base.copyWith( ... textTheme: _buildTextTheme(base.textTheme, themeSurfaceText), primaryTextTheme: _buildTextTheme(base.primaryTextTheme, themePrimaryText), accentTextTheme: _buildTextTheme(base.accentTextTheme, themeSecondaryText) ); }
  • 22. product_item_list.dart Text( title, style: themeData.primaryTextTheme.headline, ), product_item_card.dart Text( productItem.title.toUpperCase(), textAlign: TextAlign.left, overflow: TextOverflow.ellipsis, maxLines: 2, style: theme.textTheme.subhead, ), ... Text( productItem.subTitle, textAlign: TextAlign.left, overflow: TextOverflow.ellipsis, maxLines: 2, style: theme.textTheme.body1, ), ... child: Text( '# ${productItem.hashtag}', style: theme.accentTextTheme.headline, ),
  • 23. detail.dart Text( productItem.title, style: theme.primaryTextTheme.headline, ), ... Text( formatter.format(productItem.price), style: theme.textTheme.display1, ), Text( '원', style: theme.textTheme.title, ) ... Text( productItem.gender + 'n' + '착용 모델 사이즈 : ${productItem.modelSize}' + 'n' + '착용 사이즈 : ${productItem.size}' + 'n' + '디테일 핏 : 루즈', style: theme.textTheme.body2, ), ... Text( productItem.description, style: theme.textTheme.body2, ) ... RaisedButton( onPressed: () {}, child: Text( 'BUY', style: theme.accentTextTheme.button ) ),
  • 24. home.dart Text( productItem.title.replaceAll(' ', 'n'), textAlign: textAlign, style: theme.primaryTextTheme.display2 ), ... child: RaisedButton( onPressed: () { Navigator.push( context, MaterialPageRoute( builder: (context) => DetailPage( productItem: productItem ), ), ); }, child: Text( 'BUY', style: theme.accentTextTheme.button ), ), ...
  • 26. themes.dart ThemeData buildAppTheme() { final ThemeData base = ThemeData.light(); return base.copyWith( ... buttonColor: themeSecondary, ... primaryIconTheme: _buildIconTheme(base.iconTheme, themeSecondary), buttonTheme: _buildButtonTheme(base.buttonTheme, 48.0), ); } ... IconThemeData _buildIconTheme(IconThemeData base, Color color) { return base.copyWith(color: color, opacity: 0.5); } ButtonThemeData _buildButtonTheme(ButtonThemeData base, double height) { return base.copyWith(height: height); }
  • 28. themes.dart ShapeBorder buildButtonShapeBorder() { return BeveledRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(7.0)) ); } login.dart RaisedButton( onPressed: () { Navigator.pop(context); }, shape: buildButtonShapeBorder(), child: Text( 'Login', style: theme.accentTextTheme.button ) ), home.dart child: RaisedButton( ... color: themeSecondary_50, shape: buildButtonShapeBorder(), child: Text( 'BUY', style: theme.accentTextTheme.button ), ),
  • 29. backdrop.dart @override Widget build(BuildContext context) { return Material( elevation: 8.0, shape: BeveledRectangleBorder( borderRadius: BorderRadius.only(topLeft: Radius.circular(24.0)) ), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: <Widget>[ Expanded( child: child, ), ], ), ); }
  • 31. Color Theme & Shape 컬러 / 모양
  • 32. colors.dart const themePrimary = const Color(0xFFd1c4e9); const themePrimaryDark = const Color(0xFF9078c8); const themePrimaryLight = const Color(0xFFece8f5); const themeSecondary = const Color(0xFFf8bbd0); const themeSecondaryDark = const Color(0xFFe06b92); const themeSecondaryLight = const Color(0xFFf8e5ec); const themeSurface = const Color(0xFFffffff); const themeSurfaceDark = const Color(0xFFf6f6f6); const themeSurfaceLight = const Color(0xFFffffff); const themePrimaryText = const Color(0xFF040404); const themeSecondaryText = const Color(0xFF040404); const themeSurfaceText = const Color(0xFF040404); const themeSecondary_50 = const Color(0x50f8bbd0); themes.dart ThemeData buildAppTheme() { final ThemeData base = ThemeData.light(); return base.copyWith( ... primaryIconTheme: _buildIconTheme(base.iconTheme, Colors.black54), accentIconTheme: _buildIconTheme(base.iconTheme, Colors.black), ... ); } ShapeBorder buildButtonShapeBorder() { return RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(18.0)) ); }
  • 33. backdrop.dart @override Widget build(BuildContext context) { return Material( elevation: 8.0, shape: RoundedRectangleBorder( borderRadius: BorderRadius.only( topLeft: Radius.circular(24.0), topRight: Radius.circular(24.0) ) ), child: Column( crossAxisAlignment: CrossAxisAlignment.stretch, children: <Widget>[ Expanded( child: child, ), ], ), ); }
  • 36. Color & Typography Theme 컬러 / 타이포그래피 Headline 3 / Nanum ExtraBold Headline 4 / Nanum ExtraBold Headline 5 / Nanum ExtraBold Headline 6 / Nanum ExtraBold Body 1 / Nanum Light Body 2 / Nanum Light Subtitle 1 / Nanum ExtraBold BUTTON / Nanum ExtraBold
  • 37. pubspec.yaml fonts: - family: Nanum fonts: - asset: fonts/NanumSquareRoundEB.ttf - asset: fonts/NanumSquareRoundL.ttf
  • 38. colors.dart const themePrimary = const Color(0xFF003a71); const themePrimaryDark = const Color(0xFF072151); const themePrimaryLight = const Color(0xFF244a80); const themeSecondary = const Color(0xFFcc60fd); const themeSecondaryDark = const Color(0xFFa02be9); const themeSecondaryLight = const Color(0xFFe3c1fa); const themeSurface = const Color(0xFF0d1a2a); const themeSurfaceDark = const Color(0xFF000000); const themeSurfaceLight = const Color(0xFF303e53); const themePrimaryText = const Color(0xFFffffff); const themeSecondaryText = const Color(0xFFffffff); const themeSurfaceText = const Color(0xFFffffff); const themeSecondary_50 = const Color(0x50cc60fd); themes.dart ThemeData buildAppTheme() { final ThemeData base = ThemeData.dark(); return base.copyWith( ... scaffoldBackgroundColor: themeSurface, ... primaryIconTheme: _buildIconTheme(base.iconTheme, Colors.white70), accentIconTheme: _buildIconTheme(base.iconTheme, Colors.white), ... ); }
  • 39. themes.dart TextTheme _buildTextTheme(TextTheme base, Color themeTextColor) { return base.copyWith( display2: base.display2.copyWith( fontSize: 48.0, fontWeight: FontWeight.bold ), display1: base.display1.copyWith( fontSize: 40.0, fontWeight: FontWeight.bold ), headline: base.headline.copyWith( fontSize: 24.0, fontWeight: FontWeight.bold ), title: base.title.copyWith( fontSize: 20.0, fontWeight: FontWeight.bold ), subhead: base.subhead.copyWith( fontSize: 16.0, fontWeight: FontWeight.bold ), body2: base.body2.copyWith( fontSize: 16.0 ), body1: base.body1.copyWith( fontSize: 14.0 ), button: base.button.copyWith( fontSize: 20.0, fontWeight: FontWeight.bold ), ).apply( fontFamily: 'Nanum', displayColor: themeTextColor, bodyColor: themeTextColor ); }
  • 41. 이 발표를 통해 디자이너 님들 메인 디자인 컬러와 타이포그래피를 정하고, 파생시킨 공통적인 테마 요소를 개발자에게 공유해주세요.
  • 42. 이 발표를 통해 개발자 님들 더이상 각 화면마다 컬러나 폰트를 지정하지 마세요. 공통적인 테마를 정의하고 컴포넌트들에 스타일을 적용하여 1분 만에 디자인을 변경하고 퇴근하세요.
  • 43. 추가로 포인트 디자인 디자이너 님들 욕심 내세요. 개발자 님들 개발 해주세요.
  • 44. 추가로 협업 사전적 의미 많은 사람이 일정한 계획 아래 노동을 분담하여 협동적, 조직적으로 일하는 것 나의 의미 서로가 어떤 것을 필요로 하는지 궁금해하고 알아가는 과정으로 좋은 결과물이 탄생되는 것
  • 47. 이미지 참조 https://material.io/tools/, Google https://www.sketchapp.com, Sketch https://www.emanprague.com/en/blog/lets-develop-a-mobile-app-in-flutter-13/, Filip Šmíd https://ko.wikipedia.org/wiki/안드로이드_스튜디오, Wikipedia https://unsplash.com/@hustwilson, Hust Wilson