SlideShare a Scribd company logo
Android UI-Design and
customer views
Lars Vogel
Eclipse IDE and
platform developer
Android and Eclipse
developer and trainer
Founder of vogella
GmbH
http://www.vogella.com
visited by > 50 000
developers every day
Selected
design
principles
How
to
implement
them
(with
focus
on
custom
views)
Android design homepage
Android design principles
Never lose my stuff
Decide for me but let me have the final say
Only show what I need when I need it
Delight me in surprising ways
Give me tricks that work everywhere
Lets implements that!
Design principles implemented
Never lose my stuff
Decide for me but let me have the final say
http://www.vogella.com/tutorials/AndroidListView/article.html#listview_undoaction
FrameLayout
Never loose my stuf
Only show what I need when I
need it
Design principles implemented
Only show what I need when I
need it
http://www.vogella.com/tutorials/AndroidActionBar/article.html
Example
Navigation
Home screen Six Pack
Fixed tabs
Spinner
The winner: Navigation Drawer
Implementation of Navigation drawer
Implementation
mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity
*/
mDrawerLayout, /* DrawerLayout object */
R.drawable.ic_drawer, /* nav drawer icon to replace 'Up' caret */
R.string.drawer_open, /* "open drawer" description */
R.string.drawer_close /* "close drawer" description */) {
/** Called when a drawer has settled in a completely closed state. */
public void onDrawerClosed(View view) {
getActionBar().setTitle(title);
}
/** Called when a drawer has settled in a completely open state. */
public void onDrawerOpened(View drawerView) {
getActionBar().setTitle("Open Drawer");
}
};
// Set the drawer toggle as the DrawerListener
mDrawerLayout.setDrawerListener(mDrawerToggle);
getActionBar().setDisplayHomeAsUpEnabled(true);
getActionBar().setHomeButtonEnabled(true);
Management
does
not allow
me to use the
support library
Navigation drawer
is old school
FrameLayout
Design principles implemented
Delight me in surprising
ways
Animations
http://www.vogella.com/tutorials/AndroidAnimations/article.html
Animation history
Properties API (3.0)
New simplified options for
Animations (4.1)
ActivityOptions for Activity
animations (4.1)
Scenes and transitions (4.4)
NineOldAndroids to support < 3.0
Android versions
aniView.animate().rotation(dest).setDuration(1000)
.scaleX(2)
.scaleY(2).withEndAction(new Runnable() {
@Override
public void run() {
//
aniView.animate().rotationXBy(100)
.rotation(
Math.abs(360 - aniView
.getRotation()))
.scaleX(0.4F).scaleY(0.4F)
.setDuration(1000);
}
});
Animations example
Scene animations with Android 4.4
mSceneRoot = (ViewGroup)
findViewById(R.id.sceneRoot);
TransitionInflater inflater =
TransitionInflater.from(this);
mScene1 =
Scene.getSceneForLayout(mSceneRoot,
R.layout.transition_scene1, this);
mTransitionManager.transitionTo(mScene1);
Animations
http://graphics-geek.blogspot.de/2013/06/devbytes-custom-activity-animations.html
Demo from Android developer team: com.vogella.android.animations.extended
Design principles implemented
Delight me in surprising ways
http://www.vogella.com/tutorials/AndroidCustomViews/article.html
Custom views
Custom views a can
be performance optimized,
simplify your developer life or
do something awesome
Why?
View drawing phases
Animate Measure Layout Draws
requestLayout() invalidate()animate()
View hierarchy
View
ImageView TextView ViewGroup
Button
LinearLayout FrameLayout ...
View class
It is the basic build block for UI
Rectangular area responsible for
drawing and event handling
Creating a custom view
Compound view
Extending an existing view
Custom view
Compound Views
Uses layout with existing views
Adds view interaction and API
Compound View - Layout
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android" >
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_centerVertical="true"
android:layout_marginLeft="16dp"
android:textSize="18sp"
/>
<View
android:layout_width="26dp"
android:layout_height="26dp"
android:layout_centerVertical="true"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
/>
</merge>
Custom attributes
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="ColorOptionsView">
<attr name="titleText" format="string"
localization="suggested" />
<attr name="valueColor" format="color" />
</declare-styleable>
</resources>
public class ColorOptionsView extends LinearLayout {
private View mValue;
private ImageView mImage;
public ColorOptionsView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.ColorOptionsView, 0, 0);
String titleText = a.getString(R.styleable.ColorOptionsView_titleText);
int valueColor = a.getColor(R.styleable.ColorOptionsView_valueColor,
android.R.color.holo_blue_light);
a.recycle();
setOrientation(LinearLayout.HORIZONTAL);
setGravity(Gravity.CENTER_VERTICAL);
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.view_color_options, this, true);
TextView title = (TextView) getChildAt(0);
title.setText(titleText);
mValue = getChildAt(1);
mValue.setBackgroundColor(valueColor);
}
public ColorOptionsView(Context context) {
this(context, null);
}
public void setValueColor(int color) {
mValue.setBackgroundColor(color);
}
public void setImageVisible(boolean visible) {
mImage.setVisibility(visible ? View.VISIBLE : View.GONE);
}
}
Get layout
parameters
Additional API
Inflate layout,
wire views
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:custom="http://schemas.android.com/apk/res/com.vogella.android.view.compoundview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:divider="?android:attr/listDivider"
android:orientation="vertical"
android:showDividers="middle"
tools:context=".MainActivity" >
<com.vogella.android.customview.compoundview.ColorOptionsView
android:id="@+id/view1"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:background="?android:selectableItemBackground"
android:onClick="onClicked"
custom:titleText="Background color"
custom:valueColor="@android:color/holo_green_light" />
<com.vogella.android.customview.compoundview.ColorOptionsView
android:id="@+id/view2"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:background="?android:selectableItemBackground"
android:onClick="onClicked"
custom:titleText="Foreground color"
custom:valueColor="@android:color/holo_orange_dark" />
</LinearLayout>
Performance optimization
Creating something
completely new
What can I NOT do with
compound views?
Performance
Flat Custom View
Custom View
Extend View class or its subclass
Override some methods
onDraw()
onTouchEvent()
…
Use new class in your layout
Canvas API
You draw on a surface creating a Bitmap
Canvas provides API to draw on the canvas
Note: As of Android 4.0, the runtime maps the Canvas API to
OpenGL calls
Paint
paint.setColor(Color.WHITE);
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(Paint.Join.ROUND);
paint.setStrokeWidth(10f);
paint.setAlpha(122);
Shader
Define content drawn be Paint
BitmapShader
LinearGradient
RadialGradient
SweepGradient
Extend an existing layout
MyShinyLinearLayout extends LinearLayout
Android design and Custom views
public MyShinyLinearLayout(Context context, AttributeSet
attrs) {
super(context, attrs);
setBackgroundResource(R.drawable.background);
}
private void createShineArea() {
int width = getWidth();
int height = (int) (0.9 * getHeight());
path = new Path();
path.moveTo(0, 0);
path.lineTo(width, 0);
path.lineTo(width, height);
path.close();
paint.setShader(new LinearGradient(0, 0, 0, height,
0x55ffffff,
0x10ffffff, Shader.TileMode.CLAMP));
}
@Override
protected void dispatchDraw(Canvas canvas) {
if (path == null) {
createShineArea();
}
// Draw the shine behind the children.
canvas.drawPath(path, paint);
// Draw the children
super.dispatchDraw(canvas);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
// Invalidate the path whenever the size changes.
path = null;
}
Alpha Compositioin
Matrix
@Override
protected void onDraw(Canvas canvas) {
Bitmap targetBitmap = BitmapFactory.decodeResource(getResources(),
R.drawable.ic_launcher);
Matrix matrix = new Matrix();
matrix.setRotate(50, targetBitmap.getWidth() / 2,
targetBitmap.getHeight() / 2);
matrix.setSkew(2, 2);
canvas.drawBitmap(targetBitmap, matrix, new Paint());
super.onDraw(canvas);
}
Demo:
Custom drawing & touch
View Persistence
View State
To save a view state, Activity calls
onSaveInstanceState() on every its child view which
has an android:id attribute.
To restore a view state, Activity calls
onRestoreInstanceState() on every its child view
which has an android:id attribute.
com.vogella.android.customview.persistence
Async custom view
See http://lucasr.org/2014/05/12/custom-layouts-on-android/
Thats about it, but real
implementations look
a bit more complex
Give me tricks
that work
everywhere
Design principle
Give me tricks that work everywhere
Implement Fling with Touch
Awesome code examples
SwipeToDismiss - https://github.com/romannurik/Android-
SwipeToDismiss
ListView3D - https://github.com/renard314/ListView3d
Rounded Corners with custom drawables -
http://www.curious-creature.org/2012/12/11/android-recipe-1-
image-with-rounded-corners/
Spotlight -
http://www.curious-creature.org/2012/12/13/android-recipe-2-
fun-with-shaders/
Path traces http://www.curious-
creature.org/2013/12/21/android-recipe-4-path-tracing/
Idea to develop an async custom
view
See http://lucasr.org/2014/05/12/custom-layouts-on-android/
Note: Learn about Drawables
http://www.vogella.com/tutorials/AndroidDrawables/article.html
Sometimes you don't need
custom views just a
combination of existing
Drawables
Thank you
For further questions:
lars.vogel@vogella.com
http://www.vogella.com

