SlideShare a Scribd company logo
Getting Started with 
Material Design 
David Montiel Yasin Yıldırım 
eBay Kleinanzeigen
Who Are We? 
David Montiel 
● 3+ Years on Android Development 
● >1 Year @eBay Kleinanzeigen 
● Before worked at Google, LinkedIn, Xing. 
● Enjoy staying up to date with current Android design patterns.
Who Are We? 
Yasin Yıldırım 
● 4+ years on Android Development 
● 1,5 Year @eBay Kleinanzeigen 
● Before worked at couple of software agencies in Turkey 
● Passionate about Android
Android App 
● German Classifieds platform 
● >6 Mio downloads 
● 4,4 / 5 stars rating (68K ratings) 
● Got featured on Play Store
This presentation is a very general 
overview
In-App Navigation 
● Inside the app, Up button usually means back. (But not always!)
Where Up doesn’t mean Back?
Navigation Drawer 
● The common pattern for navigating between main parts of your app
Swipe Between Views 
● Provide easiest possible navigation between Views for the user
Pure Android 
● Do not mimic UI elements from other 
platforms 
● Do not carry over platform 
specific icons
Pure Android 
● No bottom tabs ● No labels on back 
buttons 
● No right-pointing 
carets on line items
Some Material Taste?
First thing to assume... 
● You will be spending much more time 
programming animations… 
● Most of the “new” animations are 
provided by android, but many others 
continue depending on AnimationUtils, 
TranslateAnimation, etc..
Material design focuses on... 
● Animations 
● Layers 
● Minimalism
Basic Items: List and Cards 
● Android provides 
new widgets for 
displaying cards 
and lists with 
material design 
styles and 
animations.
Basic Items: Animations! 
● There are a lot of new recommended animations
Floating Elements: The Z axis 
● Some items in material design elevate in a Z axis, occupying a 
space “closer” to the user. Use the shadow!
Floating Button: The basic example
Let’s get technical!
dependencies { 
compile fileTree(dir: 'libs', include: ['*.jar']) 
compile 'com.android.support:appcompat-v7:+' 
compile 'com.android.support:cardview-v7:+' 
compile 'com.android.support:recyclerview-v7:+' 
compile 'com.android.support:palette-v7:+' 
} 
Add support libraries for backwards compatibility 
● AppCompat: Backport for ActionBar & Material Design UI implementations 
● RecyclerView: Includes RecyclerView, RecyclerView.Adapter & LayoutManagers 
● CardView: Contains CardView widget to have cards layout easily 
● Palette: Extracts prominent colors from an image
values/styles.xml 
<!-- Base application theme. --> 
<style name="AppTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar"> 
<!-- Customize your theme here. → 
<!-- your app branding color for the app bar --> 
<item name="colorPrimary">@color/primary</item> 
<!-- darker variant for the status bar and contextual app bars --> 
<item name="colorPrimaryDark">@color/primary_dark</item> 
<!-- theme UI controls like checkboxes and text fields --> 
<item name="colorAccent">@color/accent</item> 
</style> 
Style your app
Cool new DrawerToggle 
Update your imports to get the latest version 
import android.support.v4.app.ActionBarDrawerToggle 
import android.support.v7.app.ActionBarDrawerToggle 
ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle( 
this, /* host Activity */ 
drawerLayout, /* DrawerLayout object */ 
R.string.drawer_open, /* "open drawer" description */ 
R.string.drawer_close /* "close drawer" description */ 
)
Cool new DrawerToggle - Getting the animation 
drawerToggle = new ActionBarDrawerToggle (this, drawerLayout, R.string .drawer_open, R.string .drawer_close) { 
@Override 
protected void onPostCreate(Bundle savedInstanceState) { 
super.onPostCreate(savedInstanceState); 
// Synchronize the indicator with the state of the linked DrawerLayout 
drawerToggle.syncState(); 
} 
@Override 
public void onDrawerOpened (View drawerView) { 
super .onDrawerOpened(drawerView); 
getSupportActionBar() .setTitle(getString( R.string .app_name)); 
} 
@Override 
public void onDrawerClosed (View drawerView) { 
super .onDrawerClosed(drawerView); 
getSupportActionBar() .setTitle(getString( R.string .activity_title)); 
} 
};
Cool new DrawerToggle - Style the hamburger 
<!-- Base application theme. --> 
<style name= "AppTheme.Base" parent= "Theme.AppCompat.Light.DarkActionBar" > 
<item name= "colorPrimary" >@color/primary</item> 
<item name= "colorPrimaryDark" >@color/primary_dark</item> 
<item name= "colorAccent" >@color/accent</item> 
<item name="drawerArrowStyle">@style/DrawerArrowStyle</item> 
</style> 
<style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> 
<!--The size of the bars when they are parallel to each other--> 
<item name="barSize">20dp</item> 
<!--The max gap between the bars when they are parallel to each other--> 
<item name="gapBetweenBars">4dp</item> 
<!--The size of the middle bar when top and bottom bars merge into middle bar to form an arrow--> 
<item name="middleBarArrowSize">20dp</item> 
<!--The size of the top and bottom bars when they merge to the middle bar to form an arrow--> 
<item name="topBottomBarArrowSize">15dp</item> 
<!--The thickness (stroke size) for the bar paint--> 
<item name="thickness">2dp</item> 
<!--Whether bars should rotate or not during transition--> 
<item name="spinBars">true</item> 
<!--The drawing color for the bars--> 
<item name="color">@android:color/white</item> 
</style>
Cool new SwipeRefreshLayout 
● Looks better 
● Doesn’t move the content down & up again 
● More options to customize 
● Single or multiple colors for progress 
swipeRefreshLayout.setProgressBackgroundColor(R.color.accent_light); 
swipeRefreshLayout.setSize(SwipeRefreshLayout.DEFAULT); 
OR 
swipeRefreshLayout.setSize(SwipeRefreshLayout.LARGE); 
swipeRefreshLayout.setColorSchemeResources(R.color.red,R.color.blue,R.color.yellow,R.color.green); 
OR 
swipeRefreshLayout.setColorSchemeResources(R.color.red,R.color.yellow); 
OR 
swipeRefreshLayout.setColorSchemeResources(R.color.red);
RecyclerView 
● Advanced & more flexible version of ListView 
● Recycling is more efficient 
● Layout managers for positioning items 
● Item animators for adding / removing items 
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); 
recyclerView.setLayoutManager(layoutManager); 
recyclerView.setAdapter(adapter);
RecyclerView.Adapter<VH extends RecyclerView.ViewHolder> 
private static class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> { 
@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
// create a new view 
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); 
// set the view's size, margins, paddings and layout parameters 
return new ViewHolder(v); 
} 
@Override 
public void onBindViewHolder(ViewHolder holder, int position) { 
holder.textView.setText(dataset.get(position)); 
} 
} 
● Using a ViewHolder is mandatory
RecyclerView.ViewHolder 
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
public final CardView wholeListItem; 
public final TextView textView; 
public ViewHolder (CardView v) { 
super(v); 
wholeListItem = (CardView ) v.findViewById( R.id.card_view); 
textView = (TextView ) v.findViewById( R.id.text_view); 
} 
@Override 
public void onClick (View v) { 
if (v.getId() == R.id.card_view) { 
// Clicked on list item at getPosition() 
} else if (v.getId() == R.id.text_view) { 
// Clicked on textView at getPosition() 
} 
} 
} 
} 
● There’s no OnItemClickListener for RecyclerView, ViewHolder takes care of all clicks
CardView 
<android.support.v7.widget.CardView 
xmlns:app="http://schemas.android.com/apk/res-auto" 
android:id="@+id/card_view" 
android:layout_width="match_parent" 
android:layout_height="100dp" 
android:foreground="?android:attr/selectableItemBackground" 
app:cardCornerRadius="2dip" 
app:cardElevation="1sp" 
app:cardUseCompatPadding="true" 
app:cardBackgroundColor="#fcfcfc"> 
</android.support.v7.widget.CardView>
Shared Elements & Activity Transitions 
● Only works with Lollipop (API Level 21) 
● Activity starting is made with ActivityCompat 
values-v21/styles.xml: 
<style name= "AppTheme" parent= "AppTheme.Base" > 
<item name="android:windowContentTransitions">true</item> 
<item name="android:windowAllowEnterTransitionOverlap">true</item> 
<item name="android:windowAllowReturnTransitionOverlap">true</item> 
<item name="android:windowSharedElementEnterTransition">@android:transition/move</item> 
<item name="android:windowSharedElementExitTransition">@android:transition/move</item> 
</style>
Shared Elements & Activity Transitions 
First Activity: 
// Define transition options 
ActivityOptionsCompat options = ActivityOptionsCompat .makeSceneTransitionAnimation(this, 
Second Activity: 
@Override 
protected void onCreate( Bundle savedInstanceState) { 
super .onCreate(savedInstanceState); 
setContentView( R.layout .activity_planet_detail); 
image = (ImageView ) findViewById( R.id.planet_image); 
// Animate the shared element 
ViewCompat .setTransitionName(image, "SHARED_IMAGE" ); 
} 
new Pair<View, String> (view.findViewById( R.id.grid_item_planet_image), "SHARED_IMAGE" )); 
// Create intent 
Intent intent = new Intent (this, PlanetDetailActivity .class); 
// Start activity with defined options 
ActivityCompat .startActivity(this, intent, options .toBundle());
ToolBar as ActionBar 
In the activity.xml: 
<android.support.v7.widget.Toolbar 
android:id="@+id/toolbar" 
android:layout_width="match_parent" 
android:layout_height="wrap_content" 
android:minHeight="?attr/actionBarSize" 
android:background="@android:color/transparent" 
app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" 
app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 
In the activity use a theme with no action bar: 
<!-- Base application theme with no actionbar. --> 
<style name="AppTheme.Base.NoActionBar" parent=" 
AppTheme.Base"> 
<item name="android:windowNoTitle">true</item> 
<item name="windowActionBar">false</item> 
</style> 
private void setupToolBar() { 
toolbar = (Toolbar) findViewById(R.id.toolbar); 
setSupportActionBar(toolbar); 
getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
}
Tangible Surfaces 
public void onScrollChanged(int deltaX, int deltaY) { 
int scrollY = scrollView.getScrollY(); 
// Move background photo (with parallax effect) 
imageContainer.setTranslationY(scrollY * 0.5f); 
float newTop = Math.max(imageHeightPixels, scrollY); 
if (imageHeightPixels - scrollY <= toolBarHeightPixels) { // We reached the ToolBar 
newTop = scrollY + toolBarHeightPixels; 
} 
// Reposition the name bar -- it's normally anchored to the top of the detail part, 
// but locks to the bottom of the ToolBar on scroll 
nameContainer.setTranslationY(newTop); 
float gapFillProgress = 1; 
if (imageHeightPixels != 0) { 
gapFillProgress = Math.min(Math.max(getProgress(scrollY, 0, imageHeightPixels), 0), 1); 
} 
ViewCompat.setElevation(nameContainer, gapFillProgress* mMaxHeaderElevation); 
toolbar.getBackground().setAlpha((int) (gapFillProgress * 255)); 
}
Color Palette 
// Get palette from an image 
Palette.generateAsync(bitmap, new PaletteListener()); 
private class PaletteListener implements Palette.PaletteAsyncListener { 
@Override 
public void onGenerated(Palette palette) { 
lightVibrantColorFromImage = 
palette.getLightVibrantColor(R.color.light_blue); 
textViewPlanetName.setBackgroundColor(lightVibrantColorFromImage); 
} 
}
Overlapping Motion 
private void expandAnimation(int position, View convertView) 
{ 
final View finalConvertView = convertView; 
convertView.postDelayed(new Runnable() { 
@Override 
public void run() { 
Animation a = AnimationUtils.loadAnimation 
(context, R.anim.scale_up_from_center); 
finalConvertView.setAnimation(a); 
finalConvertView.setVisibility(View.VISIBLE); 
} 
}, position * 30); 
} 
<scale android:interpolator="@android: 
anim/accelerate_decelerate_interpolator" 
android:duration="150" 
android:fillAfter="true" 
android:fromXScale="0.0" 
android:fromYScale="0.0" 
android:toXScale="1.0" 
android:toYScale="1.0" 
android:pivotX="50%" 
android:pivotY="50%" />
view.animate().translationZ(20f).setDuration(500).setListener(new Animator.AnimatorListener() { 
// ..... other overriden methods 
@Override 
public void onAnimationEnd(Animator animation) { 
view.animate().translationZ(1f).setDuration(500).start(); 
} 
}).start(); 
translationZ Animation
State List Animator 
<ImageButton android :layout_width ="@dimen/floating_button_height" 
android :layout_height ="@dimen/floating_button_height" 
android :layout_gravity ="bottom|end" 
android :elevation ="5sp" 
android :layout_margin ="25dip" 
android :background ="@drawable/floating_button_bg" 
android :src="@drawable/ic_plus" 
android :stateListAnimator ="@anim/floating_button_state_list_anim" 
android :contentDescription ="@string/floating_button" /> 
floating_button_state_list_anim: 
<selector xmlns :android ="http://schemas.android.com/apk/res/android" > 
<item 
android :state_enabled ="true" 
android :state_pressed ="true" > 
<set> 
<objectAnimator 
android :duration ="@android:integer/config_shortAnimTime" 
android :propertyName ="translationZ" 
android :valueTo ="15dp" 
android :valueType ="floatType" /> 
</set> 
</item> 
<item> 
<set> 
<objectAnimator 
android :duration ="@android:integer/config_shortAnimTime" 
android :propertyName ="translationZ" 
android :valueTo ="0dp" 
android :valueType ="floatType" /> 
</set> 
</item> 
</selector >
Last thought.. 
Developers can make it happen but… we still 
need a designer...
Code & Slides 
https://github.com/vudin/MaterialDesignDemo 
http://goo.gl/xKJRdu
Questions? 
+DavidMontiel +YasinYildirimm 
@davidmonti @vudin
Ad

