android 2d drawing and animation framework

58
Android Drawing and Anima-on Jussi Pohjolainen Tampere University of Applied Sciences

Upload: jussi-pohjolainen

Post on 15-Apr-2017

11.544 views

Category:

Technology


6 download

TRANSCRIPT

Page 1: Android 2D Drawing and Animation Framework

Android  Drawing  and  Anima-on  

Jussi  Pohjolainen  Tampere  University  of  Applied  Sciences  

Page 2: Android 2D Drawing and Animation Framework

Android  Graphics  

•  Custom  2D  Graphics  – android.graphics.drawable  package  

•  OpenGL  ES  1.0  high  performance  3D  graphics  – javax.microedition.khronos.opengles  package  

•  In  this  lecture,  we  will  concentrate  on  the  2D  graphics  

Page 3: Android 2D Drawing and Animation Framework

DRAWABLES  AND  SCREEN  SIZES  

Page 4: Android 2D Drawing and Animation Framework

Drawables  

•  A  Drawable  is  a  general  abstrac-on  for  “something  that  can  be  drawn”  – BitmapDrawable, ShapeDrawable, LayerDrawable …

•  How  to  define  and  instan-ate  Drawable?  1.  Use  image  saved  to  project  resources  2.  XML  file  that  defines  drawable  proper-es  3.  In  Java  

Page 5: Android 2D Drawing and Animation Framework

1.  Use  image  saved  to  project  resources  

•  Supported  types:  PNG  (preferred),  JPG  (acceptable)  and  GIF  (discoured)  

•  Add  the  file  to  res/drawable  •  Refer  using  the  R  –  class  •  Use  it  from  Java  or  XML    

Page 6: Android 2D Drawing and Animation Framework

Save  Image  to  Project  

Page 7: Android 2D Drawing and Animation Framework

Screen  Sizes  

•  Android  supports  different  screen  sizes  •  Simplifying  developer’s  work:  – 4  generalized  sizes:  small,  normal,  large,  xlarge  – 4  generalized  densi-es:  ldpi,  mdpi,  hdpi,  xhdpi  

 

Page 8: Android 2D Drawing and Animation Framework

Emulators  for  different  Screen  Sizes  

Page 9: Android 2D Drawing and Animation Framework

Resources  res/layout/my_layout.xml            // layout for normal screen size

res/layout-small/my_layout.xml      // layout for small screen size

res/layout-large/my_layout.xml      // layout for large screen size

res/layout-large-land/my_layout.xml // layout for large screen size in landscape mode

res/layout-xlarge/my_layout.xml     // layout for extra large screen size

res/drawable-lhdpi/my_icon.png      // image for low density

res/drawable-mdpi/my_icon.png   // image for medium density

res/drawable-hdpi/my_icon.png       // image for high density

res/drawable-nodpi/composite.xml    // density independent resource

Page 10: Android 2D Drawing and Animation Framework

Displaying  Image  using  Java  public class DrawingExamples extends Activity { /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Context mContext = getApplicationContext(); Resources res = mContext.getResources(); Drawable drawable = res.getDrawable(R.drawable.androidlogo); ImageView imageview = new ImageView(this); imageview.setImageDrawable(drawable); setContentView(imageview); } }

Page 11: Android 2D Drawing and Animation Framework

Easier  way  public class DrawingExamples extends Activity {

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

ImageView imageview = new ImageView(this);

imageview.setImageResource(R.drawable.androidlogo);

setContentView(imageview);

}

}

Page 12: Android 2D Drawing and Animation Framework

Or  use  it  via  the  XML  <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent”>

<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/androidlogo" /> </LinearLayout>

Page 13: Android 2D Drawing and Animation Framework

2D  DRAWING  

Page 14: Android 2D Drawing and Animation Framework

Drawing  on  a  View  

•  If  no  significant  frame-­‐rate  speed  needed,  draw  to  custom  View

•  Extend  View  and  define  onDraw  –  method  •  onDraw() is  called  automa-cally  •  Redraw:  invalidate() •  Inside  onDraw(),  Canvas  is  given  

Page 15: Android 2D Drawing and Animation Framework

