08 custom drawing & animation · & animation cs 442: mobile app development michael saelee ...

94
Custom Drawing & Animation CS 442: Mobile App Development Michael Saelee <[email protected]> 1

Upload: others

Post on 06-Oct-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

Custom Drawing & Animation

CS 442: Mobile App DevelopmentMichael Saelee <[email protected]>

1

Page 2: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

Frameworks

- UIKit- Core Graphics / Quartz- Core Animation- OpenGL ES

2

Page 3: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

UIKit

Core Graphics

OpenGL ESCore

Animation

3

Page 4: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

UIKit

(mostly) ObjC APIUI... classes/functions

4

Page 5: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

Base view class: UIViewPre-built controls: UIControls

UIKit

5

Page 6: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

typically, use concrete subclasses as is (no need to subclass)e.g., UILabel, UIButton, UITableView, UIImageView

UIKit

6

Page 7: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

can also subclass UIView to draw custom UI elements

UIKit

7

Page 8: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

support for- 2D drawing- transformations- predefined transitions- basic animation

UIKit

8

Page 9: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

CG

aka “Quartz 2D”C API for drawing

9

Page 10: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

support for:- layer-based graphics- patterns, gradients, etc.- color spaces- working with bitmaps

CG

10

Page 11: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

mostly, UIKit draws using CGi.e., more than one way of doing anything

CG

11

Page 12: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

CGUIKit

//  get  current  graphics  context  to  draw  intoCGContextRef  context  =  UIGraphicsGetCurrentContext();

//  clear  with  white  rectangleCGContextSetRGBFillColor(context,  1.0,  1.0,  1.0,  1.0);CGContextFillRect(context,  self.bounds);

//  load  image  from  fileNSString*  imageFileName  =  [[[NSBundle  mainBundle]  resourcePath]                                                        stringByAppendingPathComponent:@"image.png"];CGDataProviderRef  provider  =  CGDataProviderCreateWithFilename([imageFileName  UTF8String]);CGImageRef  image  =  CGImageCreateWithPNGDataProvider(provider,                                                                                                          NULL,                                                                                                          true,                                                                                                          kCGRenderingIntentDefault);CGDataProviderRelease(provider);

//  draw  image  at  (0,0)CGContextDrawImage(context,                                        CGRectMake(0,  0,  CGImageGetWidth(image),  CGImageGetHeight(image)),                                        image);CGImageRelease(image);

//  clear  with  white  rectangle[[UIColor  whiteColor]  set];UIRectFill(self.bounds);        //  load  and  draw  image  at  (0,0)[[UIImage  imageNamed:@"image.png"]  drawAtPoint:CGPointMake(0,  0)];

12

Page 13: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

CA

ObjC API for animation and compositing

verb [ trans. ] [usu. as n. ] ( compositing)combine (two or more images) to make a single picture, esp. electronically : photographic compositing by computer.

13

Page 14: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

all UIViews are backed by CA layers

CA

14

Page 15: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

can create a hierarchy of CALayers within a single view(in addition to creating a hierarchy of views)

CA

15

Page 16: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

generally, layers are:- more lightweight- more flexible- more complex

CA

16

Page 17: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

CALayer properties can be automatically animated

CA

17

Page 18: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

support for:- simple value interpolation- key frame animation- transition effects- animation groups

CA

18

Page 19: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

CA

//  create  new  CA  layer  and  populate  with  imageCALayer  *layer  =  [CALayer  layer];UIImage  *image  =  [UIImage  imageNamed:@"image.png"];layer.contents  =  image.CGImage;layer.frame        =  CGRectMake(0,  0,  image.size.width,  image.size.height);        //  add  layer  to  view  layer[self.view.layer  addSublayer:layer];        //  create  basic  animation  to  interpolate  position  between  (100,100)  and  (300,300)CABasicAnimation  *anim  =  [CABasicAnimation  animationWithKeyPath:@"position"];anim.fromValue  =  [NSValue  valueWithCGPoint:CGPointMake(100,  100)];anim.toValue  =  [NSValue  valueWithCGPoint:CGPointMake(300,  300)];anim.duration  =  5.0;anim.autoreverses  =  YES;anim.repeatCount  =  HUGE_VALF;anim.timingFunction  =  [CAMediaTimingFunction  functionWithName:kCAMediaTimingFunctionEaseInEaseOut];[layer  addAnimation:anim  forKey:@"backandforth"];