Recommended

Android app material design from dev's perspective
Android app material design from dev's perspective
DeSmart Agile Software House
 
Android Material Design APIs/Tips
Android Material Design APIs/Tips
Ken Yee
 
Design Patterns for Tablets and Smartphones
Design Patterns for Tablets and Smartphones
Michael Galpin
 
Android Lollipop and Material Design
Android Lollipop and Material Design
James Montemagno
 
What's New in Android
What's New in Android
Robert Cooper
 
Android Lollipop - Webinar vom 11.12.2014
Android Lollipop - Webinar vom 11.12.2014
inovex GmbH
 
Model View Intent on Android
Model View Intent on Android
Cody Engel
 
Advanced Android gReporter
Advanced Android gReporter
natdefreitas
 
Inside Flutter: Widgets, Elements, and RenderObjects
Inside Flutter: Widgets, Elements, and RenderObjects
Hansol Lee
 
jQuery for Sharepoint Dev
jQuery for Sharepoint Dev
Zeddy Iskandar
 
EIA 2015 Creating Apps with Android Material Design
EIA 2015 Creating Apps with Android Material Design
European Innovation Academy
 
Advance Android Layout Walkthrough
Advance Android Layout Walkthrough
Somkiat Khitwongwattana
 
Tips & Tricks to spice up your Android app
Tips & Tricks to spice up your Android app
Jérémie Laval
 