More Related Content

What's hot (9)

PDF
How to Extend Axure's Animation Capability
Svetlin Denkov
 
PDF
Intro to Axure 7 - User Vision Breakfast Briefing
Stephen Denning
 
PDF
UILayout plug-in for APEX
Tobias Arnhold
 
PPTX
Creative Coders March 2013 - Introducing Starling Framework
Huijie Wu
 
PPTX
IOS Storyboards
Muhammad Nabeel Arif
 
PDF
Leaving Interface Builder Behind
John Wilker
 
PDF
Andriod dev toolbox part 2
Shem Magnezi
 
PDF
Android UX-UI Design for fun and profit | Fernando Cejas | Tuenti
Smash Tech
 
PPTX
How to fake a database/backend in Axure... and more
Sandra González
 
How to Extend Axure's Animation Capability
Svetlin Denkov
 
Intro to Axure 7 - User Vision Breakfast Briefing
Stephen Denning
 
UILayout plug-in for APEX
Tobias Arnhold
 
Creative Coders March 2013 - Introducing Starling Framework
Huijie Wu
 
IOS Storyboards
Muhammad Nabeel Arif
 
Leaving Interface Builder Behind
John Wilker
 
Andriod dev toolbox part 2
Shem Magnezi
 
Android UX-UI Design for fun and profit | Fernando Cejas | Tuenti
Smash Tech
 
