<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="et">
	<id>http://www.lambda.ee/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Roger</id>
	<title>Lambda - Kasutaja kaastöö [et]</title>
	<link rel="self" type="application/atom+xml" href="http://www.lambda.ee/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Roger"/>
	<link rel="alternate" type="text/html" href="http://www.lambda.ee/wiki/Eri:Kaast%C3%B6%C3%B6/Roger"/>
	<updated>2026-10-28T10:58:30Z</updated>
	<subtitle>Kasutaja kaastöö</subtitle>
	<generator>MediaWiki 1.43.11</generator>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11509</id>
		<title>UI:Offline mobiiliapp</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11509"/>
		<updated>2014-03-31T17:42:39Z</updated>

		<summary type="html">&lt;p&gt;Roger: /* Ülesanne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UI}}&lt;br /&gt;
&lt;br /&gt;
== Ülesanne ==&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Drawing-app.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NB! Enamus ülesandest saab teha Chromega desktopis. Mobiili on vaja vaid Take picture koha jaoks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ülesande mõte on, et oleks offline rakendus, milles saab joonistada ja pintsli värvi valida. Kui vajutad pildi tegemise ülesselaadimise nupule, siis canvase pilt asendatakse selle fotoga ([http://jsfiddle.net/sangdol/RsxtG/49/ link]) ja nüüd saab selle peale joonistada. Joonistamine peab töötama nii hiire kui sõrmega. Kasutada [http://www.polymer-project.org/platform/pointer-events.html &#039;pointer-evente&#039;].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
All peaks saama lisada kuupäeva, mis töötab ilma javascriptita. Selle peale võib failinimele (mida pärast saab downloadida) lisada kuupäeva javascriptiga.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lehe lõpus paikneb Download nupp, mille href attribuut on base64 kodeeringus pilt, mis on üleval joonistatud. Download attribuudiga võiks anda fail normaalse nime, mis sisaldab sõna &amp;quot;image_&amp;quot; +  geokoordinaate + kuupäeva.  Näiteks &amp;lt;a id=“downloadLink” download=“image_56.64645_23.545454_01.02.2003.png” href=“data:image/….”&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joonistusosa koodinäide ==&lt;br /&gt;
&lt;br /&gt;
Näitekoodi on vaja kindlasti kohandada. Tore oleks ka mitme sõrme tugi, kuid pole kohustuslik (sellele aitab kaasa pointer-eventide attribuut &#039;pointerId&#039;.)&lt;br /&gt;
&lt;br /&gt;
    // shim layer with setTimeout fallback&lt;br /&gt;
    window.requestAnimFrame = (function () {&lt;br /&gt;
        return window.requestAnimationFrame ||&lt;br /&gt;
            window.webkitRequestAnimationFrame ||&lt;br /&gt;
            function (callback) {&lt;br /&gt;
                window.setTimeout(callback, 1000 / 60);&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
    window.addEventListener(&#039;load&#039;, init);&lt;br /&gt;
    var canvas = null;&lt;br /&gt;
    var ctx = null;&lt;br /&gt;
    // currently active stroke&lt;br /&gt;
    var stroke = null;&lt;br /&gt;
    function init() {&lt;br /&gt;
        canvas = document.querySelector(&#039;canvas&#039;);&lt;br /&gt;
        ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
        // Set the default line style.&lt;br /&gt;
        ctx.lineWidth = 3;&lt;br /&gt;
        ctx.lineCap = &amp;quot;round&amp;quot;;&lt;br /&gt;
        ctx.fillStyle = &amp;quot;cyan&amp;quot;;&lt;br /&gt;
        ctx.fillRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
        ctx.strokeStyle = &amp;quot;black&amp;quot;;&lt;br /&gt;
        canvas.addEventListener(&#039;mousedown&#039;, onMouseDown);&lt;br /&gt;
        canvas.addEventListener(&#039;mousemove&#039;, onMouseMove);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseup&#039;, onMouseUp);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseleave&#039;, onMouseUp);&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseDown(event) {&lt;br /&gt;
        stroke = new Stroke(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseMove(event) {&lt;br /&gt;
        // Are we currently drawing this pointer?&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.addPoint(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseUp(event) {&lt;br /&gt;
        stroke = null;&lt;br /&gt;
    }&lt;br /&gt;
    function drawPointers() {&lt;br /&gt;
        // If we have an active stroke, draw any undrawn segments.&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.draw();&lt;br /&gt;
        }&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    }&lt;br /&gt;
    function Point(x, y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
    }&lt;br /&gt;
    function Stroke(x, y) {&lt;br /&gt;
        this.points = [new Point(x, y)];&lt;br /&gt;
    }&lt;br /&gt;
    Stroke.prototype.addPoint = function (x, y) {&lt;br /&gt;
        this.points.push(new Point(x, y));&lt;br /&gt;
    }&lt;br /&gt;
    Stroke.prototype.draw = function () {&lt;br /&gt;
        if (this.points.length &amp;lt; 2) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo(this.points[0].x, this.points[0].y);&lt;br /&gt;
        for (var i = 1; i &amp;lt; this.points.length; i++) {&lt;br /&gt;
            ctx.lineTo(this.points[i].x, this.points[i].y);&lt;br /&gt;
        }&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.closePath();&lt;br /&gt;
        this.points = this.points.slice(-1);&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11508</id>
		<title>UI:Offline mobiiliapp</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11508"/>
		<updated>2014-03-31T17:10:42Z</updated>

		<summary type="html">&lt;p&gt;Roger: /* Joonistusosa koodinäide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UI}}&lt;br /&gt;
&lt;br /&gt;
== Ülesanne ==&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Drawing-app.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NB! Enamus ülesandest saab teha Chromega desktopis. Mobiili on vaja vaid Take picture koha jaoks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ülesande mõte on, et oleks offline rakendus, milles saab joonistada ja pintsli värvi valida. Kui vajutad pildi tegemise ülesselaadimise nupule, siis canvase pilt asendatakse selle fotoga ja nüüd saab selle peale joonistada. Joonistamine peab töötama nii hiire kui sõrmega. Kasutada [http://www.polymer-project.org/platform/pointer-events.html &#039;pointer-evente&#039;].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
All peaks saama lisada kuupäeva, mis töötab ilma javascriptita. Selle peale võib failinimele (mida pärast saab downloadida) lisada kuupäeva javascriptiga.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lehe lõpus paikneb Download nupp, mille href attribuut on base64 kodeeringus pilt, mis on üleval joonistatud. Download attribuudiga võiks anda fail normaalse nime, mis sisaldab sõna &amp;quot;image_&amp;quot; +  geokoordinaate + kuupäeva.  Näiteks &amp;lt;a id=“downloadLink” download=“image_56.64645_23.545454_01.02.2003.png” href=“data:image/….”&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joonistusosa koodinäide ==&lt;br /&gt;
&lt;br /&gt;
Näitekoodi on vaja kindlasti kohandada. Tore oleks ka mitme sõrme tugi, kuid pole kohustuslik (sellele aitab kaasa pointer-eventide attribuut &#039;pointerId&#039;.)&lt;br /&gt;
&lt;br /&gt;
    // shim layer with setTimeout fallback&lt;br /&gt;
    window.requestAnimFrame = (function () {&lt;br /&gt;
        return window.requestAnimationFrame ||&lt;br /&gt;
            window.webkitRequestAnimationFrame ||&lt;br /&gt;
            function (callback) {&lt;br /&gt;
                window.setTimeout(callback, 1000 / 60);&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
    window.addEventListener(&#039;load&#039;, init);&lt;br /&gt;
    var canvas = null;&lt;br /&gt;
    var ctx = null;&lt;br /&gt;
    // currently active stroke&lt;br /&gt;
    var stroke = null;&lt;br /&gt;
    function init() {&lt;br /&gt;
        canvas = document.querySelector(&#039;canvas&#039;);&lt;br /&gt;
        ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
        // Set the default line style.&lt;br /&gt;
        ctx.lineWidth = 3;&lt;br /&gt;
        ctx.lineCap = &amp;quot;round&amp;quot;;&lt;br /&gt;
        ctx.fillStyle = &amp;quot;cyan&amp;quot;;&lt;br /&gt;
        ctx.fillRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
        ctx.strokeStyle = &amp;quot;black&amp;quot;;&lt;br /&gt;
        canvas.addEventListener(&#039;mousedown&#039;, onMouseDown);&lt;br /&gt;
        canvas.addEventListener(&#039;mousemove&#039;, onMouseMove);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseup&#039;, onMouseUp);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseleave&#039;, onMouseUp);&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseDown(event) {&lt;br /&gt;
        stroke = new Stroke(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseMove(event) {&lt;br /&gt;
        // Are we currently drawing this pointer?&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.addPoint(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseUp(event) {&lt;br /&gt;
        stroke = null;&lt;br /&gt;
    }&lt;br /&gt;
    function drawPointers() {&lt;br /&gt;
        // If we have an active stroke, draw any undrawn segments.&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.draw();&lt;br /&gt;
        }&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    }&lt;br /&gt;
    function Point(x, y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
    }&lt;br /&gt;
    function Stroke(x, y) {&lt;br /&gt;
        this.points = [new Point(x, y)];&lt;br /&gt;
    }&lt;br /&gt;
    Stroke.prototype.addPoint = function (x, y) {&lt;br /&gt;
        this.points.push(new Point(x, y));&lt;br /&gt;
    }&lt;br /&gt;
    Stroke.prototype.draw = function () {&lt;br /&gt;
        if (this.points.length &amp;lt; 2) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo(this.points[0].x, this.points[0].y);&lt;br /&gt;
        for (var i = 1; i &amp;lt; this.points.length; i++) {&lt;br /&gt;
            ctx.lineTo(this.points[i].x, this.points[i].y);&lt;br /&gt;
        }&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.closePath();&lt;br /&gt;
        this.points = this.points.slice(-1);&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11507</id>
		<title>UI:Offline mobiiliapp</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11507"/>
		<updated>2014-03-31T17:08:58Z</updated>

		<summary type="html">&lt;p&gt;Roger: /* Joonistusosa koodinäide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UI}}&lt;br /&gt;
&lt;br /&gt;
== Ülesanne ==&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Drawing-app.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NB! Enamus ülesandest saab teha Chromega desktopis. Mobiili on vaja vaid Take picture koha jaoks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ülesande mõte on, et oleks offline rakendus, milles saab joonistada ja pintsli värvi valida. Kui vajutad pildi tegemise ülesselaadimise nupule, siis canvase pilt asendatakse selle fotoga ja nüüd saab selle peale joonistada. Joonistamine peab töötama nii hiire kui sõrmega. Kasutada [http://www.polymer-project.org/platform/pointer-events.html &#039;pointer-evente&#039;].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
All peaks saama lisada kuupäeva, mis töötab ilma javascriptita. Selle peale võib failinimele (mida pärast saab downloadida) lisada kuupäeva javascriptiga.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lehe lõpus paikneb Download nupp, mille href attribuut on base64 kodeeringus pilt, mis on üleval joonistatud. Download attribuudiga võiks anda fail normaalse nime, mis sisaldab sõna &amp;quot;image_&amp;quot; +  geokoordinaate + kuupäeva.  Näiteks &amp;lt;a id=“downloadLink” download=“image_56.64645_23.545454_01.02.2003.png” href=“data:image/….”&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joonistusosa koodinäide ==&lt;br /&gt;
&lt;br /&gt;
Näitekoodi on vaja kindlasti kohandada.&lt;br /&gt;
&lt;br /&gt;
    // shim layer with setTimeout fallback&lt;br /&gt;
    window.requestAnimFrame = (function () {&lt;br /&gt;
        return window.requestAnimationFrame ||&lt;br /&gt;
            window.webkitRequestAnimationFrame ||&lt;br /&gt;
            function (callback) {&lt;br /&gt;
                window.setTimeout(callback, 1000 / 60);&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
    window.addEventListener(&#039;load&#039;, init);&lt;br /&gt;
    var canvas = null;&lt;br /&gt;
    var ctx = null;&lt;br /&gt;
    // currently active stroke&lt;br /&gt;
    var stroke = null;&lt;br /&gt;
    function init() {&lt;br /&gt;
        canvas = document.querySelector(&#039;canvas&#039;);&lt;br /&gt;
        ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
        // Set the default line style.&lt;br /&gt;
        ctx.lineWidth = 3;&lt;br /&gt;
        ctx.lineCap = &amp;quot;round&amp;quot;;&lt;br /&gt;
        ctx.fillStyle = &amp;quot;cyan&amp;quot;;&lt;br /&gt;
        ctx.fillRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
        ctx.strokeStyle = &amp;quot;black&amp;quot;;&lt;br /&gt;
        canvas.addEventListener(&#039;mousedown&#039;, onMouseDown);&lt;br /&gt;
        canvas.addEventListener(&#039;mousemove&#039;, onMouseMove);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseup&#039;, onMouseUp);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseleave&#039;, onMouseUp);&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseDown(event) {&lt;br /&gt;
        stroke = new Stroke(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseMove(event) {&lt;br /&gt;
        // Are we currently drawing this pointer?&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.addPoint(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseUp(event) {&lt;br /&gt;
        stroke = null;&lt;br /&gt;
    }&lt;br /&gt;
    function drawPointers() {&lt;br /&gt;
        // If we have an active stroke, draw any undrawn segments.&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.draw();&lt;br /&gt;
        }&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    }&lt;br /&gt;
    function Point(x, y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
    }&lt;br /&gt;
    function Stroke(x, y) {&lt;br /&gt;
        this.points = [new Point(x, y)];&lt;br /&gt;
    }&lt;br /&gt;
    Stroke.prototype.addPoint = function (x, y) {&lt;br /&gt;
        this.points.push(new Point(x, y));&lt;br /&gt;
    }&lt;br /&gt;
    Stroke.prototype.draw = function () {&lt;br /&gt;
        if (this.points.length &amp;lt; 2) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo(this.points[0].x, this.points[0].y);&lt;br /&gt;
        for (var i = 1; i &amp;lt; this.points.length; i++) {&lt;br /&gt;
            ctx.lineTo(this.points[i].x, this.points[i].y);&lt;br /&gt;
        }&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.closePath();&lt;br /&gt;
        this.points = this.points.slice(-1);&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11506</id>
		<title>UI:Offline mobiiliapp</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11506"/>
		<updated>2014-03-31T17:08:44Z</updated>

		<summary type="html">&lt;p&gt;Roger: /* Joonistusosa koodinäide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UI}}&lt;br /&gt;
&lt;br /&gt;
== Ülesanne ==&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Drawing-app.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NB! Enamus ülesandest saab teha Chromega desktopis. Mobiili on vaja vaid Take picture koha jaoks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ülesande mõte on, et oleks offline rakendus, milles saab joonistada ja pintsli värvi valida. Kui vajutad pildi tegemise ülesselaadimise nupule, siis canvase pilt asendatakse selle fotoga ja nüüd saab selle peale joonistada. Joonistamine peab töötama nii hiire kui sõrmega. Kasutada [http://www.polymer-project.org/platform/pointer-events.html &#039;pointer-evente&#039;].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
All peaks saama lisada kuupäeva, mis töötab ilma javascriptita. Selle peale võib failinimele (mida pärast saab downloadida) lisada kuupäeva javascriptiga.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lehe lõpus paikneb Download nupp, mille href attribuut on base64 kodeeringus pilt, mis on üleval joonistatud. Download attribuudiga võiks anda fail normaalse nime, mis sisaldab sõna &amp;quot;image_&amp;quot; +  geokoordinaate + kuupäeva.  Näiteks &amp;lt;a id=“downloadLink” download=“image_56.64645_23.545454_01.02.2003.png” href=“data:image/….”&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joonistusosa koodinäide ==&lt;br /&gt;
&lt;br /&gt;
Näitekoodi on vaja kindlasti kohandada.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    // shim layer with setTimeout fallback&lt;br /&gt;
    window.requestAnimFrame = (function () {&lt;br /&gt;
        return window.requestAnimationFrame ||&lt;br /&gt;
            window.webkitRequestAnimationFrame ||&lt;br /&gt;
            function (callback) {&lt;br /&gt;
                window.setTimeout(callback, 1000 / 60);&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
    window.addEventListener(&#039;load&#039;, init);&lt;br /&gt;
    var canvas = null;&lt;br /&gt;
    var ctx = null;&lt;br /&gt;
    // currently active stroke&lt;br /&gt;
    var stroke = null;&lt;br /&gt;
    function init() {&lt;br /&gt;
        canvas = document.querySelector(&#039;canvas&#039;);&lt;br /&gt;
        ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
        // Set the default line style.&lt;br /&gt;
        ctx.lineWidth = 3;&lt;br /&gt;
        ctx.lineCap = &amp;quot;round&amp;quot;;&lt;br /&gt;
        ctx.fillStyle = &amp;quot;cyan&amp;quot;;&lt;br /&gt;
        ctx.fillRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
        ctx.strokeStyle = &amp;quot;black&amp;quot;;&lt;br /&gt;
        canvas.addEventListener(&#039;mousedown&#039;, onMouseDown);&lt;br /&gt;
        canvas.addEventListener(&#039;mousemove&#039;, onMouseMove);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseup&#039;, onMouseUp);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseleave&#039;, onMouseUp);&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseDown(event) {&lt;br /&gt;
        stroke = new Stroke(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseMove(event) {&lt;br /&gt;
        // Are we currently drawing this pointer?&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.addPoint(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseUp(event) {&lt;br /&gt;
        stroke = null;&lt;br /&gt;
    }&lt;br /&gt;
    function drawPointers() {&lt;br /&gt;
        // If we have an active stroke, draw any undrawn segments.&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.draw();&lt;br /&gt;
        }&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    }&lt;br /&gt;
    function Point(x, y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
    }&lt;br /&gt;
    function Stroke(x, y) {&lt;br /&gt;
        this.points = [new Point(x, y)];&lt;br /&gt;
    }&lt;br /&gt;
    Stroke.prototype.addPoint = function (x, y) {&lt;br /&gt;
        this.points.push(new Point(x, y));&lt;br /&gt;
    }&lt;br /&gt;
    Stroke.prototype.draw = function () {&lt;br /&gt;
        if (this.points.length &amp;lt; 2) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo(this.points[0].x, this.points[0].y);&lt;br /&gt;
        for (var i = 1; i &amp;lt; this.points.length; i++) {&lt;br /&gt;
            ctx.lineTo(this.points[i].x, this.points[i].y);&lt;br /&gt;
        }&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.closePath();&lt;br /&gt;
        this.points = this.points.slice(-1);&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11505</id>
		<title>UI:Offline mobiiliapp</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11505"/>
		<updated>2014-03-31T17:07:35Z</updated>

		<summary type="html">&lt;p&gt;Roger: /* Ülesanne */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UI}}&lt;br /&gt;