Introduction to Android Wear
Introduction to Android Wear
Peter Friese
 
4 coding101 fewd_lesson4_j_query_and_buttons 20210105
4 coding101 fewd_lesson4_j_query_and_buttons 20210105
John Picasso
 
Flutter beyond Hello world talk
Flutter beyond Hello world talk
Ahmed Abu Eldahab
 
Android Accessibility
Android Accessibility
Ascii Huang
 
A comprehensive guide on developing responsive and common react filter component
A comprehensive guide on developing responsive and common react filter component
Katy Slemon
 
Continuous Quality
Continuous Quality
Stefano Galati
 
Android
Android
San Bunna
 
Jquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript Basics
EPAM Systems
 
Getting Ready For Android Wear
Getting Ready For Android Wear
Raveesh Bhalla
 
Google Play Services Rock
Google Play Services Rock
Peter Friese
 
Google Fit, Android Wear & Xamarin
Google Fit, Android Wear & Xamarin
Peter Friese
 
Violet Peña - Storybook: A React Tool For Your Whole Team
Violet Peña - Storybook: A React Tool For Your Whole Team
Anton Caceres
 
Android 2
Android 2
San Bunna
 
Design for succcess with react and storybook.js
Design for succcess with react and storybook.js
Chris Saylor
 