//  load  image  and  add  to  view  at  position  (100,100)UIImageView  *imageView  =  [[UIImageView  alloc]  initWithImage:[UIImage  imageNamed:@"image.png"]];imageView.center  =  CGPointMake(100,  100);[self.view  addSubview:imageView];        //  animate  using  a  block  -­‐-­‐  bounce  between  start  position  and  (300,300)[UIView  animateWithDuration:5.0                                            delay:0.0                                        options:UIViewAnimationOptionRepeat|UIViewAnimationOptionAutoreverse                                  animations:^{                                          imageView.center  =  CGPointMake(300,  300);                                  }                                  completion:NULL];

UIKit

19

Page 20: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

OpenGL

industry standard 2D/3D graphics API

20

Page 21: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

technically, OpenGL ES; i.e., for Embedded Systems

OpenGL

21

Page 22: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

OpenGL ES 2.0 not backwards compatible(fixed-function vs. shaders)

OpenGL

22

Page 23: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

hardware acceleration(iPad 2: CPUx2, GPUx9, iPad 3: CPUx1, GPUx2-3)

OpenGL

23

Page 24: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

OpenGL render destination:CAEAGLLayer in UIView

OpenGL

24

Page 25: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

generally, don’t mix OpenGL and UIKit/CA/CG functions(e.g., no layer transforms)

OpenGL

25

Page 26: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

UIKit

Core Graphics

OpenGL ESCore

Animation

26

Page 27: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

§Drawing

27

Page 28: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

(0,0)

x

y

320

480

“ULO”

28

Page 29: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

(0,0)x

y

320

480

“ULO”

29

Page 30: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

320 x 480 points(not necessarily = pixels!)

30

Page 31: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

≈ resolution independencescale factor × points = pixels(retina display: scale = 2.0)

31

Page 32: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

/* Points. */typedef struct { float x; float y;} CGPoint;

/* Sizes. */typedef struct { float width; float height;} CGSize;

/* Rectangles. */typedef struct { CGPoint origin; CGSize size;} CGRect;

principal data types:CGPoint, CGSize, CGRect

32

Page 33: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

/*  Make  a  point  from  ‘(x,  y)’.  */CGPoint  CGPointMake(CGFloat  x,  CGFloat  y);

/*  Make  a  size  from  ‘(width,  height)’.  */CGSize    CGSizeMake(CGFloat  width,  CGFloat  height);

/*  Make  a  rect  from  ‘(x,  y;  width,  height)’.  */CGRect    CGRectMake(CGFloat  x,  CGFloat  y,                                        CGFloat  width,  CGFloat  height);

33

Page 34: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

/*  Return  the  left/mid/right  x-­‐value  of  ‘rect’.  */CGFloat  CGRectGetMinX(CGRect  rect);CGFloat  CGRectGetMidX(CGRect  rect);CGFloat  CGRectGetMaxX(CGRect  rect);

/*  Return  the  top/mid/bottom  y-­‐value  of  ‘rect’.  */CGFloat  CGRectGetMinY(CGRect  rect);CGFloat  CGRectGetMidY(CGRect  rect);CGFloat  CGRectGetMaxY(CGRect  rect);

/*  Return  the  width/height  of  ‘rect’.  */CGFloat  CGRectGetWidth(CGRect  rect);CGFloat  CGRectGetHeight(CGRect  rect);

/*  Standardize  ‘rect’  -­‐-­‐  i.e.,  convert  it  to  an        equivalent  rect  which  has  positive  width  and  height.  */CGRect  CGRectStandardize(CGRect  rect);

/*  Return  true  if  ‘rect’  is  empty  (that  is,  if  it  has        zero  width  or  height),  false  otherwise.  A  null  rect        is  defined  to  be  empty.  */bool  CGRectIsEmpty(CGRect  rect);

34

Page 35: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

locating/placing things:frame & bounds rectangles

35

Page 36: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