How to fake a database/backend in Axure... and more
Sandra González
 

Viewers also liked (20)

PPTX
Android Custom Views
Babar Sanah
 
PPTX
Android animation theory
Siva Ramakrishna kv
 
PPTX
Android Training (Animation)
Khaled Anaqwa
 
PDF
Android custom views
christoforosnalmpantis
 
PPT
Beyond Android Views - Window,Surface,Special Views,and More
rogeryi
 
PDF
Android Development - ConstraintLayout
Manuel Vicente Vivo
 
PPTX
Basic Android Animation
Shilu Shrestha
 
PDF
Android animation
Krazy Koder
 
PPTX
ppt based on android technology with great animations
Hriday Garg
 
PDF
Journey of an event, the android touch - Marco Cova, Facebook
DroidConTLV
 
PDF
Introduction to Android Window System
National Cheng Kung University
 
PPTX
Acrhitecture deisign pattern_MVC_MVP_MVVM
Dong-Ho Lee
 
PPTX
Android Animator
Charile Tsai
 
PDF
Introduction to Android Animations
Xamarin
 
PPT
Android UI Patterns
Peter Pascale
 
PDF
[Android] Widget Event Handling
Nikmesoft Ltd
 
PPTX
Android Transition
Charile Tsai
 
PPTX
Android share preferences
Ajay Panchal
 
PPTX
Android graphic system (SurfaceFlinger) : Design Pattern's perspective
Bin Chen
 
Android Custom Views
Babar Sanah
 
Android animation theory
Siva Ramakrishna kv
 
Android Training (Animation)
Khaled Anaqwa
 
Android custom views
christoforosnalmpantis
 
Beyond Android Views - Window,Surface,Special Views,and More
rogeryi
 
Android Development - ConstraintLayout
Manuel Vicente Vivo
 