Modular and Event-Driven JavaScript
Modular and Event-Driven JavaScript
Eduardo Shiota Yasuda
 
Android Lollipop - Webinar am 11.12.2014
Android Lollipop - Webinar am 11.12.2014
inovex GmbH
 
Infinum android talks_10_implementing material design
Infinum android talks_10_implementing material design
Infinum
 

More Related Content

What's hot (20)

Inside Flutter: Widgets, Elements, and RenderObjects
Inside Flutter: Widgets, Elements, and RenderObjects
Hansol Lee
 
jQuery for Sharepoint Dev
jQuery for Sharepoint Dev
Zeddy Iskandar
 
EIA 2015 Creating Apps with Android Material Design
EIA 2015 Creating Apps with Android Material Design
European Innovation Academy
 
Advance Android Layout Walkthrough
Advance Android Layout Walkthrough
Somkiat Khitwongwattana
 
Tips & Tricks to spice up your Android app
Tips & Tricks to spice up your Android app
Jérémie Laval
 
Introduction to Android Wear
Introduction to Android Wear
Peter Friese
 
4 coding101 fewd_lesson4_j_query_and_buttons 20210105
4 coding101 fewd_lesson4_j_query_and_buttons 20210105
John Picasso
 
Flutter beyond Hello world talk
Flutter beyond Hello world talk
Ahmed Abu Eldahab
 
Android Accessibility
Android Accessibility
Ascii Huang
 
A comprehensive guide on developing responsive and common react filter component
A comprehensive guide on developing responsive and common react filter component
Katy Slemon
 
Continuous Quality
Continuous Quality
Stefano Galati
 
Android
Android
San Bunna
 
Jquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript Basics
EPAM Systems
 
Getting Ready For Android Wear
Getting Ready For Android Wear
Raveesh Bhalla
 
Google Play Services Rock
Google Play Services Rock
Peter Friese
 
Google Fit, Android Wear & Xamarin
Google Fit, Android Wear & Xamarin
Peter Friese
 
Violet Peña - Storybook: A React Tool For Your Whole Team
Violet Peña - Storybook: A React Tool For Your Whole Team
Anton Caceres
 
Android 2
Android 2
San Bunna
 
Design for succcess with react and storybook.js
Design for succcess with react and storybook.js
Chris Saylor
 
Modular and Event-Driven JavaScript
Modular and Event-Driven JavaScript
Eduardo Shiota Yasuda
 
Inside Flutter: Widgets, Elements, and RenderObjects
Inside Flutter: Widgets, Elements, and RenderObjects
Hansol Lee
 
jQuery for Sharepoint Dev
jQuery for Sharepoint Dev
Zeddy Iskandar
 
EIA 2015 Creating Apps with Android Material Design
EIA 2015 Creating Apps with Android Material Design
European Innovation Academy
 
Tips & Tricks to spice up your Android app
Tips & Tricks to spice up your Android app
Jérémie Laval
 
Introduction to Android Wear
Introduction to Android Wear
Peter Friese
 
4 coding101 fewd_lesson4_j_query_and_buttons 20210105
4 coding101 fewd_lesson4_j_query_and_buttons 20210105
John Picasso
 
Flutter beyond Hello world talk
Flutter beyond Hello world talk
Ahmed Abu Eldahab
 
Android Accessibility
Android Accessibility
Ascii Huang
 
A comprehensive guide on developing responsive and common react filter component
A comprehensive guide on developing responsive and common react filter component
Katy Slemon
 
Jquery Complete Presentation along with Javascript Basics
Jquery Complete Presentation along with Javascript Basics
EPAM Systems
 
Getting Ready For Android Wear
Getting Ready For Android Wear
Raveesh Bhalla
 
Google Play Services Rock
Google Play Services Rock
Peter Friese
 
Google Fit, Android Wear & Xamarin
Google Fit, Android Wear & Xamarin
Peter Friese
 
Violet Peña - Storybook: A React Tool For Your Whole Team
Violet Peña - Storybook: A React Tool For Your Whole Team
Anton Caceres
 
Design for succcess with react and storybook.js
Design for succcess with react and storybook.js
Chris Saylor
 

Viewers also liked (6)

Android Lollipop - Webinar am 11.12.2014
Android Lollipop - Webinar am 11.12.2014
inovex GmbH
 
Infinum android talks_10_implementing material design
Infinum android talks_10_implementing material design
Infinum
 
Android activities & views
Android activities & views
ma-polimi
 
Android development session 2 - intent and activity
Android development session 2 - intent and activity
Farabi Technology Middle East
 