frame = origin & size in superview’s coordinate system

36

Page 37: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

bounds = origin & size in local view’s coordinate system

37

Page 38: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

application window38

Page 39: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

application window

view frame:- origin = (6, 5)- size = (15, 10)

view

39

Page 40: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

application window

view

view bounds:- origin = (0, 0)- size = (15, 10)

subview

subview frame:- origin = (3, 4)- size = (6, 5)

40

Page 41: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

size of frame, bounds are automatically linked

41

Page 42: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

reposition view by changing frame origin or center(changing one automatically adjusts the other)

42

Page 43: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

can change bounds origin to adjust local coordinate system

43

Page 44: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

view bounds:- origin = (0, 0)- size = (15, 10)

subview frame:- origin = (3, 4)- size = (6, 5)

44

Page 45: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

view bounds:- origin = (-1, 4)- size = (15, 10)

subview frame:- origin = (3, 4)- size = (6, 5)

45

Page 46: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

/* Fill `rect' with solid color */void UIRectFill(CGRect rect);void UIRectFillUsingBlendMode(CGRect rect, CGBlendMode blendMode);

/* Draw 1px frame inside `rect'. */void UIRectFrame(CGRect rect);void UIRectFrameUsingBlendMode(CGRect rect, CGBlendMode blendMode);

Simple Drawing

46

Page 47: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

@interface  UIColor//  Convenience  methods  for  creating  autoreleased  colors+  (UIColor  *)colorWithRed:(CGFloat)red                                          green:(CGFloat)green                                            blue:(CGFloat)blue                                          alpha:(CGFloat)alpha;

//  Some  convenience  methods  to  create  colors.  These  colors  are  cached.+  (UIColor  *)blackColor;            //  0.0  white  +  (UIColor  *)redColor;                //  1.0,  0.0,  0.0  RGB  +  (UIColor  *)greenColor;            //  0.0,  1.0,  0.0  RGB  +  (UIColor  *)blueColor;              //  0.0,  0.0,  1.0  RGB  +  (UIColor  *)clearColor;            //  0.0  white,  0.0  alpha  

//  Set  the  color:  Sets  the  fill  and  stroke  colors  in  the  current  drawing  context.-­‐  (void)set;

//  Set  the  fill  or  stroke  colors  individually.-­‐  (void)setFill;-­‐ (void)setStroke;

//  Access  the  underlying  CGColor@property(nonatomic,readonly)  CGColorRef  CGColor;@end

Color?

47

Page 48: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

UIKit framework always draws to implicit, current Graphics Context

48

Page 49: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

CG maintains a stack of graphics contexts(empty, by default)

49

Page 50: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

UIView object pushes graphics context for its layer before calling drawRect:

50

Page 51: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

@interface  UIView(UIViewRendering)/*  All  custom  drawing  must  happen  from  this  method.      Should  limit  drawing  to  ‘rect’  -­‐-­‐  on  first  call      ‘rect’  is  usually  equal  to  our  bounds.  */-­‐ (void)drawRect:(CGRect)rect;

/*  drawRect:  is  called  lazily.  If  view  must  be  redrawn,      we  must  notify  the  system  by  calling  one  of  these      methods  below.  */-­‐  (void)setNeedsDisplay;-­‐  (void)setNeedsDisplayInRect:(CGRect)rect;@end

51

Page 52: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

Q: draw in current view vs. adding subview?- it depends …- subviews allow us to add/remove objects

- but adds memory + processing overhead

52

Page 53: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

demo

HelloWorldView-discuss root view frame origin/size

Rectangle1-using setNeedsDisplay to force refresh

Rectangle2-use multiple views to track drawn rectangles

- ignore contentStretch for now

GameBoard- handling

53

Page 54: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

subview size > superview?

54

Page 55: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

default: no subview clipping.but no scrolling, either

55

Page 56: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

demo

Clipping Demo- effect of clipsToBounds

ScrollView Demo-automatic pan support based on contentSize

-also: pinch to zoom

56

Page 57: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

view transformations: translating, scaling, rotating

57

Page 58: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

common strategy:- draw “unit” object at (0,0)- translate, scale, rotate to final position/size/orientation

58