Basic Android Animation
Shilu Shrestha
 
Android animation
Krazy Koder
 
ppt based on android technology with great animations
Hriday Garg
 
Journey of an event, the android touch - Marco Cova, Facebook
DroidConTLV
 
Introduction to Android Window System
National Cheng Kung University
 
Acrhitecture deisign pattern_MVC_MVP_MVVM
Dong-Ho Lee
 
Android Animator
Charile Tsai
 
Introduction to Android Animations
Xamarin
 
Android UI Patterns
Peter Pascale
 
[Android] Widget Event Handling
Nikmesoft Ltd
 
Android Transition
Charile Tsai
 
Android share preferences
Ajay Panchal
 
Android graphic system (SurfaceFlinger) : Design Pattern's perspective
Bin Chen
 
Ad

Similar to Android design and Custom views (20)

PDF
Enhancing UI/UX using Java animations
Naman Dwivedi
 
PDF
How to Become the MacGyver of Android Custom Views
Fernando Cejas
 
PPTX
Android Custom views
Matej Vukosav
 
PDF
Tips & Tricks to spice up your Android app
Jérémie Laval
 
PPTX
Android 3
Robert Cooper
 
PPTX
Material Design Android
Samiullah Farooqui
 
PPTX
What's New in Android
Robert Cooper
 
PDF
Android 2D Drawing and Animation Framework
Jussi Pohjolainen
 
PDF
Breathing the life into the canvas
Tomislav Homan
 
PPT
Android UI
mailalamin
 
PPT
Android Ui
Jetti Chowdary
 
PPTX
Android UI Tips & Tricks
DroidConTLV
 
PDF
Material design basics
Jorge Barroso
 
ODP
Day seven
Vivek Bhusal
 
PPTX
Fernando F. Gallego - Efficient Android Resources 101
Fernando Gallego
 
PDF
Android app material design from dev's perspective
DeSmart Agile Software House
 
PDF
Getting Started With Material Design
Yasin Yildirim
 
PPT
Getting the Magic on Android Tablets
OSCON Byrum
 
PPT
Android 2
San Bunna
 
PDF
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
Bin Shao
 
Enhancing UI/UX using Java animations
Naman Dwivedi
 
How to Become the MacGyver of Android Custom Views
Fernando Cejas
 
Android Custom views
Matej Vukosav
 
Tips & Tricks to spice up your Android app
Jérémie Laval
 
Android 3
Robert Cooper
 
Material Design Android
Samiullah Farooqui
 
What's New in Android
Robert Cooper
 
Android 2D Drawing and Animation Framework
Jussi Pohjolainen
 
Breathing the life into the canvas
Tomislav Homan
 
Android UI
mailalamin
 
Android Ui
Jetti Chowdary
 
Android UI Tips & Tricks
DroidConTLV
 
Material design basics
Jorge Barroso
 
Day seven
Vivek Bhusal
 
Fernando F. Gallego - Efficient Android Resources 101
Fernando Gallego
 
Android app material design from dev's perspective
DeSmart Agile Software House
 
Getting Started With Material Design
Yasin Yildirim
 
Getting the Magic on Android Tablets
OSCON Byrum
 
Android 2
San Bunna
 
Th 0230 turbo_chargeyourui-howtomakeyourandroidu_ifastandefficient
Bin Shao
 
Ad

More from Lars Vogel (20)

PDF
Eclipse IDE and Platform news on Fosdem 2020
Lars Vogel
 
PDF
How to become an Eclipse committer in 20 minutes and fork the IDE
Lars Vogel
 
PDF
Building beautiful User Interface in Android
Lars Vogel
 
PDF
What is so cool about Android 4.0
Lars Vogel
 
PDF
What is so cool about Android 4.0?
Lars Vogel
 
PDF
Android Jumpstart Jfokus
Lars Vogel
 
PDF
Eclipse e4 - Google Eclipse Day
Lars Vogel
 
PPT
Android C2DM Presentation at O'Reilly AndroidOpen Conference
Lars Vogel
 
PPTX
Android Overview (Karlsruhe VKSI)
Lars Vogel
 
PPTX
Android Introduction on Java Forum Stuttgart 11
Lars Vogel
 
PPT
Eclipse 2011 Hot Topics
Lars Vogel
 