Android activity lifecycle
Android activity lifecycle
Soham Patel
 
RSpec 2 Best practices
RSpec 2 Best practices
Andrea Reginato
 
Android Lollipop - Webinar am 11.12.2014
Android Lollipop - Webinar am 11.12.2014
inovex GmbH
 
Infinum android talks_10_implementing material design
Infinum android talks_10_implementing material design
Infinum
 
Android activities & views
Android activities & views
ma-polimi
 
Android activity lifecycle
Android activity lifecycle
Soham Patel
 
Ad

Similar to Getting Started With Material Design (20)

Material Design and Backwards Compatibility
Material Design and Backwards Compatibility
Angelo Rüggeberg
 
Material design
Material design
Sarnab Poddar
 
Material design
Material design
ahmed Shaker
 
Material Design Android
Material Design Android
Samiullah Farooqui
 
Material design basics
Material design basics
Jorge Barroso
 
Android 3
Android 3
Robert Cooper
 
Material design - AndroidosDay 2015
Material design - AndroidosDay 2015
rlecheta
 
What's new in android: jetpack compose 2024
What's new in android: jetpack compose 2024
Toru Wonyoung Choi
 
Android design patterns
Android design patterns
Platty Soft
 
Fernando F. Gallego - Efficient Android Resources 101
Fernando F. Gallego - Efficient Android Resources 101
Fernando Gallego
 
Infinum Android Talks #13 - Design Support Library by Ivan Markusi
Infinum Android Talks #13 - Design Support Library by Ivan Markusi
Infinum
 
Android Material Design
Android Material Design
Ankit Shandilya
 
[PBO] Pertemuan 12 - Pemrograman Android
[PBO] Pertemuan 12 - Pemrograman Android
rizki adam kurniawan
 
Material Design - Høgskolen Ringerike 2017
Material Design - Høgskolen Ringerike 2017
Konstantin Loginov
 
STYLISH FLOOR
STYLISH FLOOR
ABU HASAN
 
Embracing the Lollipop
Embracing the Lollipop
Sonja Kesic
 
Chapt 04 user interaction
Chapt 04 user interaction
Edi Faizal
 
Getting the Magic on Android Tablets
Getting the Magic on Android Tablets
Motorola Mobility - MOTODEV
 
Android Materials Design
Android Materials Design
Mohammad Aljobairi
 
Material Design (The Technical Essentials) by Mohammad Aljobairi @AMMxDROID
Material Design (The Technical Essentials) by Mohammad Aljobairi @AMMxDROID
Jordan Open Source Association
 
Material Design and Backwards Compatibility
Material Design and Backwards Compatibility
Angelo Rüggeberg
 
Material design basics
Material design basics
Jorge Barroso
 
Material design - AndroidosDay 2015
Material design - AndroidosDay 2015
rlecheta
 
What's new in android: jetpack compose 2024
What's new in android: jetpack compose 2024
Toru Wonyoung Choi
 
Android design patterns
Android design patterns
Platty Soft
 
Fernando F. Gallego - Efficient Android Resources 101
Fernando F. Gallego - Efficient Android Resources 101
Fernando Gallego
 
Infinum Android Talks #13 - Design Support Library by Ivan Markusi
Infinum Android Talks #13 - Design Support Library by Ivan Markusi
Infinum
 
[PBO] Pertemuan 12 - Pemrograman Android
[PBO] Pertemuan 12 - Pemrograman Android
rizki adam kurniawan
 
Material Design - Høgskolen Ringerike 2017
Material Design - Høgskolen Ringerike 2017
Konstantin Loginov
 
STYLISH FLOOR
STYLISH FLOOR
ABU HASAN
 
Embracing the Lollipop
Embracing the Lollipop
Sonja Kesic
 
Chapt 04 user interaction
Chapt 04 user interaction
Edi Faizal
 
Material Design (The Technical Essentials) by Mohammad Aljobairi @AMMxDROID
Material Design (The Technical Essentials) by Mohammad Aljobairi @AMMxDROID
Jordan Open Source Association
 
Ad

Recently uploaded (20)

"Scaling in space and time with Temporal", Andriy Lupa.pdf
"Scaling in space and time with Temporal", Andriy Lupa.pdf
Fwdays
 
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
revolcs10
 
" How to survive with 1 billion vectors and not sell a kidney: our low-cost c...
" How to survive with 1 billion vectors and not sell a kidney: our low-cost c...
Fwdays
 
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
Earley Information Science
 
OpenPOWER Foundation & Open-Source Core Innovations
OpenPOWER Foundation & Open-Source Core Innovations
IBM
 
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Safe Software
 
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
 
Cyber Defense Matrix Workshop - RSA Conference
Cyber Defense Matrix Workshop - RSA Conference
Priyanka Aash
 
UserCon Belgium: Honey, VMware increased my bill
UserCon Belgium: Honey, VMware increased my bill
stijn40
 
9-1-1 Addressing: End-to-End Automation Using FME
9-1-1 Addressing: End-to-End Automation Using FME
Safe Software
 
GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
Priyanka Aash
 
PyCon SG 25 - Firecracker Made Easy with Python.pdf
PyCon SG 25 - Firecracker Made Easy with Python.pdf
Muhammad Yuga Nugraha
 
Lessons Learned from Developing Secure AI Workflows.pdf
Lessons Learned from Developing Secure AI Workflows.pdf
Priyanka Aash
 
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
pcprocore
 
