SlideShare a Scribd company logo
Exploring Canvas
Agenda
  • Getting started
  • Drawing
  • Charting
  • Images
  • Interaction
  • Animation
Exploring Canvas
Using the Canvas Tag

<canvas id="chart" width="150" height="150">
    Current stock price: $3.15 +0.15
</canvas>

<canvas id="clock" width="150" height="150">
    <img
         src="imagesclock.png"
         width="150"
         height="150"/>
</canvas>
Rendering Context

var canvas = document.getElementById( 'canvas' );
var context = null;

if( canvas.getContext )
{
  context = canvas.getContext( '2d' );
  // Drawing code here
} else {
  // Unsupported code here
}
Coordinate Space
      0
  0                          X

              y
          x




                          height
                  width
  Y
Drawing Paths
context.beginPath();

context.arc( 75, 75, 50, 0, Math.PI * 2, true );
context.moveTo( 110, 75 );
context.arc( 75, 75, 35, 0, Math.PI, false );
context.moveTo( 65, 65 );
context.arc( 60, 65, 5, 0, Math.PI * 2, true );
context.moveTo( 95, 65 );
context.arc( 90, 65, 5, 0, Math.PI * 2, true );

// context.closePath();
context.stroke();
// context.fill();
Understanding Lines
(0, 0)                    (0, 0)
                 (3, 1)                (3.5, 1)




                 (3, 5)                  (3.5, 5)
          1.0 width                1.0 width
Caps, Joints and Miters



  butt    round    width / 2
 round    bevel      x limit
 square   miter   from joint
Curves




Quadratic Curve            Cubic Curve
Styles and Colors
         fillStyle
        strokeStyle




           orange
          #FFA500
     rgb( 255, 165, 0 )
   rgba( 255, 165, 0, 1 )
Gradients

// Start point and stop point
// Controls angle/direction of gradient
var fill = context.createLinearGradient( 0, 0, 0, 50 );