Simple  2D  Drawing:  View  public class CustomDrawableView extends View { public CustomDrawableView(Context context, AttributeSet attr) { super(context, attr); } protected void onDraw(Canvas canvas) { // Paint class holds style information Paint myPaint = new Paint(); myPaint.setStrokeWidth(3); myPaint.setColor(0xFF097286); canvas.drawCircle(200, 200, 50, myPaint); invalidate(); } }

Page 16: Android 2D Drawing and Animation Framework

Simple  2D  Drawing:  View  

<fi.tamk.CustomDrawableView

android:layout_width="fill_parent"

android:layout_height="wrap_content"

/>

Page 17: Android 2D Drawing and Animation Framework

ShapeDrawable

•  With  ShapeDrawable,  one  can  draw  primi-ve  2D  shapes  – ArcShape, OvalShape, RoundRectShape, PathShape, RectShape

•  ShapeDrawable  takes  Shape  object  and  manages  it  into  screen  

•  Shapes  can  be  defined  in  XML  

Page 18: Android 2D Drawing and Animation Framework

Shape  Drawable  in  Java  // Drawing primitive 2D shapes public class CustomDrawableView extends View {     private ShapeDrawable mDrawable;     public CustomDrawableView(Context context) {         super(context);         int x = 10;         int y = 10;         int width = 300;         int height = 50;         mDrawable = new ShapeDrawable(new OvalShape());         mDrawable.getPaint().setColor(0xff74AC23);         mDrawable.setBounds(x, y, x + width, y + height);     }     protected void onDraw(Canvas canvas) {         mDrawable.draw(canvas);     } }

Page 19: Android 2D Drawing and Animation Framework

Shape  Drawable  in  XML  // res/drawable-xxx/myshapes.xml <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <gradient android:angle="90" android:startColor="#ffffff" android:endColor="#ff0000" android:type="linear" /> <size android:width="60dp" android:height="40dp" /> </shape>

Page 20: Android 2D Drawing and Animation Framework

Shape  Drawable  in  XML  // res/layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" >

<ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/myshapes" /> </LinearLayout>

Page 21: Android 2D Drawing and Animation Framework

Result  

Page 22: Android 2D Drawing and Animation Framework

ANIMATION  

Page 23: Android 2D Drawing and Animation Framework

About  Anima-on  

–  1)  View  Anima<on  •  Any  View  object  to  perform  tweened  anima-on  and  frame  

by  frame  anima-on  •  Tween  anima-on  calculates  anima-on  given  informa-on:  

start,  end,  size,  rota-on  and  other  •  Frame  by  frame:  series  of  drawables  one  ader  another  

–  2)  Property  Anima<on  System  (Android  3.x)  •  “Animate  almost  anything”  •  Define  anima-on  to  change  any  object  property  over  -me,  

whether  in  screen  or  not    

Page 24: Android 2D Drawing and Animation Framework

Differences  

•  View  +  Less  -me  to  setup  +  Less  code  to  write  -­‐  Only  View  objects  -­‐  Only  certain  aspects  to  animate  (scaling,  rota-ng..)  -­‐  View  itself  is  not  modified  when  anima-ng  

•  Property  anima<on  system  +  Anima-ng  also  non  View  objects  +  Anima-ng  any  property  of  any  object  -­‐  More  work  

Page 25: Android 2D Drawing and Animation Framework

VIEW  ANIMATION  

Page 26: Android 2D Drawing and Animation Framework

About  View  Anima-on  

•  View  anima-on  can  be  1)  tween  or  2)  frame  by  frame  anima-on  

•  Tween  anima-on  –  Can  perform  series  of  simple  transforma-ons  (posi-on,  size,  rota-on,  transparency)  on  View  object  

–  In  XML  or  in  code  

•  Frame  anima-on  –  Sequence  of  different  images  –  In  XML  or  in  code  

Page 27: Android 2D Drawing and Animation Framework

1)  Tween  anima-on  

•  Preferred  way:  Define  in  XML  •  Anima-on  xml  is  stored  in  res/anim  directory  •  Root  element  can  be:  alpha,  scale,  translate,  rotate  or  set  that  holds  groups  of  these  elements  

Page 28: Android 2D Drawing and Animation Framework