10 Key Challenges for AI within the EU Data Protection Framework.pdf
10 Key Challenges for AI within the EU Data Protection Framework.pdf
Priyanka Aash
 
Securing AI - There Is No Try, Only Do!.pdf
Securing AI - There Is No Try, Only Do!.pdf
Priyanka Aash
 
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
 
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Safe Software
 
Quantum AI: Where Impossible Becomes Probable
Quantum AI: Where Impossible Becomes Probable
Saikat Basu
 
Curietech AI in action - Accelerate MuleSoft development
Curietech AI in action - Accelerate MuleSoft development
shyamraj55
 
"Scaling in space and time with Temporal", Andriy Lupa.pdf
"Scaling in space and time with Temporal", Andriy Lupa.pdf
Fwdays
 
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
ReSTIR [DI]: Spatiotemporal reservoir resampling for real-time ray tracing ...
revolcs10
 
" How to survive with 1 billion vectors and not sell a kidney: our low-cost c...
" How to survive with 1 billion vectors and not sell a kidney: our low-cost c...
Fwdays
 
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
EIS-Webinar-Engineering-Retail-Infrastructure-06-16-2025.pdf
Earley Information Science
 
OpenPOWER Foundation & Open-Source Core Innovations
OpenPOWER Foundation & Open-Source Core Innovations
IBM
 
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Using the SQLExecutor for Data Quality Management: aka One man's love for the...
Safe Software
 
MuleSoft for AgentForce : Topic Center and API Catalog
MuleSoft for AgentForce : Topic Center and API Catalog
shyamraj55
 
Cyber Defense Matrix Workshop - RSA Conference
Cyber Defense Matrix Workshop - RSA Conference
Priyanka Aash
 
UserCon Belgium: Honey, VMware increased my bill
UserCon Belgium: Honey, VMware increased my bill
stijn40
 
9-1-1 Addressing: End-to-End Automation Using FME
9-1-1 Addressing: End-to-End Automation Using FME
Safe Software
 
GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
GenAI Opportunities and Challenges - Where 370 Enterprises Are Focusing Now.pdf
Priyanka Aash
 
PyCon SG 25 - Firecracker Made Easy with Python.pdf
PyCon SG 25 - Firecracker Made Easy with Python.pdf
Muhammad Yuga Nugraha
 
Lessons Learned from Developing Secure AI Workflows.pdf
Lessons Learned from Developing Secure AI Workflows.pdf
Priyanka Aash
 
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
CapCut Pro Crack For PC Latest Version {Fully Unlocked} 2025
pcprocore
 
10 Key Challenges for AI within the EU Data Protection Framework.pdf
10 Key Challenges for AI within the EU Data Protection Framework.pdf
Priyanka Aash
 
Securing AI - There Is No Try, Only Do!.pdf
Securing AI - There Is No Try, Only Do!.pdf
Priyanka Aash
 
AI VIDEO MAGAZINE - June 2025 - r/aivideo
AI VIDEO MAGAZINE - June 2025 - r/aivideo
1pcity Studios, Inc
 
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Smarter Aviation Data Management: Lessons from Swedavia Airports and Sweco
Safe Software
 
Quantum AI: Where Impossible Becomes Probable
Quantum AI: Where Impossible Becomes Probable
Saikat Basu
 
Curietech AI in action - Accelerate MuleSoft development
Curietech AI in action - Accelerate MuleSoft development
shyamraj55
 