// 0 - 1 relative to gradient range
fill.addColorStop( 0, ‘#FFFFFF’ );
fill.addColorStop( 0.5, ‘#FFA500’ );
fill.addColorStop( 1, ‘#FFFFFF’ );

// Apply the fill style
context.fillStyle = fill;
context.fillRect( 0, 0, 50, 50 );
Gradients
// Inner circle point and radius
// Outer circle point and radius
// Not necessarily a single point
var fill = context.createRadialGradient(
    95, 15, 15,
    102, 20, 40
);


// 0 - 1 relative to gradient range
fill.addColorStop( 0, ‘#FFFFFF’ );
fill.addColorStop( 0.5, ‘#FFA500’ );
fill.addColorStop( 1, ‘#FFFFFF’ );

// Apply the fill style
context.fillStyle = fill;
context.fillRect( 0, 0, 50, 50 );
Text and Shadows
var canvas = document.getElementById( 'canvas' );
var ctx = null;

if( canvas.getContext )
{
    ctx = canvas.getContext( '2d' );

    ctx.shadowOffsetX = 2;
    ctx.shadowOffsetY = 2;
    ctx.shadowBlur = 2;
    ctx.shadowColor = 'rgba( 0, 0, 0, 0.5 )';

    ctx.font = '20px Times New Roman';
    ctx.fillStyle = 'black';
    ctx.fillText( 'Sample String', 5, 30 );
}
Shapes
Exploring Canvas
Follow the Mouse
$( '#canvas' ).mousedown( function( evt ) {
  var coord = coordinate( evt, this );

  context.strokeStyle = color();
  context.moveTo( coord.x, coord.y );
  context.beginPath();

  $( '#canvas' ).mousemove( function( evt ) {
    var coord = coordinate( evt, this );

     context.lineTo( coord.x, coord.y );
     context.stroke();
  } ).mouseup( function( evt ) {
     $( '#canvas' ).unbind( 'mousemove' );
     $( '#canvas' ).unbind( 'mouseup' );
  } );
} );
Follow the Mouse
Follow the Finger
$( '#canvas' ).bind( ‘touchstart’, function( evt ) {
  evt.preventDefault();
  fill = color();

  $( '#canvas' ).bind( ‘touchmove’, function( evt ) {
    var touch = evt.originalEvent.touches[0];

     evt.preventDefault();
     context.fillStyle = radial(
       context, touch.clientX, touch.clientY );
     context.strokeStyle = 'rgba( 0, 255, 0, 0 )';
     context.beginPath();
     context.arc(
       touch.clientX, touch.clientY, 40, 0, Math.PI * 2, true );
     context.stroke();
     context.fill();
  } ).bind( ‘touchend’, function( evt ) {
     $( '#canvas' ).unbind( 'touchmove' );
     $( '#canvas' ).unbind( 'touchend' );
  } );
} );
Follow the Finger
Follow the Finger
Line Interpolation
Line Interpolation
var   xabs = Math.abs(   point1.x - point2.x );
var   yabs = Math.abs(   point1.y - point2.y );
var   xdiff = point2.x   - point1.x;
var   ydiff = point2.y   - point1.y;

var length = Math.sqrt( (
  Math.pow( xabs, 2 ) + Math.pow( yabs, 2 ) ) );
var steps = length / distance;
var xstep = xdiff / steps;
var ystep = ydiff / steps;

var newx, newy = 0;
var result = new Array();

for( var s = 0; s < steps; s++ ) {
  newx = point1.x + ( xstep * s );
  newy = point1.y + ( ystep * s );

    result.push( {x: newx, y: newy} );
}
Line Interpolation
Line Interpolation
Exploring Canvas
PlotKit
MochiKit.DOM.addLoadEvent( function() {
  var canvas = MochiKit.DOM.getElement( 'chart' );
  var layout = new PlotKit.Layout( 'bar', {} );
  var plotter = new PlotKit.SweetCanvasRenderer(
    canvas,
    layout, {
    padding: {
       left: 40,
       right: 25,
       top: 25,
       bottom: 30
    },
  } );

  layout.addDataset( 'sqrt', [
     [0, 0], [1, 1], [2, 1.414], [3, 1.73], [4, 2]
  ] );
  layout.evaluate();
  plotter.render();
} );
PlotKit
RGraph
$( document ).ready( function() {
  var bar = null;
  var data = [
    280, 45, 133, 166, 84,
    259, 266, 960, 219, 311];

  bar = new RGraph.Bar( 'chart', data );
  bar.Set( 'chart.labels', [
     'Richard', 'Alex', 'Nick', 'Scott', 'Kjnell',
     'Doug', 'Charles', 'Michelle', 'Mark', 'Alison'
  ] );
  bar.Set( 'chart.gutter.left', 45 );
  bar.Set( 'chart.background.barcolor1',
     'rgba( 255, 255, 255, 1 )' );
  bar.Set( 'chart.background.barcolor2',
     'rgba( 255, 255, 255, 1 )' );
  bar.Set( 'chart.background.grid', true );
  bar.Set( 'chart.colors', ['rgba( 255, 0, 0, 1 )'] );
  bar.Draw();
} );
RGraph
jqPlot
var bar = null;
var data = new Array();
var value = null;

$.jqplot.config.enablePlugins = true;

$.jqplot( 'chart', [data], {
  legend: {show: true, location: 'nw'},
  title: 'Bar Chart',
  series: [
     {label: 'Random Numbers', renderer: $.jqplot.BarRenderer}
  ],
  axes: {
     xaxis: {renderer: $.jqplot.CategoryAxisRenderer},
     yaxis: {min: 0}
  }
} );
jqPlot
Real-Time

setInterval( function() {
  data.splice( 0, 1 );
  data.push( Math.floor( Math.random() * 25 ) );

  RGraph.Clear( canvas );
  bar.data = data;
  bar.Draw();
}, 500 );
Real-Time
Real-Time
Roll Your Own
Exploring Canvas
Load From Server
var canvas = document.getElementById( 'canvas' );
var ctx = canvas.getContext( '2d' );
var img = null;

$( '#make' ).click( function( evt ) {
     img = new Image();
     img.onload = function() {
         ctx.drawImage( img, 0, 0 );
     };
     img.src = 'images/backdrop.png';
} );
Other Canvas
var canvas = document.getElementById( 'lines' );
var ctx = canvas.getContext( '2d' );

ctx.beginPath();
ctx.moveTo( 30, 96 );
ctx.lineTo( 70, 66 );
ctx.lineTo( 103, 76 );
ctx.lineTo( 170, 15 );
ctx.stroke();

canvas = document.getElementById( 'canvas' );
ctx = canvas.getContext( '2d' );

$( '#lines' ).click( function( evt ) {
     ctx.drawImage( this, 0, 0 );
} );
Embedded Data

var canvas = document.getElementById( 'canvas' );
var ctx = canvas.getContext( '2d' );
var img = null;

$( '#embed' ).click( function( evt ) {
     img = new Image();
     img.src = 'data:image/png;base64,iVB...';
     ctx.drawImage( img, 0, 0 );
} );
Pixel Pushing

        context.drawImage(
            myImg,
            frame.x,
            frame.y,
            frame.width,
            frame.height );
Pixel Slicing
        context.drawImage(
            myImg,
            frame.x,
            frame.y,
            frame.width,
            frame.height,
            22,
            21,
            frame.width,
            frame.height );
Pixel Dissecting
pixels = context.getImageData(
  0,
  0,
  640,
  480 );

for( var p = 0; p < pixels.data.length; p += 4 )
{
  red = pixels.data[p + 0];
  green = pixels.data[p + 1];
  blue = pixels.data[p + 2];
}
Pixel Dissecting
Beyond Pixels

var reader = new FileReader();

reader.onload = function( evt ) {
  var exif = new ExifInfo( evt.target.result );

     $( '<img src="data:image/jpeg;base64,' +
       btoa( exif.thumbnail ) +
       '"/>' )
       .appendTo( '#output' );
};

reader.readAsBinaryString( this.files[0] );
Beyond Pixels
Exploring Canvas
Update on Interval
setInterval( function() {
  var time = new Date();

  context.clearRect( 0, 0, 300, 300 );

  context.rotate( ( ( 2 * Math.PI ) / 60 ) *
    time.getSeconds() +
    ( ( 2 * Math.PI ) / 60000 ) *
    time.getMilliseconds() );
  context.translate( 105, 0 );
  context.fillRect( 0, -12, 50, 24 );
  context.drawImage( earth, -12, -12 );
}, 100 );
Update on Interval
Tweening
JSTweener.addTween( position, {
     time: 3,
     transition: 'easeOutExpo',
     x: end.x,
     y: end.y,
     onUpdate: function() {
         context.clearRect( 0, 0, 640, 480 );
         // Draw updates to sprites
     },
     onComplete: function() {
         position = null;
         start = null;
         end = null;
     }
} );
Exploring Canvas
Tracking Points




    What’s clickable?
   How do you know?
   Canvas vs DOM...
Easel JS
var canvas = document.getElementById( 'game' );

stage = new Stage( canvas );

hole = new Bitmap( document.images[0] );
hole.x = 380;
hole.y = 120;
stage.addChild( hole );

ball = new Bitmap( document.images[1] );
ball.x = 20;
ball.y = 129;
stage.addChild( ball );

stage.update();

Ticker.setFPS( 24 );
Ticker.addListener( this );
Easel JS
Got Questions?

     Kevin Hoyt
     khoyt@adobe.com
     Twitter: @krhoyt
     AIM,YIM: parkerkrhoyt
     http://blog.kevinhoyt.com

More Related Content

KEY
Exploring Canvas
PPTX
Making Games in JavaScript
KEY
ARTDM 170, Week 13: Text Elements + Arrays
PPTX
How to make a video game
KEY
Proga 0706
PDF
How to build a html5 websites.v1
KEY
Proga 090525
Exploring Canvas
Making Games in JavaScript
ARTDM 170, Week 13: Text Elements + Arrays
How to make a video game
Proga 0706
How to build a html5 websites.v1
Proga 090525

What's hot (20)

PDF
Intro to HTML5 Canvas
PDF
Swift, via "swift-2048"
PPTX
Drawing with the HTML5 Canvas
PPTX
Introduction to HTML5 Canvas
PDF
Html5 canvas
PPTX
My favorite slides
PDF
Exploring fractals in CSS, @fronttrends, Warsaw, 2015
PPT
Supstat nyc subway
PPT
HTML5 Canvas
PDF
CDAT - graphics - vcs - xmgrace - Introduction
PDF
Having fun with graphs, a short introduction to D3.js
PDF
In a galaxy far, far away - A procedural generation tale
PPTX
[3] 프로세싱과 아두이노
DOC
Graphical representation of Stack
PDF
Myraytracer
PPTX
Fact, Fiction, and FP
PPTX
Ricky Bobby's World
PPTX
Css grid-layout
PPTX
Super Advanced Python –act1
PDF
The Ring programming language version 1.8 book - Part 65 of 202
Intro to HTML5 Canvas
Swift, via "swift-2048"
Drawing with the HTML5 Canvas
Introduction to HTML5 Canvas
Html5 canvas
My favorite slides
Exploring fractals in CSS, @fronttrends, Warsaw, 2015
Supstat nyc subway
HTML5 Canvas
CDAT - graphics - vcs - xmgrace - Introduction
Having fun with graphs, a short introduction to D3.js
In a galaxy far, far away - A procedural generation tale
[3] 프로세싱과 아두이노
Graphical representation of Stack
Myraytracer
Fact, Fiction, and FP
Ricky Bobby's World
Css grid-layout
Super Advanced Python –act1
The Ring programming language version 1.8 book - Part 65 of 202
Ad

Viewers also liked (12)

PPT
Wizard of Oz
PDF
Images of the Wizard of Oz
PPT
Wizard Of Oz Yr6c
PPT
Wizard Of Oz: Part I
PPT
The Wizard of Oz model of the outstanding teacher
PDF
The Contextual Wizard of Oz
PPTX
The Yellow Brick Road of Leadership - Lessons from the Wizard of Oz
PPT
The rich symbolism of the Wizard of Oz
PPTX
The wizard of oz
PPTX
The wizard of oz
Wizard of Oz
Images of the Wizard of Oz
Wizard Of Oz Yr6c
Wizard Of Oz: Part I
The Wizard of Oz model of the outstanding teacher
The Contextual Wizard of Oz
The Yellow Brick Road of Leadership - Lessons from the Wizard of Oz
The rich symbolism of the Wizard of Oz
The wizard of oz
The wizard of oz
Ad

Similar to Exploring Canvas (20)

PPTX
Css5 canvas
PDF
Create a java project that - Draw a circle with three random init.pdf
PDF
I need to create a page looks like a picture. But it looks different.pdf
PDF
Drawing on canvas
PDF
Canvas - The Cure
PPTX
Canvas al ajillo
PDF
package chapter15;import javafx.application.Application;import j.pdf
KEY
The Canvas API for Rubyists
PPTX
HTML5 Canvas (Wall Clock).pptx
PDF
ECMAScript 6 major changes
PPTX
Paperjs presentation
PDF
SVGo workshop
PDF
I need to create a page that looks like the picture The pro.pdf
PDF
You will learn RxJS in 2017
PPTX
Game dev 101 part 3
PPTX
Raspberry Pi à la GroovyFX
ODP
Creating masterpieces with raphael
PDF
Writing a Space Shooter with HTML5 Canvas
PDF
Bindings: the zen of montage
PDF
05 Geographic scripting in uDig - halfway between user and developer
Css5 canvas
Create a java project that - Draw a circle with three random init.pdf
I need to create a page looks like a picture. But it looks different.pdf
Drawing on canvas
Canvas - The Cure
Canvas al ajillo
package chapter15;import javafx.application.Application;import j.pdf
The Canvas API for Rubyists
HTML5 Canvas (Wall Clock).pptx
ECMAScript 6 major changes
Paperjs presentation
SVGo workshop
I need to create a page that looks like the picture The pro.pdf
You will learn RxJS in 2017
Game dev 101 part 3
Raspberry Pi à la GroovyFX
Creating masterpieces with raphael
Writing a Space Shooter with HTML5 Canvas
Bindings: the zen of montage
05 Geographic scripting in uDig - halfway between user and developer

Recently uploaded (20)

PPTX
Cloud computing and distributed systems.
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PDF
Electronic commerce courselecture one. Pdf
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
PDF
Machine learning based COVID-19 study performance prediction
PDF
cuic standard and advanced reporting.pdf
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
The Rise and Fall of 3GPP – Time for a Sabbatical?
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Review of recent advances in non-invasive hemoglobin estimation
Cloud computing and distributed systems.
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Electronic commerce courselecture one. Pdf
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Network Security Unit 5.pdf for BCA BBA.
Profit Center Accounting in SAP S/4HANA, S4F28 Col11
Machine learning based COVID-19 study performance prediction
cuic standard and advanced reporting.pdf
MYSQL Presentation for SQL database connectivity
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Advanced methodologies resolving dimensionality complications for autism neur...
Per capita expenditure prediction using model stacking based on satellite ima...
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
MIND Revenue Release Quarter 2 2025 Press Release
Digital-Transformation-Roadmap-for-Companies.pptx
“AI and Expert System Decision Support & Business Intelligence Systems”
The Rise and Fall of 3GPP – Time for a Sabbatical?
Programs and apps: productivity, graphics, security and other tools
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Review of recent advances in non-invasive hemoglobin estimation

Exploring Canvas

  • 2. Agenda • Getting started • Drawing • Charting • Images • Interaction • Animation
  • 4. Using the Canvas Tag <canvas id="chart" width="150" height="150"> Current stock price: $3.15 +0.15 </canvas> <canvas id="clock" width="150" height="150"> <img src="imagesclock.png" width="150" height="150"/> </canvas>
  • 5. Rendering Context var canvas = document.getElementById( 'canvas' ); var context = null; if( canvas.getContext ) { context = canvas.getContext( '2d' ); // Drawing code here } else { // Unsupported code here }
  • 6. Coordinate Space 0 0 X y x height width Y
  • 7. Drawing Paths context.beginPath(); context.arc( 75, 75, 50, 0, Math.PI * 2, true ); context.moveTo( 110, 75 ); context.arc( 75, 75, 35, 0, Math.PI, false ); context.moveTo( 65, 65 ); context.arc( 60, 65, 5, 0, Math.PI * 2, true ); context.moveTo( 95, 65 ); context.arc( 90, 65, 5, 0, Math.PI * 2, true ); // context.closePath(); context.stroke(); // context.fill();
  • 8. Understanding Lines (0, 0) (0, 0) (3, 1) (3.5, 1) (3, 5) (3.5, 5) 1.0 width 1.0 width
  • 9. Caps, Joints and Miters butt round width / 2 round bevel x limit square miter from joint
  • 10. Curves Quadratic Curve Cubic Curve
  • 11. Styles and Colors fillStyle strokeStyle orange #FFA500 rgb( 255, 165, 0 ) rgba( 255, 165, 0, 1 )
  • 12. Gradients // Start point and stop point // Controls angle/direction of gradient var fill = context.createLinearGradient( 0, 0, 0, 50 ); // 0 - 1 relative to gradient range fill.addColorStop( 0, ‘#FFFFFF’ ); fill.addColorStop( 0.5, ‘#FFA500’ ); fill.addColorStop( 1, ‘#FFFFFF’ ); // Apply the fill style context.fillStyle = fill; context.fillRect( 0, 0, 50, 50 );
  • 13. Gradients // Inner circle point and radius // Outer circle point and radius // Not necessarily a single point var fill = context.createRadialGradient( 95, 15, 15, 102, 20, 40 ); // 0 - 1 relative to gradient range fill.addColorStop( 0, ‘#FFFFFF’ ); fill.addColorStop( 0.5, ‘#FFA500’ ); fill.addColorStop( 1, ‘#FFFFFF’ ); // Apply the fill style context.fillStyle = fill; context.fillRect( 0, 0, 50, 50 );
  • 14. Text and Shadows var canvas = document.getElementById( 'canvas' ); var ctx = null; if( canvas.getContext ) { ctx = canvas.getContext( '2d' ); ctx.shadowOffsetX = 2; ctx.shadowOffsetY = 2; ctx.shadowBlur = 2; ctx.shadowColor = 'rgba( 0, 0, 0, 0.5 )'; ctx.font = '20px Times New Roman'; ctx.fillStyle = 'black'; ctx.fillText( 'Sample String', 5, 30 ); }
  • 17. Follow the Mouse $( '#canvas' ).mousedown( function( evt ) { var coord = coordinate( evt, this ); context.strokeStyle = color(); context.moveTo( coord.x, coord.y ); context.beginPath(); $( '#canvas' ).mousemove( function( evt ) { var coord = coordinate( evt, this ); context.lineTo( coord.x, coord.y ); context.stroke(); } ).mouseup( function( evt ) { $( '#canvas' ).unbind( 'mousemove' ); $( '#canvas' ).unbind( 'mouseup' ); } ); } );
  • 19. Follow the Finger $( '#canvas' ).bind( ‘touchstart’, function( evt ) { evt.preventDefault(); fill = color(); $( '#canvas' ).bind( ‘touchmove’, function( evt ) { var touch = evt.originalEvent.touches[0]; evt.preventDefault(); context.fillStyle = radial( context, touch.clientX, touch.clientY ); context.strokeStyle = 'rgba( 0, 255, 0, 0 )'; context.beginPath(); context.arc( touch.clientX, touch.clientY, 40, 0, Math.PI * 2, true ); context.stroke(); context.fill(); } ).bind( ‘touchend’, function( evt ) { $( '#canvas' ).unbind( 'touchmove' ); $( '#canvas' ).unbind( 'touchend' ); } ); } );
  • 23. Line Interpolation var xabs = Math.abs( point1.x - point2.x ); var yabs = Math.abs( point1.y - point2.y ); var xdiff = point2.x - point1.x; var ydiff = point2.y - point1.y; var length = Math.sqrt( ( Math.pow( xabs, 2 ) + Math.pow( yabs, 2 ) ) ); var steps = length / distance; var xstep = xdiff / steps; var ystep = ydiff / steps; var newx, newy = 0; var result = new Array(); for( var s = 0; s < steps; s++ ) { newx = point1.x + ( xstep * s ); newy = point1.y + ( ystep * s ); result.push( {x: newx, y: newy} ); }
  • 27. PlotKit MochiKit.DOM.addLoadEvent( function() { var canvas = MochiKit.DOM.getElement( 'chart' ); var layout = new PlotKit.Layout( 'bar', {} ); var plotter = new PlotKit.SweetCanvasRenderer( canvas, layout, { padding: { left: 40, right: 25, top: 25, bottom: 30 }, } ); layout.addDataset( 'sqrt', [ [0, 0], [1, 1], [2, 1.414], [3, 1.73], [4, 2] ] ); layout.evaluate(); plotter.render(); } );
  • 29. RGraph $( document ).ready( function() { var bar = null; var data = [ 280, 45, 133, 166, 84, 259, 266, 960, 219, 311]; bar = new RGraph.Bar( 'chart', data ); bar.Set( 'chart.labels', [ 'Richard', 'Alex', 'Nick', 'Scott', 'Kjnell', 'Doug', 'Charles', 'Michelle', 'Mark', 'Alison' ] ); bar.Set( 'chart.gutter.left', 45 ); bar.Set( 'chart.background.barcolor1', 'rgba( 255, 255, 255, 1 )' ); bar.Set( 'chart.background.barcolor2', 'rgba( 255, 255, 255, 1 )' ); bar.Set( 'chart.background.grid', true ); bar.Set( 'chart.colors', ['rgba( 255, 0, 0, 1 )'] ); bar.Draw(); } );
  • 31. jqPlot var bar = null; var data = new Array(); var value = null; $.jqplot.config.enablePlugins = true; $.jqplot( 'chart', [data], { legend: {show: true, location: 'nw'}, title: 'Bar Chart', series: [ {label: 'Random Numbers', renderer: $.jqplot.BarRenderer} ], axes: { xaxis: {renderer: $.jqplot.CategoryAxisRenderer}, yaxis: {min: 0} } } );
  • 33. Real-Time setInterval( function() { data.splice( 0, 1 ); data.push( Math.floor( Math.random() * 25 ) ); RGraph.Clear( canvas ); bar.data = data; bar.Draw(); }, 500 );
  • 38. Load From Server var canvas = document.getElementById( 'canvas' ); var ctx = canvas.getContext( '2d' ); var img = null; $( '#make' ).click( function( evt ) { img = new Image(); img.onload = function() { ctx.drawImage( img, 0, 0 ); }; img.src = 'images/backdrop.png'; } );
  • 39. Other Canvas var canvas = document.getElementById( 'lines' ); var ctx = canvas.getContext( '2d' ); ctx.beginPath(); ctx.moveTo( 30, 96 ); ctx.lineTo( 70, 66 ); ctx.lineTo( 103, 76 ); ctx.lineTo( 170, 15 ); ctx.stroke(); canvas = document.getElementById( 'canvas' ); ctx = canvas.getContext( '2d' ); $( '#lines' ).click( function( evt ) { ctx.drawImage( this, 0, 0 ); } );
  • 40. Embedded Data var canvas = document.getElementById( 'canvas' ); var ctx = canvas.getContext( '2d' ); var img = null; $( '#embed' ).click( function( evt ) { img = new Image(); img.src = 'data:image/png;base64,iVB...'; ctx.drawImage( img, 0, 0 ); } );
  • 41. Pixel Pushing context.drawImage( myImg, frame.x, frame.y, frame.width, frame.height );
  • 42. Pixel Slicing context.drawImage( myImg, frame.x, frame.y, frame.width, frame.height, 22, 21, frame.width, frame.height );
  • 43. Pixel Dissecting pixels = context.getImageData( 0, 0, 640, 480 ); for( var p = 0; p < pixels.data.length; p += 4 ) { red = pixels.data[p + 0]; green = pixels.data[p + 1]; blue = pixels.data[p + 2]; }
  • 45. Beyond Pixels var reader = new FileReader(); reader.onload = function( evt ) { var exif = new ExifInfo( evt.target.result ); $( '<img src="data:image/jpeg;base64,' + btoa( exif.thumbnail ) + '"/>' ) .appendTo( '#output' ); }; reader.readAsBinaryString( this.files[0] );
  • 48. Update on Interval setInterval( function() { var time = new Date(); context.clearRect( 0, 0, 300, 300 ); context.rotate( ( ( 2 * Math.PI ) / 60 ) * time.getSeconds() + ( ( 2 * Math.PI ) / 60000 ) * time.getMilliseconds() ); context.translate( 105, 0 ); context.fillRect( 0, -12, 50, 24 ); context.drawImage( earth, -12, -12 ); }, 100 );
  • 50. Tweening JSTweener.addTween( position, { time: 3, transition: 'easeOutExpo', x: end.x, y: end.y, onUpdate: function() { context.clearRect( 0, 0, 640, 480 ); // Draw updates to sprites }, onComplete: function() { position = null; start = null; end = null; } } );
  • 52. Tracking Points What’s clickable? How do you know? Canvas vs DOM...
  • 53. Easel JS var canvas = document.getElementById( 'game' ); stage = new Stage( canvas ); hole = new Bitmap( document.images[0] ); hole.x = 380; hole.y = 120; stage.addChild( hole ); ball = new Bitmap( document.images[1] ); ball.x = 20; ball.y = 129; stage.addChild( ball ); stage.update(); Ticker.setFPS( 24 ); Ticker.addListener( this );
  • 55. Got Questions? Kevin Hoyt khoyt@adobe.com Twitter: @krhoyt AIM,YIM: parkerkrhoyt http://blog.kevinhoyt.com