PPT
Google App Engine for Java
Lars Vogel
 
PPTX
Android Cloud to Device Messaging with the Google App Engine
Lars Vogel
 
PDF
Google App Engine for Java
Lars Vogel
 
PPTX
Eclipse 4.0 - Dynamic Models
Lars Vogel
 
PDF
Eclipse 40 Labs- Eclipse Summit Europe 2010
Lars Vogel
 
PDF
Eclipse 40 - Eclipse Summit Europe 2010
Lars Vogel
 
PPTX
Android Programming made easy
Lars Vogel
 
PPTX
Eclipse 40 and Eclipse e4
Lars Vogel
 
PPTX
Eclipse RCP Overview @ Rheinjug
Lars Vogel
 
Eclipse IDE and Platform news on Fosdem 2020
Lars Vogel
 
How to become an Eclipse committer in 20 minutes and fork the IDE
Lars Vogel
 
Building beautiful User Interface in Android
Lars Vogel
 
What is so cool about Android 4.0
Lars Vogel
 
What is so cool about Android 4.0?
Lars Vogel
 
Android Jumpstart Jfokus
Lars Vogel
 
Eclipse e4 - Google Eclipse Day
Lars Vogel
 
Android C2DM Presentation at O'Reilly AndroidOpen Conference
Lars Vogel
 
Android Overview (Karlsruhe VKSI)
Lars Vogel
 
Android Introduction on Java Forum Stuttgart 11
Lars Vogel
 
Eclipse 2011 Hot Topics
Lars Vogel
 
Google App Engine for Java
Lars Vogel
 
Android Cloud to Device Messaging with the Google App Engine
Lars Vogel
 
Google App Engine for Java
Lars Vogel
 
Eclipse 4.0 - Dynamic Models
Lars Vogel
 
Eclipse 40 Labs- Eclipse Summit Europe 2010
Lars Vogel
 
Eclipse 40 - Eclipse Summit Europe 2010
Lars Vogel
 
Android Programming made easy
Lars Vogel
 
Eclipse 40 and Eclipse e4
Lars Vogel
 
Eclipse RCP Overview @ Rheinjug
Lars Vogel
 

Recently uploaded (20)

PDF
IoT-Powered Industrial Transformation – Smart Manufacturing to Connected Heal...
Rejig Digital
 
PDF
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
PDF
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
PDF
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
PDF
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
PDF
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PDF
From Code to Challenge: Crafting Skill-Based Games That Engage and Reward
aiyshauae
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
PDF
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
PDF
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
PDF
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
PDF
Biography of Daniel Podor.pdf
Daniel Podor
 
PDF
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
PDF
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
PDF
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
PPTX
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
PDF
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 
IoT-Powered Industrial Transformation – Smart Manufacturing to Connected Heal...
Rejig Digital
 
What Makes Contify’s News API Stand Out: Key Features at a Glance
Contify
 
NewMind AI - Journal 100 Insights After The 100th Issue
NewMind AI
 
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
CIFDAQ Weekly Market Wrap for 11th July 2025
CIFDAQ
 
DevBcn - Building 10x Organizations Using Modern Productivity Metrics
Justin Reock
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
From Code to Challenge: Crafting Skill-Based Games That Engage and Reward
aiyshauae
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
Exolore The Essential AI Tools in 2025.pdf
Srinivasan M
 
Jak MŚP w Europie Środkowo-Wschodniej odnajdują się w świecie AI
dominikamizerska1
 
HCIP-Data Center Facility Deployment V2.0 Training Material (Without Remarks ...
mcastillo49
 
Reverse Engineering of Security Products: Developing an Advanced Microsoft De...
nwbxhhcyjv
 
Biography of Daniel Podor.pdf
Daniel Podor
 
CIFDAQ Market Wrap for the week of 4th July 2025
CIFDAQ
 
"AI Transformation: Directions and Challenges", Pavlo Shaternik
Fwdays
 
Building Real-Time Digital Twins with IBM Maximo & ArcGIS Indoors
Safe Software
 
WooCommerce Workshop: Bring Your Laptop
Laura Hartwig
 
LLMs.txt: Easily Control How AI Crawls Your Site
Keploy
 

Android design and Custom views