Tween  Anima-on:  XML  <?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android"

    android:interpolator="@[package:]anim/interpolator_resource"     android:shareInterpolator=["true" | "false"] >

    <alpha

        android:fromAlpha="float"

        android:toAlpha="float" />

    <scale

        android:fromXScale="float"         android:toXScale="float"

        android:fromYScale="float"

        android:toYScale="float"

        android:pivotX="float"

        android:pivotY="float" />

    <translate

        android:fromXDelta="float"

        android:toXDelta="float"

        android:fromYDelta="float"

        android:toYDelta="float" />

    <rotate

        android:fromDegrees="float"

        android:toDegrees="float"         android:pivotX="float"

        android:pivotY="float" />

    <set>

        ...

    </set>

</set>

Page 29: Android 2D Drawing and Animation Framework

Tween  Anima-on:  Java  

TextView v = (TextView) findViewById(R.id.textview1);

Animation myanimation =

AnimationUtils.loadAnimation(this, R.anim.myanimation);

v.startAnimation(myanimation);

Page 30: Android 2D Drawing and Animation Framework

Basic  Defini-ons  

•  <alpha> –  fade-­‐in  or  fade-­‐out  anima-ons.    

•  <scale> – Resizing  anima-on.    

•  <translate> – Ver-cal  and  or  horizontal  movement.  

•  <rotate> – A  rota-on  of  an  anima-on  

Page 31: Android 2D Drawing and Animation Framework

Example  of  Translate  <?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android"

android:shareInterpolator="false">

<translate android:fromXDelta="0"

android:fromYDelta="0"

android:toXDelta="0"

android:toYDelta="100%p"

android:duration="700"

android:repeatMode="reverse"

android:repeatCount="1"

/>

</set>

Start  from  0,0  End  to  0,  100%  from  parent  

Dura-on  is  700  Repeat  in  reverse  one  -me  

Page 32: Android 2D Drawing and Animation Framework
Page 33: Android 2D Drawing and Animation Framework

Scale  <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <scale android:fromXScale="1" android:fromYScale="1" android:toXScale="6" android:toYScale="6" android:duration="700" android:repeatMode="reverse" android:repeatCount="1" /> </set>

Page 34: Android 2D Drawing and Animation Framework
Page 35: Android 2D Drawing and Animation Framework

Rotate  <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <rotate android:fromDegrees="0" android:toDegrees="360" android:pivotX="50%" android:pivotY="50%" android:duration="700" /> </set>

Page 36: Android 2D Drawing and Animation Framework
Page 37: Android 2D Drawing and Animation Framework

Alpha  <?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android" android:shareInterpolator="false"> <alpha

android:fromAlpha = "1" android:toAlpha = "0" android:duration = "1000" android:repeatMode = "reverse" android:repeatCount= "1" />

</set>

Page 38: Android 2D Drawing and Animation Framework
Page 39: Android 2D Drawing and Animation Framework

Using  Several  Anima-ons  

<?xml  version="1.0"  encoding="um-­‐8"?>  <set  xmlns:android="hpp://schemas.android.com/apk/res/android"            android:shareInterpolator="false">                                    <alpha                android:fromAlpha    =  "1"                android:toAlpha        =  "0"                android:dura-on      =  "1000"                android:repeatMode  =  "reverse"                android:repeatCount=  "1"  />                    <rotate                android:fromDegrees  =  "0"                android:toDegrees      =  "360"                android:pivotX            =  "50%"                android:pivotY            =  "50%"                android:dura-on        =  "1000"                  android:repeatMode    =  "reverse"                android:repeatCount  =  "1"  />  

<scale

android:fromXScale = "1"

android:fromYScale = "1"

android:toXScale = "6"

android:toYScale = "6"

android:pivotX = "50%"

android:pivotY = "50%"

android:duration = "1000"

android:repeatMode = "reverse"

android:repeatCount = "1" />

</set>

Page 40: Android 2D Drawing and Animation Framework
Page 41: Android 2D Drawing and Animation Framework

Interpola-on  

•  Interpola-on  is  an  anima-on  modifier  defined  in  xml  

•  Rate  of  change  in  anima-on  – Accelerate,  decelerate,  bounce…  

Page 42: Android 2D Drawing and Animation Framework

Example  of  Interpola-on  <?xml version="1.0" encoding="utf-8"?>

<set xmlns:android="http://schemas.android.com/apk/res/android"

android:shareInterpolator="true"

android:interpolator="@android:anim/bounce_interpolator"

>

<translate android:fromXDelta="0"

android:fromYDelta="0"

android:toXDelta="0"

android:toYDelta="100%p"

android:duration="700" />

</set>