&lt;br /&gt;
== Ülesanne ==&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Drawing-app.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
NB! Enamus ülesandest saab teha Chromega desktopis. Mobiili on vaja vaid Take picture koha jaoks.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Ülesande mõte on, et oleks offline rakendus, milles saab joonistada ja pintsli värvi valida. Kui vajutad pildi tegemise ülesselaadimise nupule, siis canvase pilt asendatakse selle fotoga ja nüüd saab selle peale joonistada. Joonistamine peab töötama nii hiire kui sõrmega. Kasutada [http://www.polymer-project.org/platform/pointer-events.html &#039;pointer-evente&#039;].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
All peaks saama lisada kuupäeva, mis töötab ilma javascriptita. Selle peale võib failinimele (mida pärast saab downloadida) lisada kuupäeva javascriptiga.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Lehe lõpus paikneb Download nupp, mille href attribuut on base64 kodeeringus pilt, mis on üleval joonistatud. Download attribuudiga võiks anda fail normaalse nime, mis sisaldab sõna &amp;quot;image_&amp;quot; +  geokoordinaate + kuupäeva.  Näiteks &amp;lt;a id=“downloadLink” download=“image_56.64645_23.545454_01.02.2003.png” href=“data:image/….”&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Joonistusosa koodinäide ==&lt;br /&gt;
&lt;br /&gt;
    // shim layer with setTimeout fallback&lt;br /&gt;
    window.requestAnimFrame = (function () {&lt;br /&gt;
        return window.requestAnimationFrame ||&lt;br /&gt;
            window.webkitRequestAnimationFrame ||&lt;br /&gt;
            function (callback) {&lt;br /&gt;
                window.setTimeout(callback, 1000 / 60);&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
    window.addEventListener(&#039;load&#039;, init);&lt;br /&gt;
    var canvas = null;&lt;br /&gt;
    var ctx = null;&lt;br /&gt;
    // currently active stroke&lt;br /&gt;
    var stroke = null;&lt;br /&gt;
    function init() {&lt;br /&gt;
        canvas = document.querySelector(&#039;canvas&#039;);&lt;br /&gt;
        ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
        // Set the default line style.&lt;br /&gt;
        ctx.lineWidth = 3;&lt;br /&gt;
        ctx.lineCap = &amp;quot;round&amp;quot;;&lt;br /&gt;
        ctx.fillStyle = &amp;quot;cyan&amp;quot;;&lt;br /&gt;
        ctx.fillRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
        ctx.strokeStyle = &amp;quot;black&amp;quot;;&lt;br /&gt;
        canvas.addEventListener(&#039;mousedown&#039;, onMouseDown);&lt;br /&gt;
        canvas.addEventListener(&#039;mousemove&#039;, onMouseMove);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseup&#039;, onMouseUp);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseleave&#039;, onMouseUp);&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseDown(event) {&lt;br /&gt;
        stroke = new Stroke(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseMove(event) {&lt;br /&gt;
        // Are we currently drawing this pointer?&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.addPoint(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseUp(event) {&lt;br /&gt;
        stroke = null;&lt;br /&gt;
    }&lt;br /&gt;
    function drawPointers() {&lt;br /&gt;
        // If we have an active stroke, draw any undrawn segments.&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.draw();&lt;br /&gt;
        }&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    }&lt;br /&gt;
    function Point(x, y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
    }&lt;br /&gt;
    function Stroke(x, y) {&lt;br /&gt;
        this.points = [new Point(x, y)];&lt;br /&gt;
    }&lt;br /&gt;
    Stroke.prototype.addPoint = function (x, y) {&lt;br /&gt;
        this.points.push(new Point(x, y));&lt;br /&gt;
    }&lt;br /&gt;
    Stroke.prototype.draw = function () {&lt;br /&gt;
        if (this.points.length &amp;lt; 2) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo(this.points[0].x, this.points[0].y);&lt;br /&gt;
        for (var i = 1; i &amp;lt; this.points.length; i++) {&lt;br /&gt;
            ctx.lineTo(this.points[i].x, this.points[i].y);&lt;br /&gt;
        }&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.closePath();&lt;br /&gt;
        this.points = this.points.slice(-1);&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11504</id>
		<title>UI:Offline mobiiliapp</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11504"/>
		<updated>2014-03-31T17:04:44Z</updated>

		<summary type="html">&lt;p&gt;Roger: /* Joonistusosa koodinäide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UI}}&lt;br /&gt;
&lt;br /&gt;
== Ülesanne ==&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Drawing-app.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
Ülesande mõte on, et oleks offline rakendus, milles saab joonistada ja pintsli värvi valida. Kui vajutad pildi tegemise ülesselaadimise nupule, siis canvase pilt asendatakse selle fotoga ja nüüd saab selle peale joonistada. Joonistamine peab töötama nii hiire kui sõrmega. Kasutada [http://www.polymer-project.org/platform/pointer-events.html &#039;pointer-evente&#039;].&lt;br /&gt;
&lt;br /&gt;
All peaks saama lisada kuupäeva, mis töötab ilma javascriptita. Selle peale võib failinimele (mida pärast saab downloadida) lisada kuupäeva javascriptiga.&lt;br /&gt;
&lt;br /&gt;
Lehe lõpus paikneb Download nupp, mille href attribuut on base64 kodeeringus pilt, mis on üleval joonistatud. Download attribuudiga võiks anda fail normaalse nime, mis sisaldab sõna &amp;quot;image_&amp;quot; +  geokoordinaate + kuupäeva.  Näiteks &amp;lt;a id=“downloadLink” download=“image_56.64645_23.545454_01.02.2003.png” href=“data:image/….”&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Joonistusosa koodinäide ==&lt;br /&gt;
&lt;br /&gt;
    // shim layer with setTimeout fallback&lt;br /&gt;
    window.requestAnimFrame = (function () {&lt;br /&gt;
        return window.requestAnimationFrame ||&lt;br /&gt;
            window.webkitRequestAnimationFrame ||&lt;br /&gt;
            function (callback) {&lt;br /&gt;
                window.setTimeout(callback, 1000 / 60);&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
    window.addEventListener(&#039;load&#039;, init);&lt;br /&gt;
    var canvas = null;&lt;br /&gt;
    var ctx = null;&lt;br /&gt;
    // currently active stroke&lt;br /&gt;
    var stroke = null;&lt;br /&gt;
    function init() {&lt;br /&gt;
        canvas = document.querySelector(&#039;canvas&#039;);&lt;br /&gt;
        ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
        // Set the default line style.&lt;br /&gt;
        ctx.lineWidth = 3;&lt;br /&gt;
        ctx.lineCap = &amp;quot;round&amp;quot;;&lt;br /&gt;
        ctx.fillStyle = &amp;quot;cyan&amp;quot;;&lt;br /&gt;
        ctx.fillRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
        ctx.strokeStyle = &amp;quot;black&amp;quot;;&lt;br /&gt;
        canvas.addEventListener(&#039;mousedown&#039;, onMouseDown);&lt;br /&gt;
        canvas.addEventListener(&#039;mousemove&#039;, onMouseMove);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseup&#039;, onMouseUp);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseleave&#039;, onMouseUp);&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseDown(event) {&lt;br /&gt;
        stroke = new Stroke(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseMove(event) {&lt;br /&gt;
        // Are we currently drawing this pointer?&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.addPoint(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseUp(event) {&lt;br /&gt;
        stroke = null;&lt;br /&gt;
    }&lt;br /&gt;
    function drawPointers() {&lt;br /&gt;
        // If we have an active stroke, draw any undrawn segments.&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.draw();&lt;br /&gt;
        }&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    }&lt;br /&gt;
    function Point(x, y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
    }&lt;br /&gt;
    function Stroke(x, y) {&lt;br /&gt;
        this.points = [new Point(x, y)];&lt;br /&gt;
    }&lt;br /&gt;
    Stroke.prototype.addPoint = function (x, y) {&lt;br /&gt;
        this.points.push(new Point(x, y));&lt;br /&gt;
    }&lt;br /&gt;
    Stroke.prototype.draw = function () {&lt;br /&gt;
        if (this.points.length &amp;lt; 2) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo(this.points[0].x, this.points[0].y);&lt;br /&gt;
        for (var i = 1; i &amp;lt; this.points.length; i++) {&lt;br /&gt;
            ctx.lineTo(this.points[i].x, this.points[i].y);&lt;br /&gt;
        }&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.closePath();&lt;br /&gt;
        this.points = this.points.slice(-1);&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11503</id>
		<title>UI:Offline mobiiliapp</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11503"/>
		<updated>2014-03-31T17:04:32Z</updated>

		<summary type="html">&lt;p&gt;Roger: /* Joonistusosa koodinäide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UI}}&lt;br /&gt;
&lt;br /&gt;
== Ülesanne ==&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Drawing-app.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
Ülesande mõte on, et oleks offline rakendus, milles saab joonistada ja pintsli värvi valida. Kui vajutad pildi tegemise ülesselaadimise nupule, siis canvase pilt asendatakse selle fotoga ja nüüd saab selle peale joonistada. Joonistamine peab töötama nii hiire kui sõrmega. Kasutada [http://www.polymer-project.org/platform/pointer-events.html &#039;pointer-evente&#039;].&lt;br /&gt;
&lt;br /&gt;
All peaks saama lisada kuupäeva, mis töötab ilma javascriptita. Selle peale võib failinimele (mida pärast saab downloadida) lisada kuupäeva javascriptiga.&lt;br /&gt;
&lt;br /&gt;
Lehe lõpus paikneb Download nupp, mille href attribuut on base64 kodeeringus pilt, mis on üleval joonistatud. Download attribuudiga võiks anda fail normaalse nime, mis sisaldab sõna &amp;quot;image_&amp;quot; +  geokoordinaate + kuupäeva.  Näiteks &amp;lt;a id=“downloadLink” download=“image_56.64645_23.545454_01.02.2003.png” href=“data:image/….”&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Joonistusosa koodinäide ==&lt;br /&gt;
&lt;br /&gt;
    // shim layer with setTimeout fallback&lt;br /&gt;
    window.requestAnimFrame = (function () {&lt;br /&gt;
        return window.requestAnimationFrame ||&lt;br /&gt;
            window.webkitRequestAnimationFrame ||&lt;br /&gt;
            function (callback) {&lt;br /&gt;
                window.setTimeout(callback, 1000 / 60);&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
    window.addEventListener(&#039;load&#039;, init);&lt;br /&gt;
    var canvas = null;&lt;br /&gt;
    var ctx = null;&lt;br /&gt;
    // currently active stroke&lt;br /&gt;
    var stroke = null;&lt;br /&gt;
    function init() {&lt;br /&gt;
        canvas = document.querySelector(&#039;canvas&#039;);&lt;br /&gt;
        ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
        // Set the default line style.&lt;br /&gt;
        ctx.lineWidth = 3;&lt;br /&gt;
        ctx.lineCap = &amp;quot;round&amp;quot;;&lt;br /&gt;
        ctx.fillStyle = &amp;quot;cyan&amp;quot;;&lt;br /&gt;
        ctx.fillRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
        ctx.strokeStyle = &amp;quot;black&amp;quot;;&lt;br /&gt;
        canvas.addEventListener(&#039;mousedown&#039;, onMouseDown);&lt;br /&gt;
        canvas.addEventListener(&#039;mousemove&#039;, onMouseMove);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseup&#039;, onMouseUp);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseleave&#039;, onMouseUp);&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseDown(event) {&lt;br /&gt;
        stroke = new Stroke(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseMove(event) {&lt;br /&gt;
        // Are we currently drawing this pointer?&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.addPoint(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    function onMouseUp(event) {&lt;br /&gt;
        stroke = null;&lt;br /&gt;
    }&lt;br /&gt;
    function drawPointers() {&lt;br /&gt;
        // If we have an active stroke, draw any undrawn segments.&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.draw();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    }&lt;br /&gt;
    function Point(x, y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
    }&lt;br /&gt;
    function Stroke(x, y) {&lt;br /&gt;
        this.points = [new Point(x, y)];&lt;br /&gt;
    }&lt;br /&gt;
    Stroke.prototype.addPoint = function (x, y) {&lt;br /&gt;
        this.points.push(new Point(x, y));&lt;br /&gt;
    }&lt;br /&gt;
    Stroke.prototype.draw = function () {&lt;br /&gt;
        if (this.points.length &amp;lt; 2) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo(this.points[0].x, this.points[0].y);&lt;br /&gt;
        for (var i = 1; i &amp;lt; this.points.length; i++) {&lt;br /&gt;
            ctx.lineTo(this.points[i].x, this.points[i].y);&lt;br /&gt;
        }&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.closePath();&lt;br /&gt;
        this.points = this.points.slice(-1);&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11502</id>
		<title>UI:Offline mobiiliapp</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11502"/>
		<updated>2014-03-31T17:03:52Z</updated>

		<summary type="html">&lt;p&gt;Roger: /* Joonistusosa koodinäide */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UI}}&lt;br /&gt;
&lt;br /&gt;
== Ülesanne ==&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Drawing-app.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
Ülesande mõte on, et oleks offline rakendus, milles saab joonistada ja pintsli värvi valida. Kui vajutad pildi tegemise ülesselaadimise nupule, siis canvase pilt asendatakse selle fotoga ja nüüd saab selle peale joonistada. Joonistamine peab töötama nii hiire kui sõrmega. Kasutada [http://www.polymer-project.org/platform/pointer-events.html &#039;pointer-evente&#039;].&lt;br /&gt;
&lt;br /&gt;
All peaks saama lisada kuupäeva, mis töötab ilma javascriptita. Selle peale võib failinimele (mida pärast saab downloadida) lisada kuupäeva javascriptiga.&lt;br /&gt;
&lt;br /&gt;
Lehe lõpus paikneb Download nupp, mille href attribuut on base64 kodeeringus pilt, mis on üleval joonistatud. Download attribuudiga võiks anda fail normaalse nime, mis sisaldab sõna &amp;quot;image_&amp;quot; +  geokoordinaate + kuupäeva.  Näiteks &amp;lt;a id=“downloadLink” download=“image_56.64645_23.545454_01.02.2003.png” href=“data:image/….”&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Joonistusosa koodinäide ==&lt;br /&gt;
&lt;br /&gt;
    // shim layer with setTimeout fallback&lt;br /&gt;
    window.requestAnimFrame = (function () {&lt;br /&gt;
        return window.requestAnimationFrame ||&lt;br /&gt;
            window.webkitRequestAnimationFrame ||&lt;br /&gt;
            function (callback) {&lt;br /&gt;
                window.setTimeout(callback, 1000 / 60);&lt;br /&gt;
        };&lt;br /&gt;
    })();&lt;br /&gt;
&lt;br /&gt;
    window.addEventListener(&#039;load&#039;, init);&lt;br /&gt;
&lt;br /&gt;
    var canvas = null;&lt;br /&gt;
    var ctx = null;&lt;br /&gt;
&lt;br /&gt;
    // currently active stroke&lt;br /&gt;
    var stroke = null;&lt;br /&gt;
&lt;br /&gt;
    function init() {&lt;br /&gt;
        canvas = document.querySelector(&#039;canvas&#039;);&lt;br /&gt;
        ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // Set the default line style.&lt;br /&gt;
        ctx.lineWidth = 3;&lt;br /&gt;
        ctx.lineCap = &amp;quot;round&amp;quot;;&lt;br /&gt;
        ctx.fillStyle = &amp;quot;cyan&amp;quot;;&lt;br /&gt;
        ctx.fillRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
        ctx.strokeStyle = &amp;quot;black&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        canvas.addEventListener(&#039;mousedown&#039;, onMouseDown);&lt;br /&gt;
        canvas.addEventListener(&#039;mousemove&#039;, onMouseMove);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseup&#039;, onMouseUp);&lt;br /&gt;
        canvas.addEventListener(&#039;mouseleave&#039;, onMouseUp);&lt;br /&gt;
&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function onMouseDown(event) {&lt;br /&gt;
        stroke = new Stroke(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function onMouseMove(event) {&lt;br /&gt;
        // Are we currently drawing this pointer?&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.addPoint(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
        }&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    function onMouseUp(event) {&lt;br /&gt;
        stroke = null;&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    function drawPointers() {&lt;br /&gt;
        // If we have an active stroke, draw any undrawn segments.&lt;br /&gt;
        if (stroke) {&lt;br /&gt;
            stroke.draw();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        requestAnimFrame(drawPointers);&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    function Point(x, y) {&lt;br /&gt;
        this.x = x;&lt;br /&gt;
        this.y = y;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function Stroke(x, y) {&lt;br /&gt;
        this.points = [new Point(x, y)];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    Stroke.prototype.addPoint = function (x, y) {&lt;br /&gt;
        this.points.push(new Point(x, y));&lt;br /&gt;
    };&lt;br /&gt;
&lt;br /&gt;
    Stroke.prototype.draw = function () {&lt;br /&gt;
        if (this.points.length &amp;lt; 2) {&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        ctx.beginPath();&lt;br /&gt;
        ctx.moveTo(this.points[0].x, this.points[0].y);&lt;br /&gt;
        for (var i = 1; i &amp;lt; this.points.length; i++) {&lt;br /&gt;
            ctx.lineTo(this.points[i].x, this.points[i].y);&lt;br /&gt;
        }&lt;br /&gt;
        ctx.stroke();&lt;br /&gt;
        ctx.closePath();&lt;br /&gt;
        this.points = this.points.slice(-1);&lt;br /&gt;
    };&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11501</id>
		<title>UI:Offline mobiiliapp</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11501"/>
		<updated>2014-03-31T17:03:00Z</updated>

		<summary type="html">&lt;p&gt;Roger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UI}}&lt;br /&gt;
&lt;br /&gt;
== Ülesanne ==&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Drawing-app.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
Ülesande mõte on, et oleks offline rakendus, milles saab joonistada ja pintsli värvi valida. Kui vajutad pildi tegemise ülesselaadimise nupule, siis canvase pilt asendatakse selle fotoga ja nüüd saab selle peale joonistada. Joonistamine peab töötama nii hiire kui sõrmega. Kasutada [http://www.polymer-project.org/platform/pointer-events.html &#039;pointer-evente&#039;].&lt;br /&gt;
&lt;br /&gt;
All peaks saama lisada kuupäeva, mis töötab ilma javascriptita. Selle peale võib failinimele (mida pärast saab downloadida) lisada kuupäeva javascriptiga.&lt;br /&gt;
&lt;br /&gt;
Lehe lõpus paikneb Download nupp, mille href attribuut on base64 kodeeringus pilt, mis on üleval joonistatud. Download attribuudiga võiks anda fail normaalse nime, mis sisaldab sõna &amp;quot;image_&amp;quot; +  geokoordinaate + kuupäeva.  Näiteks &amp;lt;a id=“downloadLink” download=“image_56.64645_23.545454_01.02.2003.png” href=“data:image/….”&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Joonistusosa koodinäide ==&lt;br /&gt;
&lt;br /&gt;
// shim layer with setTimeout fallback&lt;br /&gt;
window.requestAnimFrame = (function () {&lt;br /&gt;
	return window.requestAnimationFrame ||&lt;br /&gt;
		window.webkitRequestAnimationFrame ||&lt;br /&gt;
		function (callback) {&lt;br /&gt;
			window.setTimeout(callback, 1000 / 60);&lt;br /&gt;
	};&lt;br /&gt;
})();&lt;br /&gt;
&lt;br /&gt;
window.addEventListener(&#039;load&#039;, init);&lt;br /&gt;
&lt;br /&gt;
var canvas = null;&lt;br /&gt;
var ctx = null;&lt;br /&gt;
&lt;br /&gt;
// currently active stroke&lt;br /&gt;
var stroke = null;&lt;br /&gt;
&lt;br /&gt;
function init() {&lt;br /&gt;
	canvas = document.querySelector(&#039;canvas&#039;);&lt;br /&gt;
	ctx = canvas.getContext(&amp;quot;2d&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
	// Set the default line style.&lt;br /&gt;
	ctx.lineWidth = 3;&lt;br /&gt;
	ctx.lineCap = &amp;quot;round&amp;quot;;&lt;br /&gt;
	ctx.fillStyle = &amp;quot;cyan&amp;quot;;&lt;br /&gt;
	ctx.fillRect(0, 0, canvas.width, canvas.height);&lt;br /&gt;
	ctx.strokeStyle = &amp;quot;black&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	canvas.addEventListener(&#039;mousedown&#039;, onMouseDown);&lt;br /&gt;
	canvas.addEventListener(&#039;mousemove&#039;, onMouseMove);&lt;br /&gt;
	canvas.addEventListener(&#039;mouseup&#039;, onMouseUp);&lt;br /&gt;
	canvas.addEventListener(&#039;mouseleave&#039;, onMouseUp);&lt;br /&gt;
&lt;br /&gt;
	requestAnimFrame(drawPointers);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function onMouseDown(event) {&lt;br /&gt;
	stroke = new Stroke(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function onMouseMove(event) {&lt;br /&gt;
	// Are we currently drawing this pointer?&lt;br /&gt;
	if (stroke) {&lt;br /&gt;
		stroke.addPoint(event.clientX - canvas.offsetLeft, event.clientY - canvas.offsetTop);&lt;br /&gt;
	}&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function onMouseUp(event) {&lt;br /&gt;
	stroke = null;&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function drawPointers() {&lt;br /&gt;
	// If we have an active stroke, draw any undrawn segments.&lt;br /&gt;
	if (stroke) {&lt;br /&gt;
		stroke.draw();&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	requestAnimFrame(drawPointers);&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
function Point(x, y) {&lt;br /&gt;
	this.x = x;&lt;br /&gt;
	this.y = y;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function Stroke(x, y) {&lt;br /&gt;
	this.points = [new Point(x, y)];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Stroke.prototype.addPoint = function (x, y) {&lt;br /&gt;
	this.points.push(new Point(x, y));&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
Stroke.prototype.draw = function () {&lt;br /&gt;
	if (this.points.length &amp;lt; 2) {&lt;br /&gt;
		return;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	ctx.beginPath();&lt;br /&gt;
	ctx.moveTo(this.points[0].x, this.points[0].y);&lt;br /&gt;
	for (var i = 1; i &amp;lt; this.points.length; i++) {&lt;br /&gt;
		ctx.lineTo(this.points[i].x, this.points[i].y);&lt;br /&gt;
	}&lt;br /&gt;
	ctx.stroke();&lt;br /&gt;
	ctx.closePath();&lt;br /&gt;
	this.points = this.points.slice(-1);&lt;br /&gt;
};&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11500</id>
		<title>UI:Offline mobiiliapp</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Offline_mobiiliapp&amp;diff=11500"/>
		<updated>2014-03-31T17:00:39Z</updated>

		<summary type="html">&lt;p&gt;Roger: Uus lehekülg: &amp;#039;{{UI}}  == Ülesanne ==  x240px  Ülesande mõte on, et oleks offline rakendus, milles saab joonistada ja pintsli värvi valida. Kui vajutad pildi tegemi...&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UI}}&lt;br /&gt;
&lt;br /&gt;
== Ülesanne ==&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Drawing-app.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
Ülesande mõte on, et oleks offline rakendus, milles saab joonistada ja pintsli värvi valida. Kui vajutad pildi tegemise ülesselaadimise nupule, siis canvase pilt asendatakse selle fotoga ja nüüd saab selle peale joonistada. Joonistamine peab töötama nii hiire kui sõrmega. Kasutada [http://www.polymer-project.org/platform/pointer-events.html &#039;pointer-evente&#039;].&lt;br /&gt;
&lt;br /&gt;
All peaks saama lisada kuupäeva, mis töötab ilma javascriptita. Selle peale võib failinimele (mida pärast saab downloadida) lisada kuupäeva javascriptiga.&lt;br /&gt;
&lt;br /&gt;
Lehe lõpus paikneb Download nupp, mille href attribuut on base64 kodeeringus pilt, mis on üleval joonistatud. Download attribuudiga võiks anda fail normaalse nime, mis sisaldab sõna &amp;quot;image_&amp;quot; +  geokoordinaate + kuupäeva.  Näiteks &amp;lt;a id=“downloadLink” download=“image_56.64645_23.545454_01.02.2003.png” href=“data:image/….”&amp;gt;&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Fail:Drawing-app.png&amp;diff=11499</id>
		<title>Fail:Drawing-app.png</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Fail:Drawing-app.png&amp;diff=11499"/>
		<updated>2014-03-31T16:50:48Z</updated>

		<summary type="html">&lt;p&gt;Roger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Kasutajaliidesed&amp;diff=11498</id>
		<title>Kasutajaliidesed</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Kasutajaliidesed&amp;diff=11498"/>
		<updated>2014-03-31T16:48:00Z</updated>

		<summary type="html">&lt;p&gt;Roger: /* Praktikumid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Kursuse kood: &amp;lt;b&amp;gt;ITV0130&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Link: http://www.lambda.ee/index.php/Kasutajaliidesed or http://www.lambda.ee/index/itv0130&amp;lt;br&amp;gt;&lt;br /&gt;
Õppejõud: Jaagup Irve&amp;lt;br&amp;gt;&lt;br /&gt;
Kontakt: jaagup.irve@ttu.ee, TTÜ ruum ICT-425&amp;lt;br&amp;gt;&lt;br /&gt;
Kursus varasematel aastatel: [[Kasutajaliidesed (2013)|2013]] [[Kasutajaliidesed (2012)|2012]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Korraldusest ==&lt;br /&gt;
&lt;br /&gt;
Loengutes selgitame kasutajaliideste arendamise põhimõtteid. Harjutustundide eesmärk on tutvustada laborite tegemiseks tarvilikke tehnilisi lahendusi. Praktikumis lahendame iga nädal mõnd konkreetset liidese ehitamisel ettetulevat probleemi (kui pole kodutööde esitamise nädal, sest siis tegeleme ainult sellega)&lt;br /&gt;
&lt;br /&gt;
=== Rühmad === &lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/spreadsheet/pub?key=0Ahj5HjDByo6SdHpLX2NFYjl5Mk5sWVlQR0xJVWwtU3c&amp;amp;single=true&amp;amp;gid=2&amp;amp;output=html Rühmad]&lt;br /&gt;
* Muudatuste tegemine ja lisamine e-posti teel.&lt;br /&gt;
* Rühm A: esmaspäev 16:00 ITC-404&lt;br /&gt;
* Rühm B: esmaspäev 17:45 ITC-401&lt;br /&gt;
* Rühm C: teisipäev 10:00 ITC-401&lt;br /&gt;
&lt;br /&gt;
== Hindest ==&lt;br /&gt;
&lt;br /&gt;
Aine lõppeb hindelise arvestusega. Aine hinne koosneb kolmest komponendist:&lt;br /&gt;
* Labor 1: [[UI Prototüüp|Kasutajaliidese prototüüpimine]] staatilise HTML/CSS/Javascripti abil  (30+3p) &#039;&#039;&#039;Tähtaeg: 17. märts (Rühmad A, B) ja 18. märts (Rühm C)&#039;&#039;&#039;&lt;br /&gt;
* Labor 2: AJAX kasutajaliidese viimistlemine HTML/CSS/Javascripti abil. (30+3p) [[Serverirakenduse praktiline juhend]]&lt;br /&gt;
* Kontrolltöö lugemismaterjalide ja loengumaterjalide peale (40p)&lt;br /&gt;
&lt;br /&gt;
Laborid sooritatakse paarikaupa või soovi korral individuaalselt; hindamisel peavad kohal olema mõlemad paarilised.&lt;br /&gt;
&lt;br /&gt;
== Praktikumid ==&lt;br /&gt;
&lt;br /&gt;
Esimene nädal praktikumi ei toimu, sest gruppidesse jagamine (vt grupid ülalpool)&lt;br /&gt;
&lt;br /&gt;
# [[UI:Prototüüp|Prototüüpimine paberil]]&lt;br /&gt;
# [[UI:Bootstrap|Bootstrap]]&lt;br /&gt;
# [[UI:Kassid|Kassid]] (esitamiseks 25.nda veebruari jooksul)&lt;br /&gt;
# [[UI:CSS elemente|CSS elemente]]&lt;br /&gt;
# [[UI:Transition|Transition]]&lt;br /&gt;
# &#039;&#039;Esimese labori esitamine&#039;&#039;&lt;br /&gt;
# [[UI:Mobiilvaate praktikum|Mobiilvaate praktikum]]&lt;br /&gt;
# [[UI:Offline mobiiliapp|Offline mobiiliapp]]&lt;br /&gt;
# [[UI:Dijkstra|Dijkstra]]&amp;lt;br/&amp;gt;&lt;br /&gt;
# [[UI:Sqlite|Sqlite]]&amp;lt;br/&amp;gt;&lt;br /&gt;
# [[UI:CSS3 elemente|CSS3 elemente]]&lt;br /&gt;
# [[UI:CSS Speech|CSS Speech]]&lt;br /&gt;
&lt;br /&gt;
== Videod == &lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/playlist?list=PLMQzXA1f24AdPMsiYydc4rcAtHN-MiC6D&amp;amp;feature=view_all CSSi tutvustusvideod]&lt;br /&gt;
&lt;br /&gt;
== Kontrolltöö ==&lt;br /&gt;
&lt;br /&gt;
Kontrolltöö toimub viimase loengu ajal, loengu ruumides. Kontrolltöö sisuks on alltoodud materjalide lugemiskontroll ning HTML/javascripti tehniliste küsimuste lahendamine paberil.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Lugemist &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* A List Apart: [http://alistapart.com/article/indefenseofeyecandy In Defence of Eye Candy] - miks ilus liides on &amp;quot;parem&amp;quot;.&lt;br /&gt;
* Spolsky: [http://www.joelonsoftware.com/uibook/fog0000000249.html User Interface Design For Programmers] - kontrollitundest, kasutajamudelist ja päris inimestest&lt;br /&gt;
* Brandon Walkin: [http://www.brandonwalkin.com/blog/2009/08/10/managing-ui-complexity/ Managing UI complexity] - sellest kuidas asju kasutaja eest ära peita&lt;br /&gt;
* Ask Tog: [http://www.asktog.com/basics/firstPrinciples.html First Principles of User Interaction Design] - tee liides valmis ja loe see uuesti läbi&lt;br /&gt;
* Nielsen: [http://www.nngroup.com/articles/ten-usability-heuristics/ 10 heuristilist kriteeriumit] - liidese testimiseks&lt;br /&gt;
* [http://ui-patterns.com/ UI-Patterns.com] - parempoolne menüü&lt;br /&gt;
* [http://www.joelonsoftware.com/articles/Unicode.html Spolsky: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)]&lt;br /&gt;
* [http://friedcellcollective.net/outbreak/2007/12/13/messing-up-the-interface/ kuidas vormid koledaks lähevad] ja [http://www.lukew.com/ff/entry.asp?1502 vormide disainist]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tehniline &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* CSS (vt http://www.w3schools.com/css/default.asp). Peab aru saama põhimõtetest ja näidetest. Konkreetsete omaduste ja atribuudite nimesid ise välja ei pea mõtlema.&lt;br /&gt;
* Javascript (vt http://www.w3schools.com/js/default.asp). Peab aru saama väikestest näidetest a la js inclusion, vormist teksti kättesaamine ja muutmine, domi kättesaamine ja muutmine. Ei pea oskama erinevaid teeke.&lt;br /&gt;
* Json/ajax (vt http://www.w3schools.com/ajax/default.asp). Peab oskama kirjutada väikese JSONi kasutava ajaxi näite. Väike progeülesanne.&lt;br /&gt;
* HTML dom põhipunktid (vt http://www.w3schools.com/htmldom/default.asp). &lt;br /&gt;
* Cookied ja sessioonid (vt http://en.wikipedia.org/wiki/HTTP_cookie, http://www.quirksmode.org/js/cookies.html). Peab aru saama cookie põhimõtetest server-side ja aru saama javascripti näidetest cookiede kasutamise kohta. Programmeerimisülesannet selle kohta ei tule.&lt;br /&gt;
* Cgi protokoll (vt http://www.jmarshall.com/easy/cgi/). Peab aru saama, kuidas vormisisusid postitaktakse, mis vahe on GET ja POST protokollil.&lt;br /&gt;
&lt;br /&gt;
== Niisama huvitavat lugemist == &lt;br /&gt;
* [http://www.theverge.com/2013/1/24/3904134/google-redesign-how-larry-page-engineered-beautiful-revolution Redesigning Google: How Larry Page Engineered Beautiful Revolution] - kuidas Google ennast hiljuti ümber ehitas&lt;br /&gt;
* [http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown Amazoni alam-menüü nipp]&lt;br /&gt;
* [http://paulrouget.com/e/devtoolsnext/ Firefox developer tools] - lahedusi Mozillalt&lt;br /&gt;
* [http://www.riso.ee/et/files/Kasutajakeskse_veebi_lehekylgede_disain.pdf RISO: Kasutajakeskse veebi lehekülgede disain (.pdf)]&lt;br /&gt;
* [http://www.riso.ee/et/files/Kasutajakeskse_veebi_lehekylgede_disain.pdf Riigi veebi koosvõime raamistik]&lt;br /&gt;
* [http://msdn.microsoft.com/en-us/library/windows/desktop/aa511258.aspx Windows User Experience Interaction guidelines] - Win7&lt;br /&gt;
* [http://msdn.microsoft.com/en-us/library/windows/apps/hh465424.aspx UX Guidelines for Windows Store apps] - Win 8 &lt;br /&gt;
* [http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/MobileHIG/Introduction/Introduction.html iOS Human Interface Guidelines]&lt;br /&gt;
* [https://developer.gnome.org/hig-book/stable/ GNOME Human Interface Guidelines]&lt;br /&gt;
* [https://medium.com/product-design/5ccef7b3e1fc Kuidas iOS lapikumaks muutub aja jooksul]&lt;br /&gt;
* [http://www.behance.net/rogeroddone Google Visual Asset Guidelines] - Google&#039;i ikonograafia loomisest&lt;br /&gt;
* [http://www.theverge.com/2013/8/29/4640308/dark-patterns-inside-the-interfaces-designed-to-trick-you Dark Patterns] - salakavalatest kasutajaliidese mustritest.&lt;br /&gt;
&lt;br /&gt;
[[Kategooria:Kasutajaliidesed]]&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Mobiilvaate_praktikum&amp;diff=11485</id>
		<title>UI:Mobiilvaate praktikum</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Mobiilvaate_praktikum&amp;diff=11485"/>
		<updated>2014-03-24T20:38:50Z</updated>

		<summary type="html">&lt;p&gt;Roger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{UI}}&lt;br /&gt;
Harjutuse eesmärk on kirjutada valmis veebileht, mis reageerib dünaamiliselt kasutaja akna laiuse muutumisele, kasutades selleks ainult CSSi. Täpsemalt proovime seda thea Flexbox nimelise standardiga, mis on veel nii uus, et igas brauseris korralikult ei tööta. Seetõttu kasutage selle harjutuse testimiseks brauserit &#039;&#039;&#039;Chrome&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Ülesanne ==&lt;br /&gt;
&lt;br /&gt;
Teha leht, mis kasutaks [http://css-tricks.com/snippets/css/a-guide-to-flexbox/ flexboxi] meetodit koos CSS Media Querydega. Sisu võiks koosneda piltidest + tekstidest, mis muudavad suurust vastavalt brauseri suuruse muutmisele.&lt;br /&gt;
&lt;br /&gt;
Desktopi vaade peaks olema kõikidel ekraanidel, millel on laius suurem kui 1024px.&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Desktop-flex.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
(Nupud võiks olla keskel üleval. Näidata teistsugust reklaami, kui vaadata suurema pikslitihedusega ekraanilt)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tableti vaade peaks jääma 1024px ja 768px vahele.&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Tablet-flex.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
(Tulbas vähem asju. Äärest ääreni nupud üleval ning suuremad, kui desktopi vaates. Reklaam peaks sellest vaatest puuduma)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mobiilne vaade võiks olla väiksem kui 768px.&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Mobile.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
(Pilt peaks erinema desktopi reklaami pildist. Näidata teistsugust reklaami, kui vaadata suurema pikslitihedusega ekraanilt. Javascriptiga peaks peitma menüü, kui minna mobiilsesse vaatesse ning mingi nupu vajutamisel võiks see nähtavale ilmuda)&lt;br /&gt;
&lt;br /&gt;
==Esitamine==&lt;br /&gt;
Esitamiseks saatke tulemus tavalisele aadressile, kirjutades teemareale &amp;quot;UI:Mobiilvaade&amp;quot;. Töö nagu ikka üksi või kahekesi.&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Mobiilvaate_praktikum&amp;diff=11482</id>
		<title>UI:Mobiilvaate praktikum</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Mobiilvaate_praktikum&amp;diff=11482"/>
		<updated>2014-03-24T18:02:20Z</updated>

		<summary type="html">&lt;p&gt;Roger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Teha leht, mis kasutaks [http://css-tricks.com/snippets/css/a-guide-to-flexbox/ flexboxi] meetodit koos CSS Media Querydega. Sisu võiks koosneda piltidest + tekstidest, mis muudavad suurust vastavalt brauseri suuruse muutmisele.&lt;br /&gt;
&lt;br /&gt;
Desktopi vaade peaks olema kõikidel ekraanidel, millel on laius suurem kui 1024px.&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Desktop-flex.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
(Nupud võiks olla keskel üleval. Näidata teistsugust reklaami, kui vaadata suurema pikslitihedusega ekraanilt)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tableti vaade peaks jääma 1024px ja 768px vahele.&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Tablet-flex.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
(Tulbas vähem asju. Äärest ääreni nupud üleval ning suuremad, kui desktopi vaates)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mobiilne vaade võiks olla väiksem kui 768px.&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Mobile.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
(Pilt peaks erinema desktopi reklaami pildist. Näidata teistsugust reklaami, kui vaadata suurema pikslitihedusega ekraanilt. Javascriptiga peaks peitma menüü, kui minna mobiilsesse vaatesse ning mingi nupu vajutamisel võiks see nähtavale ilmuda)&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Mobiilvaate_praktikum&amp;diff=11481</id>
		<title>UI:Mobiilvaate praktikum</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Mobiilvaate_praktikum&amp;diff=11481"/>
		<updated>2014-03-24T17:58:34Z</updated>

		<summary type="html">&lt;p&gt;Roger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Teha leht, mis kasutaks [http://css-tricks.com/snippets/css/a-guide-to-flexbox/ flexboxi] meetodit koos CSS Media Querydega. Sisu võiks koosneda piltidest + tekstidest, mis muudavad suurust vastavalt brauseri suuruse muutmisele.&lt;br /&gt;
&lt;br /&gt;
Desktopi vaade peaks olema kõik, millel on laius suurem kui 1024px.&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Desktop-flex.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
(Nupud võiks olla keskel üleval. Näidata teistsugust reklaami, kui vaadata suurema pikslitihedusega ekraanilt)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Tableti vaade peaks jääma 1024px ja 768px vahele.&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Tablet-flex.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
(Tulbas vähem asju. Äärest ääreni nupud üleval ning suuremad, kui desktopi vaates)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Mobiilne vaade võiks olla väiksem kui 768px.&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Mobile.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
(Pilt peaks erinema desktopi reklaami pildist. Näidata teistsugust reklaami, kui vaadata suurema pikslitihedusega ekraanilt.)&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Mobiilvaate_praktikum&amp;diff=11480</id>
		<title>UI:Mobiilvaate praktikum</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Mobiilvaate_praktikum&amp;diff=11480"/>
		<updated>2014-03-24T17:54:40Z</updated>

		<summary type="html">&lt;p&gt;Roger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Teha leht, mis kasutaks [http://css-tricks.com/snippets/css/a-guide-to-flexbox/ flexboxi] meetodit koos CSS Media Querydega.&lt;br /&gt;
&lt;br /&gt;
Desktopi vaade peaks olema kõik, millel on laius suurem kui 1024px.&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Desktop-flex.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
Tableti vaade peaks jääma 1024px ja 768px vahele.&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Tablet-flex.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
Mobiilne vaade võiks olla väiksem kui 768px.&lt;br /&gt;
&lt;br /&gt;
[[Pilt:Mobile.png|x240px]]&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Mobiilvaate_praktikum&amp;diff=11479</id>
		<title>UI:Mobiilvaate praktikum</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Mobiilvaate_praktikum&amp;diff=11479"/>
		<updated>2014-03-24T17:54:28Z</updated>

		<summary type="html">&lt;p&gt;Roger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Teha leht, mis kasutaks [http://css-tricks.com/snippets/css/a-guide-to-flexbox/ flexboxi] meetodit koos CSS Media Querydega.&lt;br /&gt;
&lt;br /&gt;
Desktopi vaade peaks olema kõik, millel on laius suurem kui 1024px.&lt;br /&gt;
[[Pilt:Desktop-flex.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
Tableti vaade peaks jääma 1024px ja 768px vahele.&lt;br /&gt;
[[Pilt:Tablet-flex.png|x240px]]&lt;br /&gt;
&lt;br /&gt;
Mobiilne vaade võiks olla väiksem kui 768px.&lt;br /&gt;
[[Pilt:Mobile.png|x240px]]&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Mobiilvaate_praktikum&amp;diff=11478</id>
		<title>UI:Mobiilvaate praktikum</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Mobiilvaate_praktikum&amp;diff=11478"/>
		<updated>2014-03-24T17:50:13Z</updated>

		<summary type="html">&lt;p&gt;Roger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pilt:Desktop-flex.png|x240px]]&lt;br /&gt;
[[Pilt:Tablet-flex.png|x240px]]&lt;br /&gt;
[[Pilt:Mobile.png|x240px]]&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=UI:Mobiilvaate_praktikum&amp;diff=11477</id>
		<title>UI:Mobiilvaate praktikum</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=UI:Mobiilvaate_praktikum&amp;diff=11477"/>
		<updated>2014-03-24T17:49:04Z</updated>

		<summary type="html">&lt;p&gt;Roger: Uus lehekülg: &amp;#039;Pilt:Desktop-flex.png Pilt:Tablet-flex.png Pilt:Mobile.png&amp;#039;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Pilt:Desktop-flex.png]]&lt;br /&gt;
[[Pilt:Tablet-flex.png]]&lt;br /&gt;
[[Pilt:Mobile.png]]&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Fail:Tablet-flex.png&amp;diff=11476</id>
		<title>Fail:Tablet-flex.png</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Fail:Tablet-flex.png&amp;diff=11476"/>
		<updated>2014-03-24T17:48:56Z</updated>

		<summary type="html">&lt;p&gt;Roger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Fail:Mobile.png&amp;diff=11475</id>
		<title>Fail:Mobile.png</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Fail:Mobile.png&amp;diff=11475"/>
		<updated>2014-03-24T17:48:26Z</updated>

		<summary type="html">&lt;p&gt;Roger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Fail:Desktop-flex.png&amp;diff=11474</id>
		<title>Fail:Desktop-flex.png</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Fail:Desktop-flex.png&amp;diff=11474"/>
		<updated>2014-03-24T17:47:22Z</updated>

		<summary type="html">&lt;p&gt;Roger: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
	<entry>
		<id>http://www.lambda.ee/w/index.php?title=Kasutajaliidesed&amp;diff=11473</id>
		<title>Kasutajaliidesed</title>
		<link rel="alternate" type="text/html" href="http://www.lambda.ee/w/index.php?title=Kasutajaliidesed&amp;diff=11473"/>
		<updated>2014-03-24T17:46:09Z</updated>

		<summary type="html">&lt;p&gt;Roger: /* Praktikumid */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Kursuse kood: &amp;lt;b&amp;gt;ITV0130&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
Link: http://www.lambda.ee/index.php/Kasutajaliidesed or http://www.lambda.ee/index/itv0130&amp;lt;br&amp;gt;&lt;br /&gt;
Õppejõud: Jaagup Irve&amp;lt;br&amp;gt;&lt;br /&gt;
Kontakt: jaagup.irve@ttu.ee, TTÜ ruum ICT-425&amp;lt;br&amp;gt;&lt;br /&gt;
Kursus varasematel aastatel: [[Kasutajaliidesed (2013)|2013]] [[Kasutajaliidesed (2012)|2012]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Korraldusest ==&lt;br /&gt;
&lt;br /&gt;
Loengutes selgitame kasutajaliideste arendamise põhimõtteid. Harjutustundide eesmärk on tutvustada laborite tegemiseks tarvilikke tehnilisi lahendusi. Praktikumis lahendame iga nädal mõnd konkreetset liidese ehitamisel ettetulevat probleemi (kui pole kodutööde esitamise nädal, sest siis tegeleme ainult sellega)&lt;br /&gt;
&lt;br /&gt;
=== Rühmad === &lt;br /&gt;
&lt;br /&gt;
* [https://docs.google.com/spreadsheet/pub?key=0Ahj5HjDByo6SdHpLX2NFYjl5Mk5sWVlQR0xJVWwtU3c&amp;amp;single=true&amp;amp;gid=2&amp;amp;output=html Rühmad]&lt;br /&gt;
* Muudatuste tegemine ja lisamine e-posti teel.&lt;br /&gt;
* Rühm A: esmaspäev 16:00 ITC-404&lt;br /&gt;
* Rühm B: esmaspäev 17:45 ITC-401&lt;br /&gt;
* Rühm C: teisipäev 10:00 ITC-401&lt;br /&gt;
&lt;br /&gt;
== Hindest ==&lt;br /&gt;
&lt;br /&gt;
Aine lõppeb hindelise arvestusega. Aine hinne koosneb kolmest komponendist:&lt;br /&gt;
* Labor 1: [[UI Prototüüp|Kasutajaliidese prototüüpimine]] staatilise HTML/CSS/Javascripti abil  (30+3p) &#039;&#039;&#039;Tähtaeg: 17. märts (Rühmad A, B) ja 18. märts (Rühm C)&#039;&#039;&#039;&lt;br /&gt;
* Labor 2: AJAX kasutajaliidese viimistlemine HTML/CSS/Javascripti abil. (30+3p) [[Serverirakenduse praktiline juhend]]&lt;br /&gt;
* Kontrolltöö lugemismaterjalide ja loengumaterjalide peale (40p)&lt;br /&gt;
&lt;br /&gt;
Laborid sooritatakse paarikaupa või soovi korral individuaalselt; hindamisel peavad kohal olema mõlemad paarilised.&lt;br /&gt;
&lt;br /&gt;
== Praktikumid ==&lt;br /&gt;
&lt;br /&gt;
Esimene nädal praktikumi ei toimu, sest gruppidesse jagamine (vt grupid ülalpool)&lt;br /&gt;
&lt;br /&gt;
# [[UI:Prototüüp|Prototüüpimine paberil]]&lt;br /&gt;
# [[UI:Bootstrap|Bootstrap]]&lt;br /&gt;
# [[UI:Kassid|Kassid]] (esitamiseks 25.nda veebruari jooksul)&lt;br /&gt;
# [[UI:CSS elemente|CSS elemente]]&lt;br /&gt;
# [[UI:Transition|Transition]]&lt;br /&gt;
# &#039;&#039;Esimese labori esitamine&#039;&#039;&lt;br /&gt;
# [[UI:Mobiilvaate praktikum|Mobiilvaate praktikum]]&lt;br /&gt;
# [[UI:Dijkstra|Dijkstra]]&amp;lt;br/&amp;gt;&lt;br /&gt;
# [[UI:Sqlite|Sqlite]]&amp;lt;br/&amp;gt;&lt;br /&gt;
# [[UI:CSS3 elemente|CSS3 elemente]]&lt;br /&gt;
# [[UI:CSS Speech|CSS Speech]]&lt;br /&gt;
&lt;br /&gt;
== Videod == &lt;br /&gt;
&lt;br /&gt;
* [https://www.youtube.com/playlist?list=PLMQzXA1f24AdPMsiYydc4rcAtHN-MiC6D&amp;amp;feature=view_all CSSi tutvustusvideod]&lt;br /&gt;
&lt;br /&gt;
== Kontrolltöö ==&lt;br /&gt;
&lt;br /&gt;
Kontrolltöö toimub viimase loengu ajal, loengu ruumides. Kontrolltöö sisuks on alltoodud materjalide lugemiskontroll ning HTML/javascripti tehniliste küsimuste lahendamine paberil.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Lugemist &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* A List Apart: [http://alistapart.com/article/indefenseofeyecandy In Defence of Eye Candy] - miks ilus liides on &amp;quot;parem&amp;quot;.&lt;br /&gt;
* Spolsky: [http://www.joelonsoftware.com/uibook/fog0000000249.html User Interface Design For Programmers] - kontrollitundest, kasutajamudelist ja päris inimestest&lt;br /&gt;
* Brandon Walkin: [http://www.brandonwalkin.com/blog/2009/08/10/managing-ui-complexity/ Managing UI complexity] - sellest kuidas asju kasutaja eest ära peita&lt;br /&gt;
* Ask Tog: [http://www.asktog.com/basics/firstPrinciples.html First Principles of User Interaction Design] - tee liides valmis ja loe see uuesti läbi&lt;br /&gt;
* Nielsen: [http://www.nngroup.com/articles/ten-usability-heuristics/ 10 heuristilist kriteeriumit] - liidese testimiseks&lt;br /&gt;
* [http://ui-patterns.com/ UI-Patterns.com] - parempoolne menüü&lt;br /&gt;
* [http://www.joelonsoftware.com/articles/Unicode.html Spolsky: The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)]&lt;br /&gt;
* [http://friedcellcollective.net/outbreak/2007/12/13/messing-up-the-interface/ kuidas vormid koledaks lähevad] ja [http://www.lukew.com/ff/entry.asp?1502 vormide disainist]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039; Tehniline &#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* CSS (vt http://www.w3schools.com/css/default.asp). Peab aru saama põhimõtetest ja näidetest. Konkreetsete omaduste ja atribuudite nimesid ise välja ei pea mõtlema.&lt;br /&gt;
* Javascript (vt http://www.w3schools.com/js/default.asp). Peab aru saama väikestest näidetest a la js inclusion, vormist teksti kättesaamine ja muutmine, domi kättesaamine ja muutmine. Ei pea oskama erinevaid teeke.&lt;br /&gt;
* Json/ajax (vt http://www.w3schools.com/ajax/default.asp). Peab oskama kirjutada väikese JSONi kasutava ajaxi näite. Väike progeülesanne.&lt;br /&gt;
* HTML dom põhipunktid (vt http://www.w3schools.com/htmldom/default.asp). &lt;br /&gt;
* Cookied ja sessioonid (vt http://en.wikipedia.org/wiki/HTTP_cookie, http://www.quirksmode.org/js/cookies.html). Peab aru saama cookie põhimõtetest server-side ja aru saama javascripti näidetest cookiede kasutamise kohta. Programmeerimisülesannet selle kohta ei tule.&lt;br /&gt;
* Cgi protokoll (vt http://www.jmarshall.com/easy/cgi/). Peab aru saama, kuidas vormisisusid postitaktakse, mis vahe on GET ja POST protokollil.&lt;br /&gt;
&lt;br /&gt;
== Niisama huvitavat lugemist == &lt;br /&gt;
* [http://www.theverge.com/2013/1/24/3904134/google-redesign-how-larry-page-engineered-beautiful-revolution Redesigning Google: How Larry Page Engineered Beautiful Revolution] - kuidas Google ennast hiljuti ümber ehitas&lt;br /&gt;
* [http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown Amazoni alam-menüü nipp]&lt;br /&gt;
* [http://paulrouget.com/e/devtoolsnext/ Firefox developer tools] - lahedusi Mozillalt&lt;br /&gt;
* [http://www.riso.ee/et/files/Kasutajakeskse_veebi_lehekylgede_disain.pdf RISO: Kasutajakeskse veebi lehekülgede disain (.pdf)]&lt;br /&gt;
* [http://www.riso.ee/et/files/Kasutajakeskse_veebi_lehekylgede_disain.pdf Riigi veebi koosvõime raamistik]&lt;br /&gt;
* [http://msdn.microsoft.com/en-us/library/windows/desktop/aa511258.aspx Windows User Experience Interaction guidelines] - Win7&lt;br /&gt;
* [http://msdn.microsoft.com/en-us/library/windows/apps/hh465424.aspx UX Guidelines for Windows Store apps] - Win 8 &lt;br /&gt;
* [http://developer.apple.com/library/ios/#documentation/UserExperience/Conceptual/MobileHIG/Introduction/Introduction.html iOS Human Interface Guidelines]&lt;br /&gt;
* [https://developer.gnome.org/hig-book/stable/ GNOME Human Interface Guidelines]&lt;br /&gt;
* [https://medium.com/product-design/5ccef7b3e1fc Kuidas iOS lapikumaks muutub aja jooksul]&lt;br /&gt;
* [http://www.behance.net/rogeroddone Google Visual Asset Guidelines] - Google&#039;i ikonograafia loomisest&lt;br /&gt;
* [http://www.theverge.com/2013/8/29/4640308/dark-patterns-inside-the-interfaces-designed-to-trick-you Dark Patterns] - salakavalatest kasutajaliidese mustritest.&lt;br /&gt;
&lt;br /&gt;
[[Kategooria:Kasutajaliidesed]]&lt;/div&gt;</summary>
		<author><name>Roger</name></author>
	</entry>
</feed>