Page 59: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

drawRect: can be very lazyi.e., draw once, transform many times

59

Page 60: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

implementation: “affine transform matrices”

60

Page 61: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

=⇥x+ t

x

y + t

y

1⇤

⇥x

0y

0 1⇤=

⇥x y 1

⇤⇥

2

4a b 0c d 0t

x

t

y

1

3

5

transformation matrixtransformed coordinates

original coordinates

x

0 = ax+ cy + t

x

y

0 = bx+ dy + ty

⇥x

0y

0 1⇤=

⇥x y 1

⇤⇥

2

41 0 00 1 0t

x

t

y

1

3

5e.g.

61

Page 62: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

/*  The  identity  transform:  [  1  0  0  1  0  0  ].  */extern  const  CGAffineTransform  CGAffineTransformIdentity;

/*  Return  a  transform  which  translates  by  `(tx,  ty)':          t'  =  [  1  0  0  1  tx  ty  ]  */CGAffineTransform  CGAffineTransformMakeTranslation(CGFloat  tx,  CGFloat  ty);

/*  Return  a  transform  which  scales  by  `(sx,  sy)':          t'  =  [  sx  0  0  sy  0  0  ]  */CGAffineTransform  CGAffineTransformMakeScale(CGFloat  sx,  CGFloat  sy);

/*  Return  a  transform  which  rotates  by  `angle'  radians:          t'  =  [  cos(angle)  sin(angle)  -­‐sin(angle)  cos(angle)  0  0  ]  */CGAffineTransform  CGAffineTransformMakeRotation(CGFloat  angle)

/*  Concatenate  translation,  scaling,  rotation  transforms  to  existing  matrices.  */CGAffineTransform  CGAffineTransformTranslate(CGAffineTransform  t,  CGFloat  tx,  CGFloat  ty);CGAffineTransform  CGAffineTransformScale(CGAffineTransform  t,  CGFloat  sx,  CGFloat  sy);CGAffineTransform  CGAffineTransformRotate(CGAffineTransform  t,  CGFloat  angle);

typedef  struct  {    CGFloat  a,  b,  c,  d;    CGFloat  tx,  ty;}  CGAffineTransform;

62

Page 63: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

for given graphics context (e.g., in drawRect:), change current transform matrix (CTM)

63

Page 64: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

/*  Scale  the  current  graphics  state's  transformation  matrix  (the  CTM)  by      `(sx,  sy)'.  */void  CGContextScaleCTM(CGContextRef  c,  CGFloat  sx,  CGFloat  sy);

/*  Translate  the  current  graphics  state's  transformation  matrix  (the  CTM)  by      `(tx,  ty)'.  */void  CGContextTranslateCTM(CGContextRef  c,  CGFloat  tx,  CGFloat  ty);

/*  Rotate  the  current  graphics  state's  transformation  matrix  (the  CTM)  by      `angle'  radians.  */void  CGContextRotateCTM(CGContextRef  c,  CGFloat  angle);

/*  Concatenate  the  current  graphics  state's  transformation  matrix  (the  CTM)      with  the  affine  transform  `transform'.  */void  CGContextConcatCTM(CGContextRef  c,  CGAffineTransform  transform);

64

Page 65: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

demo

ExpandingFrame

-look at RotatingView drawRect-motivate CGContextSave/RestoreGState

-explore frame/bounds relationship

65

Page 66: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

Drawing Other Shapes

cubic & quadratic Bézier curves

66

Page 67: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