Page 43: Android 2D Drawing and Animation Framework
Page 44: Android 2D Drawing and Animation Framework

Different  Interpola-ons  

Page 45: Android 2D Drawing and Animation Framework

2)  Frame  Anima-on  

•  Create  XML  file  that  consists  of  sequence  of  different  images  

•  Root-­‐element:  <anima-on-­‐list>  and  series  of  child  elements  <item>  

 

Page 46: Android 2D Drawing and Animation Framework

Example  <?xml version="1.0" encoding="utf-8"?> <animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="false"> <item android:drawable="@drawable/a1" android:duration="200" /> <item android:drawable="@drawable/a2" android:duration="200" /> <item android:drawable="@drawable/a3" android:duration="200" /> <item android:drawable="@drawable/a4" android:duration="200" /> <item android:drawable="@drawable/a5" android:duration="200" /> <item android:drawable="@drawable/a6" android:duration="200" /> <item android:drawable="@drawable/a7" android:duration="200" /> <item android:drawable="@drawable/a8" android:duration="200" /> </animation-list>

Page 47: Android 2D Drawing and Animation Framework

Star-ng  the  Frame  Anima-on  ImageView player = (ImageView) findViewById(R.id.player);

player.setImageResource(R.drawable.frameanimation);

AnimationDrawable anim = (AnimationDrawable) player.getDrawable();

anim.start();

Page 48: Android 2D Drawing and Animation Framework

PROPERTY  ANIMATION  Honeycomb  Feature!  

Page 49: Android 2D Drawing and Animation Framework

Property  Anima-on  

•  Extend  anima-on  beyond  Views!  – Also  limited  scope:  move,  rotate,  scale,  alpha.  That’s  it.  

•  With  Property  Anima-on,  you  can  animate  almost  anything  

•  Changes  the  object  itself  •  Anima-ng  values  over  <me    

Page 50: Android 2D Drawing and Animation Framework

ValueAnimator  

•  To  animate  values  0.0  –  1.0  –  ValueAnimator anim = ValueAnimator.ofInt(0, 100); –  anim.setDuration(500); –  anim.start();

•  It  animates,  but  nothing  can  be  seen.  Add  listener!  –  anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { –          public void onAnimationUpdate(ValueAnimator animation) { –              int value = (Integer) animation.getAnimatedValue(); –              // do something with value... –          } –      });

Page 51: Android 2D Drawing and Animation Framework

ObjectAnimator:  animate  objects!  MyPoint myobject = new MyPoint(0,0);

// Animate myobject’s x-attribute from default value

// to 20!

ObjectAnimator anim2 =

ObjectAnimator.ofInt(myobject, "x", 20);

anim2.setDuration(2500);

anim2.start(); Assumes  that  myobject  has  getX()  and  setX(int  x)  

methods1  

Page 52: Android 2D Drawing and Animation Framework

View  class  in  Honeycomb  

•  In  Honeycomb,  View  class  has  several  set/get  methods..  For  example  – setAlpha  (float  alpha)  – float  getAlpha  ()  

•  So  by  using  Object  Animator,  you  can  animate  the  alpha  (transparency)  for  every  view!  

Page 53: Android 2D Drawing and Animation Framework

Value/Object  Animator  Methods  

•  setStartDelay(long) •  setRepeatCount(int) •  setRepeatMode(int) •  setInterPolator(TimeInterpolator)

Page 54: Android 2D Drawing and Animation Framework

Example  anima-ng  View  // Getting reference to TextView defined in xml

tv = (TextView) findViewById(R.id.textview1);

ObjectAnimator anim =

ObjectAnimator.ofFloat(tv, "alpha", 0);

anim.setDuration(1000);

anim.setRepeatCount(ObjectAnimator.INFINITE);

anim.setRepeatMode(ObjectAnimator.REVERSE);

anim.start();

Page 55: Android 2D Drawing and Animation Framework
Page 56: Android 2D Drawing and Animation Framework

AnimatorSet  

•  Choreograph  mul-ple  anima-ons  •  Play  several  anima-ons  together  – playTogether(Animator…)  

•  Play  anima-ons  one  ader  another  – playSequen-ally(Animator…)  

•  Or  combina-on  of  above  – with(),  before(),  ader()  methods  

Page 57: Android 2D Drawing and Animation Framework
Page 58: Android 2D Drawing and Animation Framework