Getting Started With Material Design

  • 1. Getting Started with Material Design David Montiel Yasin Yıldırım eBay Kleinanzeigen
  • 2. Who Are We? David Montiel ● 3+ Years on Android Development ● >1 Year @eBay Kleinanzeigen ● Before worked at Google, LinkedIn, Xing. ● Enjoy staying up to date with current Android design patterns.
  • 3. Who Are We? Yasin Yıldırım ● 4+ years on Android Development ● 1,5 Year @eBay Kleinanzeigen ● Before worked at couple of software agencies in Turkey ● Passionate about Android
  • 4. Android App ● German Classifieds platform ● >6 Mio downloads ● 4,4 / 5 stars rating (68K ratings) ● Got featured on Play Store
  • 5. This presentation is a very general overview
  • 6. In-App Navigation ● Inside the app, Up button usually means back. (But not always!)
  • 7. Where Up doesn’t mean Back?
  • 8. Navigation Drawer ● The common pattern for navigating between main parts of your app
  • 9. Swipe Between Views ● Provide easiest possible navigation between Views for the user
  • 10. Pure Android ● Do not mimic UI elements from other platforms ● Do not carry over platform specific icons
  • 11. Pure Android ● No bottom tabs ● No labels on back buttons ● No right-pointing carets on line items
  • 13. First thing to assume... ● You will be spending much more time programming animations… ● Most of the “new” animations are provided by android, but many others continue depending on AnimationUtils, TranslateAnimation, etc..
  • 14. Material design focuses on... ● Animations ● Layers ● Minimalism
  • 15. Basic Items: List and Cards ● Android provides new widgets for displaying cards and lists with material design styles and animations.
  • 16. Basic Items: Animations! ● There are a lot of new recommended animations
  • 17. Floating Elements: The Z axis ● Some items in material design elevate in a Z axis, occupying a space “closer” to the user. Use the shadow!
  • 18. Floating Button: The basic example
  • 20. dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile 'com.android.support:appcompat-v7:+' compile 'com.android.support:cardview-v7:+' compile 'com.android.support:recyclerview-v7:+' compile 'com.android.support:palette-v7:+' } Add support libraries for backwards compatibility ● AppCompat: Backport for ActionBar & Material Design UI implementations ● RecyclerView: Includes RecyclerView, RecyclerView.Adapter & LayoutManagers ● CardView: Contains CardView widget to have cards layout easily ● Palette: Extracts prominent colors from an image
  • 21. values/styles.xml <!-- Base application theme. --> <style name="AppTheme.Base" parent="Theme.AppCompat.Light.DarkActionBar"> <!-- Customize your theme here. → <!-- your app branding color for the app bar --> <item name="colorPrimary">@color/primary</item> <!-- darker variant for the status bar and contextual app bars --> <item name="colorPrimaryDark">@color/primary_dark</item> <!-- theme UI controls like checkboxes and text fields --> <item name="colorAccent">@color/accent</item> </style> Style your app
  • 22. Cool new DrawerToggle Update your imports to get the latest version import android.support.v4.app.ActionBarDrawerToggle import android.support.v7.app.ActionBarDrawerToggle ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle( this, /* host Activity */ drawerLayout, /* DrawerLayout object */ R.string.drawer_open, /* "open drawer" description */ R.string.drawer_close /* "close drawer" description */ )
  • 23. Cool new DrawerToggle - Getting the animation drawerToggle = new ActionBarDrawerToggle (this, drawerLayout, R.string .drawer_open, R.string .drawer_close) { @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Synchronize the indicator with the state of the linked DrawerLayout drawerToggle.syncState(); } @Override public void onDrawerOpened (View drawerView) { super .onDrawerOpened(drawerView); getSupportActionBar() .setTitle(getString( R.string .app_name)); } @Override public void onDrawerClosed (View drawerView) { super .onDrawerClosed(drawerView); getSupportActionBar() .setTitle(getString( R.string .activity_title)); } };
  • 24. Cool new DrawerToggle - Style the hamburger <!-- Base application theme. --> <style name= "AppTheme.Base" parent= "Theme.AppCompat.Light.DarkActionBar" > <item name= "colorPrimary" >@color/primary</item> <item name= "colorPrimaryDark" >@color/primary_dark</item> <item name= "colorAccent" >@color/accent</item> <item name="drawerArrowStyle">@style/DrawerArrowStyle</item> </style> <style name="DrawerArrowStyle" parent="Widget.AppCompat.DrawerArrowToggle"> <!--The size of the bars when they are parallel to each other--> <item name="barSize">20dp</item> <!--The max gap between the bars when they are parallel to each other--> <item name="gapBetweenBars">4dp</item> <!--The size of the middle bar when top and bottom bars merge into middle bar to form an arrow--> <item name="middleBarArrowSize">20dp</item> <!--The size of the top and bottom bars when they merge to the middle bar to form an arrow--> <item name="topBottomBarArrowSize">15dp</item> <!--The thickness (stroke size) for the bar paint--> <item name="thickness">2dp</item> <!--Whether bars should rotate or not during transition--> <item name="spinBars">true</item> <!--The drawing color for the bars--> <item name="color">@android:color/white</item> </style>
  • 25. Cool new SwipeRefreshLayout ● Looks better ● Doesn’t move the content down & up again ● More options to customize ● Single or multiple colors for progress swipeRefreshLayout.setProgressBackgroundColor(R.color.accent_light); swipeRefreshLayout.setSize(SwipeRefreshLayout.DEFAULT); OR swipeRefreshLayout.setSize(SwipeRefreshLayout.LARGE); swipeRefreshLayout.setColorSchemeResources(R.color.red,R.color.blue,R.color.yellow,R.color.green); OR swipeRefreshLayout.setColorSchemeResources(R.color.red,R.color.yellow); OR swipeRefreshLayout.setColorSchemeResources(R.color.red);
  • 26. RecyclerView ● Advanced & more flexible version of ListView ● Recycling is more efficient ● Layout managers for positioning items ● Item animators for adding / removing items RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); recyclerView.setLayoutManager(layoutManager); recyclerView.setAdapter(adapter);
  • 27. RecyclerView.Adapter<VH extends RecyclerView.ViewHolder> private static class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> { @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { // create a new view View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item, parent, false); // set the view's size, margins, paddings and layout parameters return new ViewHolder(v); } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.textView.setText(dataset.get(position)); } } ● Using a ViewHolder is mandatory
  • 28. RecyclerView.ViewHolder public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { public final CardView wholeListItem; public final TextView textView; public ViewHolder (CardView v) { super(v); wholeListItem = (CardView ) v.findViewById( R.id.card_view); textView = (TextView ) v.findViewById( R.id.text_view); } @Override public void onClick (View v) { if (v.getId() == R.id.card_view) { // Clicked on list item at getPosition() } else if (v.getId() == R.id.text_view) { // Clicked on textView at getPosition() } } } } ● There’s no OnItemClickListener for RecyclerView, ViewHolder takes care of all clicks
  • 29. CardView <android.support.v7.widget.CardView xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="100dp" android:foreground="?android:attr/selectableItemBackground" app:cardCornerRadius="2dip" app:cardElevation="1sp" app:cardUseCompatPadding="true" app:cardBackgroundColor="#fcfcfc"> </android.support.v7.widget.CardView>
  • 30. Shared Elements & Activity Transitions ● Only works with Lollipop (API Level 21) ● Activity starting is made with ActivityCompat values-v21/styles.xml: <style name= "AppTheme" parent= "AppTheme.Base" > <item name="android:windowContentTransitions">true</item> <item name="android:windowAllowEnterTransitionOverlap">true</item> <item name="android:windowAllowReturnTransitionOverlap">true</item> <item name="android:windowSharedElementEnterTransition">@android:transition/move</item> <item name="android:windowSharedElementExitTransition">@android:transition/move</item> </style>
  • 31. Shared Elements & Activity Transitions First Activity: // Define transition options ActivityOptionsCompat options = ActivityOptionsCompat .makeSceneTransitionAnimation(this, Second Activity: @Override protected void onCreate( Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView( R.layout .activity_planet_detail); image = (ImageView ) findViewById( R.id.planet_image); // Animate the shared element ViewCompat .setTransitionName(image, "SHARED_IMAGE" ); } new Pair<View, String> (view.findViewById( R.id.grid_item_planet_image), "SHARED_IMAGE" )); // Create intent Intent intent = new Intent (this, PlanetDetailActivity .class); // Start activity with defined options ActivityCompat .startActivity(this, intent, options .toBundle());
  • 32. ToolBar as ActionBar In the activity.xml: <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="wrap_content" android:minHeight="?attr/actionBarSize" android:background="@android:color/transparent" app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> In the activity use a theme with no action bar: <!-- Base application theme with no actionbar. --> <style name="AppTheme.Base.NoActionBar" parent=" AppTheme.Base"> <item name="android:windowNoTitle">true</item> <item name="windowActionBar">false</item> </style> private void setupToolBar() { toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); getSupportActionBar().setDisplayHomeAsUpEnabled(true); }
  • 33. Tangible Surfaces public void onScrollChanged(int deltaX, int deltaY) { int scrollY = scrollView.getScrollY(); // Move background photo (with parallax effect) imageContainer.setTranslationY(scrollY * 0.5f); float newTop = Math.max(imageHeightPixels, scrollY); if (imageHeightPixels - scrollY <= toolBarHeightPixels) { // We reached the ToolBar newTop = scrollY + toolBarHeightPixels; } // Reposition the name bar -- it's normally anchored to the top of the detail part, // but locks to the bottom of the ToolBar on scroll nameContainer.setTranslationY(newTop); float gapFillProgress = 1; if (imageHeightPixels != 0) { gapFillProgress = Math.min(Math.max(getProgress(scrollY, 0, imageHeightPixels), 0), 1); } ViewCompat.setElevation(nameContainer, gapFillProgress* mMaxHeaderElevation); toolbar.getBackground().setAlpha((int) (gapFillProgress * 255)); }
  • 34. Color Palette // Get palette from an image Palette.generateAsync(bitmap, new PaletteListener()); private class PaletteListener implements Palette.PaletteAsyncListener { @Override public void onGenerated(Palette palette) { lightVibrantColorFromImage = palette.getLightVibrantColor(R.color.light_blue); textViewPlanetName.setBackgroundColor(lightVibrantColorFromImage); } }
  • 35. Overlapping Motion private void expandAnimation(int position, View convertView) { final View finalConvertView = convertView; convertView.postDelayed(new Runnable() { @Override public void run() { Animation a = AnimationUtils.loadAnimation (context, R.anim.scale_up_from_center); finalConvertView.setAnimation(a); finalConvertView.setVisibility(View.VISIBLE); } }, position * 30); } <scale android:interpolator="@android: anim/accelerate_decelerate_interpolator" android:duration="150" android:fillAfter="true" android:fromXScale="0.0" android:fromYScale="0.0" android:toXScale="1.0" android:toYScale="1.0" android:pivotX="50%" android:pivotY="50%" />
  • 36. view.animate().translationZ(20f).setDuration(500).setListener(new Animator.AnimatorListener() { // ..... other overriden methods @Override public void onAnimationEnd(Animator animation) { view.animate().translationZ(1f).setDuration(500).start(); } }).start(); translationZ Animation
  • 37. State List Animator <ImageButton android :layout_width ="@dimen/floating_button_height" android :layout_height ="@dimen/floating_button_height" android :layout_gravity ="bottom|end" android :elevation ="5sp" android :layout_margin ="25dip" android :background ="@drawable/floating_button_bg" android :src="@drawable/ic_plus" android :stateListAnimator ="@anim/floating_button_state_list_anim" android :contentDescription ="@string/floating_button" /> floating_button_state_list_anim: <selector xmlns :android ="http://schemas.android.com/apk/res/android" > <item android :state_enabled ="true" android :state_pressed ="true" > <set> <objectAnimator android :duration ="@android:integer/config_shortAnimTime" android :propertyName ="translationZ" android :valueTo ="15dp" android :valueType ="floatType" /> </set> </item> <item> <set> <objectAnimator android :duration ="@android:integer/config_shortAnimTime" android :propertyName ="translationZ" android :valueTo ="0dp" android :valueType ="floatType" /> </set> </item> </selector >
  • 38. Last thought.. Developers can make it happen but… we still need a designer...
  • 39. Code & Slides https://github.com/vudin/MaterialDesignDemo http://goo.gl/xKJRdu