@interface  UIBezierPath  :  NSObject<NSCopying,  NSCoding>  {

+  (UIBezierPath  *)bezierPath;

-­‐  (void)moveToPoint:(CGPoint)point;-­‐  (void)addLineToPoint:(CGPoint)point;-­‐  (void)addCurveToPoint:(CGPoint)endPoint                      controlPoint1:(CGPoint)controlPoint1                      controlPoint2:(CGPoint)controlPoint2;-­‐  (void)addQuadCurveToPoint:(CGPoint)endPoint                                controlPoint:(CGPoint)controlPoint;-­‐  (void)addArcWithCenter:(CGPoint)center                                      radius:(CGFloat)radius                              startAngle:(CGFloat)startAngle                                  endAngle:(CGFloat)endAngle                                clockwise:(BOOL)clockwise;-­‐ (void)closePath;

+  (UIBezierPath  *)bezierPathWithRect:(CGRect)rect;+  (UIBezierPath  *)bezierPathWithOvalInRect:(CGRect)rect;+  (UIBezierPath  *)bezierPathWithRoundedRect:(CGRect)rect                                                                cornerRadius:(CGFloat)cornerRadius;

@property(nonatomic)  CGPathRef  CGPath;@end

67

Page 68: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

Bézier curves can be created, stored, and reused, independent of graphics context

68

Page 69: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

demo

BezierDrawing

69

Page 70: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

rects, curves, etc.= vector graphics⇒ infinite scaleability

70

Page 71: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

raster graphics?e.g., bitmaps, JPG, PNG

71

Page 72: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

UIKit: load with UIImage

72

Page 73: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

imageNamed:Returns the image object associated with the specified filename.+  (UIImage  *)imageNamed:(NSString  *)name

Parametersname

The name of the file. If this is the first time the image is being loaded, the method looks for an image with the specified name in the application’s main bundle.

Return ValueThe image object for the specified file, or nil if the method could not find the specified image.

DiscussionThis method looks in the system caches for an image object with the specified name and returns that object if it exists. If a matching image object is not already in the cache, this method loads the image data from the specified file, caches it, and then returns the resulting object.On a device running iOS 4 or later, the behavior is identical if the device’s screen has a scale of 1.0. If the screen has a scale of 2.0, this method first searches for an image file with the same filename with an @2x suffix appended to it. For example, if the file’s name is button, it first searches for button@2x. If it finds a 2x, it loads that image and sets the scale property of the returned UIImage object to 2.0. Otherwise, it loads the unmodified filename and sets the scale property to 1.0.

73

Page 74: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

caveat emptor: imageNamed cache can be quite aggressive!(Google: “imageNamed cache”)

74

Page 75: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

raster graphics problem: scaling → pixelation

75

Page 76: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

UIView contentStretch property defines which parts of an image are “stretched”

76

Page 77: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

demo

ContentStretching

77

Page 78: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

Image Drawing Options

image  =  [UIImage  imageNamed:@"image.png"];

UIImageView  *imageView  =  [[UIImageView  alloc]                                                      initWithImage:image];[self.view  addSubview:imageView];

➊ UIKit (subview)

-­‐  (void)drawRect:(CGRect)rect  {        [image  drawAtPoint:CGPointMake(0,  0)];}

➋ CG (drawing)

CALayer  *layer  =  [CALayer  layer];layer.contents  =  image.CGImage;[self.view.layer  addSublayer:layer];

➌ CA (compositing)

78

Page 79: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

demo

ImageDrawing-run all three versions (view, layer, drawRect) --- may want to keep num_image < 100 for the last

-run through instruments: memory allocations (num_images=10000 for view, layer version), and time profiler (esp. interesting for drawRect based)

79

Page 80: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

more reading (Xcode library):- View Programming Guide for iOS- Quartz 2D Programming Guide

80

Page 81: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

§Animation

81

Page 82: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

UIKit / CoreAnimation

82

Page 83: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

typically, use “magic” UIView / CALayer animation mechanism

83

Page 84: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

i.e., provide “new” view properties in animation block along with time frame

— core animation does the rest

84

Page 85: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

note: CA updates happen in a separate thread!

85

Page 86: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

animated parameters are updated according to a specified interpolation curve (aka timing function)

86

Page 87: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

timing functions

87

Page 88: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

e.g., sprites

88

Page 89: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

e.g., basic “magic” animations

89

Page 90: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

e.g., how it works (CA equivalent with CAAction)

90

Page 91: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

e.g., view transitions

91

Page 92: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

e.g., UIImage based animations (multiple images)

92

Page 93: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

e.g., CABasicAnimation

93

Page 94: 08 Custom Drawing & Animation · & Animation CS 442: Mobile App Development Michael Saelee  1. Frameworks - UIKit - Core Graphics / Quartz - Core Animation - OpenGL

e.g., CAKeyFrameAnimation

94