<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AndreaCammarata.com</title>
	<atom:link href="http://www.andreacammarata.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.andreacammarata.com</link>
	<description></description>
	<lastBuildDate>Wed, 12 Dec 2012 09:49:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.2</generator>
		<item>
		<title>Sencha Training in Italy &#8211; Rome 2013</title>
		<link>http://www.andreacammarata.com/news/sencha-training-italy-rome-2013.html</link>
		<comments>http://www.andreacammarata.com/news/sencha-training-italy-rome-2013.html#comments</comments>
		<pubDate>Wed, 12 Dec 2012 09:49:20 +0000</pubDate>
		<dc:creator>Andrea Cammarata</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.andreacammarata.com/?p=1294</guid>
		<description><![CDATA[Dopo numerose richieste pervenute negli ultimi anni, ecco finalmente arrivare anche in Italia, il primo training ufficiale Sencha su framework Ext JS 4.1 e l&#8217;app builder Sencha Architect. Questo corso di formazione è rivolto a tutti i developers con una solida conoscenza di javascript / CSS e ha l&#8217;obbiettivo specifico di rendervi immediatamente produttivi nello(...)]]></description>
			<content:encoded><![CDATA[<p>Dopo numerose richieste pervenute negli ultimi anni, ecco finalmente arrivare anche in Italia, il primo training ufficiale Sencha su framework Ext JS 4.1 e l&#8217;app builder Sencha Architect. Questo corso di formazione è rivolto a tutti i developers con una solida conoscenza di javascript / CSS e ha l&#8217;obbiettivo specifico di rendervi immediatamente produttivi nello sviluppo di applicazioni web mediante l&#8217;utilizzo di tali tecnologie. Verranno infatti trattate diverse caratteristiche e funzionalità del framework stesso e come poterne sfruttare al meglio l&#8217;architettura MVC. Ma non è tutto! Affronteremo insieme molti altri argomenti come la creazione di un tema personalizzato mediante SASS e COMPASS, la presentazione dei dati tramite il package Sencha Charts e molto altro ancora. Per avere informazioni dettagliate sul corso che avrà luogo a Roma, al Palazzo Valadier in Piazza del Popolo, e avrà la durata di ben quattro giorni, vi invito a consultare la <a href="http://www.sencha.com/company/events/feb-4-8-fast-track-to-ext-js-4-training-plus-sencha-architect-rome/" title="Sencha Training Rome 2013" target="_blank">pagina dedicata direttamente sul sito di Sencha</a>. Per esperienza personale, vi consiglio, se siete interessati, di confermare il prima possibile la vostra partecipazione. Le training class infatti, accettano solitamente un numero massimo di partecipanti, limite che viene raggiunto molto velocemente subito dopo la pubblicazione ufficiale del corso sul sito Sencha. Il training si terrà prevalentemente il lingua inglese, ma visto il mio affiancamento come insegnante, avrete sempre disponibile un riferimento italiano per tutta la durata del corso. Non mancate!</p>
<p><img src='http://www.andreacammarata.com/wp-content/uploads/2012/12/post-image.png'></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreacammarata.com/news/sencha-training-italy-rome-2013.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Sencha Italian Meetup Group</title>
		<link>http://www.andreacammarata.com/news/sencha-italian-meetup-group.html</link>
		<comments>http://www.andreacammarata.com/news/sencha-italian-meetup-group.html#comments</comments>
		<pubDate>Wed, 28 Nov 2012 23:36:08 +0000</pubDate>
		<dc:creator>Andrea Cammarata</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.andreacammarata.com/?p=1241</guid>
		<description><![CDATA[Spinto dal&#8217;interesse mostrato da numerosi sviluppatori nei vari Sencha Meetup groups dislocati in tutto il mondo, dopo il successo del primo workshop ufficiale ospitato in Italia e soprattutto, constatando la mancanza di un gruppo ufficiale anche qui in Italia, ho deciso di scrivere questo breve post al fine di avviare una discussione all&#8217;interno della quale(...)]]></description>
			<content:encoded><![CDATA[<p>Spinto dal&#8217;interesse mostrato da numerosi sviluppatori nei vari Sencha Meetup groups dislocati in tutto il mondo, dopo il successo del <a href="http://www.andreacammarata.com/events/sencha-workshop-milan.html" target="_blank">primo workshop ufficiale ospitato in Italia</a> e soprattutto, constatando la mancanza di un gruppo ufficiale anche qui in Italia, ho deciso di scrivere questo breve post al fine di avviare una discussione all&#8217;interno della quale potrete esprimere la vostra opinione nell&#8217;eventuale apertura del gruppo non dimenticando di comunicare in quale città vorreste quest&#8217;ultimo avesse luogo.<br />
Durante le sessioni del gruppo, che solitamente vengono tenute trimestralmente, sarà possibile confrontarsi con altri sviluppatori Ext JS / Sencha Touch italiani per discutere su eventuali problematiche legate allo sviluppo di applicazioni web e mobile, mediante l&#8217;utilizzo di tali framework, oltre ad avere la possibilità di presentare e far conoscere i propri lavori. Ogni sessione, inoltre, sarà accompagnata da slides professionali create ad hoc da sviluppatori qualificati, al fine di affrontare tematiche sempre nuove come ad esempio lo sviluppo di componenti personalizzati, come creare un tema per le vostre applicazioni utilizzando SASS e COMPASS, ecc.<br />
In questo modo, i partecipanti alle prime armi con queste tecnologie, avranno modo di confrontarsi con sviluppatori più esperti permettendogli di acquisire tecniche altrimenti difficili da assimilare, mentre quest&#8217;ultimi, avranno sicuramente modo di imparare qualcosa di nuovo o eventualmente colmare alcune lacunee dovute, ahimè, alla scarsità di risorse in lingua italiana su quelli che ad oggi sono i più evoluti e diffusi framework per lo sviluppo di web e mobile applications.</p>
<p>Se siete interessati ai prodotti Sencha, questo è il momento di farsi sentire! Non mi resta altro che aspettare i vostri commenti prima di decidere se prendere tale impegno, dipende tutto da voi quindi, non siate timidi!</p>
<p><img src='http://www.andreacammarata.com/wp-content/uploads/2012/11/post-image1.jpg'></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreacammarata.com/news/sencha-italian-meetup-group.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Sencha Workshop Milan</title>
		<link>http://www.andreacammarata.com/events/sencha-workshop-milan.html</link>
		<comments>http://www.andreacammarata.com/events/sencha-workshop-milan.html#comments</comments>
		<pubDate>Wed, 28 Nov 2012 18:14:04 +0000</pubDate>
		<dc:creator>Andrea Cammarata</dc:creator>
				<category><![CDATA[Events]]></category>

		<guid isPermaLink="false">http://www.andreacammarata.com/?p=1221</guid>
		<description><![CDATA[A pochi giorni di distanza dal workshop Sencha tenuto a Milano grazie alla collaborazione di CM First il giorno 22 Novembre 2012, eccomi finalmente tornare a scrivere un piccolo post che racchiude le mie considerazioni ed un piccolo riassunto, di quello che è stato il primo workshop ufficiale Sencha in Italia. Occorre innanzitutto elogiare la(...)]]></description>
			<content:encoded><![CDATA[<p>A pochi giorni di distanza dal workshop <a href="http://www.sencha.com" title="Sencha" target="_blank">Sencha</a> tenuto a Milano grazie alla collaborazione di <a href="http://www.cmfirstgroup.com" title="CM First" target="_blank">CM First</a> il giorno 22 Novembre 2012, eccomi finalmente tornare a scrivere un piccolo post che racchiude le mie considerazioni ed un piccolo riassunto, di quello che è stato il primo workshop ufficiale Sencha in Italia. Occorre innanzitutto elogiare la professionalità e disponibilità di CM First, i quali, in quanto partner autorizzati Sencha, hanno travato il giusto accordo che finalmente permettesse di ospitarne un evento anche su territorio nazionale, e poter così introdurre i numerosi partecipanti ai vari prodotti distribuiti dalla società leader nella distribuzione di soluzioni HTML5 based per lo sviluppo di applicazioni web e mobile cross-browser.<br />
Le richieste di partecipazione all&#8217;evento sono state numerose e purtroppo non è stato possibile accettarle tutte a causa della capienza della sala, la quale, pur essendo non eccessivamente grande, è riuscita ad ospitare all&#8217;incirca cinquanta partecipanti, che, dopo una breve introduzione di Mauro Pugliese (Country Mager di CM Firts) sulla compagnia e sulla partnership con Sencha, sono stati guidati da Mike Misher (Sales Director Sencha), alla scoperta dei vari prodotti e tecnologie distribuite da Sencha e dei vantaggi che è possibile trarre sviluppando applicazioni web e mobile cross-browser sfruttando i framework Ext JS e Sencha Touch.</p>
<div id="attachment_1228" class="wp-caption aligncenter" style="width: 705px"><a href="http://www.andreacammarata.com/wp-content/uploads/2012/11/1.jpg" rel="prettyPhoto[1221]"><img src="http://www.andreacammarata.com/wp-content/uploads/2012/11/1.jpg" alt="Sencha Workshop Milan - Andrea Cammarata Sencha Solutions Engineer" title="1" width="695" height="521" class="size-full wp-image-1228" /></a><p class="wp-caption-text">In attesa dei partecipanti&#8230;</p></div>
<p>A seguire, è stato mio compito quello di fornire maggiori informazioni su Sencha Touch e l&#8217;app builder Sencha Architect effettuando una dettagliata panoramica sulle sue funzionalità e User Interface mostrandone le semplice e intuitiva interfaccia Drag &#038; Drop che permette, con un po di esperienza e familiarità dei frameworks, di poter creare in poco tempo, ricche applicazioni desktop e mobile oriented.<br />
Infine, si è entrato nel vivo della presentazione, guidando i partecipanti nella creazione di una semplice applicazione mobile sfruttando tecnologie e tools appena menzionati e fornendo consigli di come poterla strutturare al meglio sfruttando il pattern MVC.</p>
<div id="attachment_1226" class="wp-caption aligncenter" style="width: 705px"><a href="http://www.andreacammarata.com/wp-content/uploads/2012/11/2.jpg" rel="prettyPhoto[1221]"><img src="http://www.andreacammarata.com/wp-content/uploads/2012/11/2.jpg" alt="" title="Sencha Workshop Milan - Andrea Cammarata Sencha Solutions Engineer" width="695" height="282" class="size-full wp-image-1226" /></a><p class="wp-caption-text">Presentazione Sencha Touch 2</p></div>
<p>Dopo aver inoltre mostrato come integrare le REST API sviluppate, sono state mostrare le rimanenti features previste dall&#8217;applicazione che, purtroppo, per via del tempo a disposizione, non mi è stato possibile spiegarne la realizzazione, ma che sono state comunque mostrate ai partecipanti aprendo l&#8217;applicazione completa, sviluppata qualche giorno prima della presentazione.<br />
Infine, dopo aver fornito alcuni spunti e esempi pratici su come modificare e migliorare il tema dell&#8217;applicazione stessa utilizzando SASS e COMPASS, il workshop si è chiuso con una sessione di trenta minuti circa di domande e risposte dove, anche grazie a Daniel Gallo (Sales Engineer Sencha) sono state fornite tutte le risposte alle numerose domande e dubbi sollevati dai partecipati, i quali, proprio grazie a quest&#8217;ultimi, si sono mostrati molto interessati ai prodotti Sencha.</p>
<p>In conclusione, posso decisamente affermare che l&#8217;obbiettivo del workshop è stato centrato in pieno, essendo riusciti positivamente a &#8220;stuzzicare l&#8217;appetito&#8221; delle persone in sala fornendogli gli input fondamentali che gli consentiranno di muovere i loro primi passi in Sencha Architect e a sviluppare così la loro prima applicazione mobile e spingendoli di conseguenza a valutare Sencha Touch come una più che valida alternativa allo sviluppo di applicazioni native.</p>
<p>La speranza ora, è quella di poter avere maggiori eventi e training ufficiali Sencha anche in Italia, in modo tale da dare la possibilità anche a molti altri sviluppatori, di toccare con mano queste tecnologie, avvicinandosi così al mondo Sencha e, soprattutto, di non lasciare tagliata fuori, come purtroppo accade troppo spesso, la nostra bene amata patria, da tutte queste fantastiche novità che il web ci mette oggi a disposizione e che, mi purtroppo mi duole dirlo, il resto del mondo ha già scoperto e sta già utilizzando ormai da diversi anni.</p>
<p><img src='http://www.andreacammarata.com/wp-content/uploads/2012/11/post-image.jpg'></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreacammarata.com/events/sencha-workshop-milan.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ext.tux.AudioCover &#8211; Parte 5</title>
		<link>http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-5.html</link>
		<comments>http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-5.html#comments</comments>
		<pubDate>Mon, 20 Aug 2012 08:05:58 +0000</pubDate>
		<dc:creator>Andrea Cammarata</dc:creator>
				<category><![CDATA[Sencha Touch 2]]></category>

		<guid isPermaLink="false">http://www.andreacammarata.com/?p=1162</guid>
		<description><![CDATA[9. Download e Anteprima Siamo finalmente giunti alla conclusione di questo Tutorial. Spero che la lettura sia stata piacevole, di facile comprensione, che abbiate apprezzato l&#8217;argomento trattato e, soprattutto, che le basi fornite siano state sufficienti per scatenare la vostra creatività ed invogliarvi allo sviluppo di un vostro componente personalizzato. Se così fosse, mi raccomando,(...)]]></description>
			<content:encoded><![CDATA[<h2>9. Download e Anteprima</h2>
<p>Siamo finalmente giunti alla conclusione di questo Tutorial. Spero che la lettura sia stata piacevole, di facile comprensione, che abbiate apprezzato l&#8217;argomento trattato e, soprattutto, che le basi fornite siano state sufficienti per scatenare la vostra creatività ed invogliarvi allo sviluppo di un vostro componente personalizzato. Se così fosse, mi raccomando, non mancate di mandarmi il link ad un vostro articolo, ad un&#8217;applicazione o ad un&#8217;anteprima del vostro componente. Tenete sempre bene in mente che Sencha vanta di una numerosissima community, quindi non dimenticate di condividere il vostro lavoro, laddove fosse possibile, e iniziare quindi a far conoscere il vostro nome oltre che le vostre creazioni.<br />
Infine, se avete apprezzato l&#8217;articolo, o se avete qualsiasi tipo di domanda, sentitevi liberi di commentare questo post e vi risponderò non appena possibile. Sono sempre graditi feedback positivi e negativi purchè costruttivi, quindi aspetterò con ansia i vostri commenti <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
Bene, a questo punto non mi resta altro che salutarvi comunicando due link molto importanti, ciao ragazzi, al prossimo tutorial <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><center><br />
<a target="_blank" href="https://github.com/AndreaCammarata/Ext.tux.AudioCover">Repository github.</a></p>
<p><a href="http://www.andreacammarata.com/examples/sencha-touch/ext-tux-audiocover/">Applicazione di esempio Online</a><br />
</center></p>
<p><img src='http://www.andreacammarata.com/wp-content/uploads/2012/08/post-icon-5.png'></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-5.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Ext.tux.AudioCover &#8211; Parte 4</title>
		<link>http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-4.html</link>
		<comments>http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-4.html#comments</comments>
		<pubDate>Mon, 20 Aug 2012 08:04:56 +0000</pubDate>
		<dc:creator>Andrea Cammarata</dc:creator>
				<category><![CDATA[Sencha Touch 2]]></category>

		<guid isPermaLink="false">http://www.andreacammarata.com/?p=1143</guid>
		<description><![CDATA[8. Il file SASS Per concludere lo sviluppo del nostro componente, non ci resta che creare il file SASS che, una volta compilato insieme al resto del tema dell&#8217;applicazione, fornirà tutti gli stili necessari ai vari elementi HTML al fine di creare l&#8217;interfaccia utente che abbiamo creato. Qualora non abbiate molte dimestichezza con SASS, vi(...)]]></description>
			<content:encoded><![CDATA[<h2>8. Il file SASS</h2>
<p>Per concludere lo sviluppo del nostro componente, non ci resta che creare il file SASS che, una volta compilato insieme al resto del tema dell&#8217;applicazione, fornirà tutti gli stili necessari ai vari elementi HTML al fine di creare l&#8217;interfaccia utente che abbiamo creato.<br />
Qualora non abbiate molte dimestichezza con SASS, vi consiglio di dare un&#8217;occhiata ai vari <a href="http://sass-lang.com/tutorial.html">tutorials presenti sul sito ufficiale</a>.<br />
Per via del tempo a disposizione, in questo post non vi spiegherò per filo e per segno come creare un file .sass, dove posizionarlo e come compilarlo, ma mi limiterò a descrivere le varie regole CSS applicate a tutti gli elementi che compongono la UI. Non preoccupatevi comunque, probabilmente nei prossimi giorni scriverò un altro breve articolo che vi illustrerà nel dettaglio come creare una semplice applicazione che, utilizzando il componente Ext.tux.Audio appena creato all&#8217;interno di un DataView, vi permetterà di ricreare una lista di brani stile iTunes ed affronteremo anche questo discorso. Nel frattempo, potrete trovarne il codice sorgente di questa applicazione, all&#8217;interno del repository che verrà riportato al fondo di questo articolo.</p>
<h3>8.1. Definizione del mixin</h3>
<p>La prima cosa da fare quando sviluppate un componente è quella di definire immediatamente un &#8220;<strong>mixin</strong>&#8221; SASS ad esso associato. Un &#8220;mixin&#8221; infatti, vi permetterà di definire un blocco di regole CSS che potranno essere riutilizzate all&#8217;interno del tema della vostra applicazione, semplicemente andandolo ad includere all&#8217;interno di altri elementi oppure all&#8217;interno del file SASS del tema stesso.<br />
Questa logica è la medesima adottata dal framework stesso, infatti, se provate a dare un&#8217;occhiata all&#8217;interno della cartella SASS contenuta all&#8217;interno dell&#8217;SDK, noterete che sono definiti &#8220;mixin&#8221; per ognuno dei componenti standard.<br />
Esiste infatti un mixing per contenere tutti gli stili relativi al componente &#8220;Ext.Panel&#8221;, un altro per gli &#8220;Ext.Button&#8221;, e cosi via, quindi cerchiamo di adattarci e sforzarci a mantenere la stessa filosofia. In questo modo sarà molto più semplice non solo rivisitare il codice in caso vogliate apportare una modifica, ma l&#8217;applicazione risulterà essere anche molto più ordinata e leggibile anche da tutti gli altri membri della community, che, pur non avendo partecipato attivamente alla realizzazione del componente, sono sicuro vi saranno senz&#8217;altro grati per aver mantenuto lo standard <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
Vediamo quindi come definire il &#8220;mixin&#8221;.</p>
<pre class="brush: css; title: ; notranslate">
/**
 * Includes Ext.tux.AudioCover styles.
 *
 * @member Ext.tux.AudioCover
 */
@mixin sencha-tux-audiocover {

}
</pre>
<p>Dfficile? Non credo proprio <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .<br />
Tutto quello che dovremo fare ora sarà quello di includere il nostro &#8220;mixin&#8221; all&#8217;interno del file .scss che definisce gli stili relativi al tema della nostra applicazione (ricordandosi di aver prima incluso tutti i file .scss necessari, altrimenti in fase di compilazione, COMPASS ci segnalerà giustamente un errore, riferendoci che il &#8220;mixin&#8221; richiesto non è stato trovato).<br />
Quindi, una volta inclusi tutti i files necessari, andiamo ad importarlo tramite l&#8217;istruzione</p>
<pre class="brush: css; title: ; notranslate">
@include sencha-tux-audiocover;
</pre>
<p>A questo punto compilando il tema dell&#8217;applicazione di fatto non sarà cambiato nulla all&#8217;interno del file CSS generato, ma capirete benissimo che questo è dovuto al fatto che non abbiamo ancora specificato nessuna regola al suo interno, quindi procediamo con la definizione di alcune variabili e, a seguire, gli stili relativi alla creazione del &#8220;cardEl&#8221;, al quale, non dimentichiamo, abbiamo impostato la classe &#8220;<strong>x-flip-card</strong>&#8221; durante la definizione del Template, e gli stili della faccia anteriore e posteriore.</p>
<h3>8.2. Le Variabili</h3>
<p>Essendo un componente piuttosto complesso dal punto di vista degli elementi che ne compongono la UI, abbiamo bisogno di un piccolo aiuto al fine di farli &#8220;quadrare&#8221; tutti impostandone correttamente dimensione e posizionamento. Proprio a questo proposito SASS ci viene incontro dandoci la possibilità di definire alcune variabili che ci semplificheranno notevolmente questo lavoro ed eviteranno inutili ridondanze all&#8217;interno del medesimo &#8220;mixin&#8221;. Come abbiamo visto in precedenza infatti, il posizionamento di tutti gli elementi circolari addetti alla costruzione della progress bar all&#8217;interno del componente, dovrà essere concentrico all&#8217;interno della faccia posteriore e dovranno essere tutti della medesima dimensione.<br />
Capirete bene a questo punto che qualora, per esempio, decidessimo di modificare la dimensione del &#8220;cardEl&#8221;, dovremmo di conseguenza andare ad aggiornare manualmente la dimensione di tutti questi elementi, oltre che i rispettivi margini. Definendo delle variabili invece, qualora si presentasse questa necessità, modificando il valore di una sola variabile, tutti gli elementi verranno posizionati correttamente in fase di compilazione, poichè dimensione e posizionamento saranno valori calcolati dinamicamente sulla base della dimensione del container e non semplici valori statici. Procediamo quindi con la definizione di tutte le variabili di cui avremo bisogno per l&#8217;impostazione dei vari stili.</p>
<pre class="brush: css; title: ; notranslate">
/**
 * Includes Ext.tux.AudioCover styles.
 *
 * @member Ext.tux.AudioCover
 */
@mixin sencha-tux-audiocover {

    $size: 50px;
    $margin: 5px;
    $button-size: ($size * 40) / 100;
    $button-icon-size: ($size * 15) / 100;

}
</pre>
<p>La spiegazione è molto semplice nonchè intuitiva: La variabile &#8220;<strong>$size</strong>&#8221; andrà a definire la dimensione del &#8220;coverEl&#8221; e, di conseguenza, la dimensione dei vari elementi circolari che compongono la &#8220;progressBar&#8221;, tenendo conto del &#8220;<strong>$margin</strong>&#8221; impostato. Se quindi la dimensione impostata è di 50px, tenendo in considerazione i 5px di margin, la dimensione di tali elementi sarà di 40px.<br />
La variabile &#8220;<strong>$button-size</strong>&#8221; invece, ci fornisce la dimensione del pulsante di stop, che, come potete vedere, sarà esattamente pari al 40% della dimensione complessiva del &#8220;cardEl&#8221;, mentre la relativa icona calcolata all&#8217;interno della variabile &#8220;<strong>$button-icon-size</strong>&#8221; avrà una dimensione pari al 15%.<br />
Vi sembra ragionevole? Bene, allora passiamo alla definizione degli stili del &#8220;cardEl&#8221; container e delle relative facce.</p>
<h3>8.3. Il cardEl e le sue facce</h3>
<p>Passiamo quindi alla definizione degli stili del &#8220;cardEl&#8221; e delle sue facce, quindi, sempre all&#8217;interno del &#8220;mixin&#8221;, subito al di sotto della dichiarazione delle variabili, andiamo ad aggiungere quanto segue:</p>
<pre class="brush: css; title: ; notranslate">
.x-tux-audiocover {

    .x-flip-card {

        width: $size;
        height: $size;

        -webkit-transform-style: preserve-3d;
        -webkit-transition: -webkit-transform 1s;

        .x-face {

            position: absolute;
            width: 100%;
            height: 100%;
            -webkit-backface-visibility: hidden;

            &amp;.x-front {
                background-size: 100% 100% !important;
                border: solid 1px #d4d4d4; 
            }

            &amp;.x-back {

                @include display-box;
                @include box-pack(center);
                @include box-align(center);

                -webkit-transform: rotateY(180deg);
                -webkit-box-sizing: border-box;

            }

        }
    
    }

}
</pre>
<p>Come avrete sicuramente notato, il nodo root del nostro foglio di stile sarà la classe &#8220;<strong>x-tux-audiocover</strong>&#8221; che, come abbiamo visto in precedenza nel paragrafo relativo ai parametri di configurazione del componente, abbiamo impostato come &#8220;baseCls&#8221;.<br />
In questo modo, tutti i vari stili che andremo a definire al suo interno, saranno relativi solamente al nostro componente.<br />
Ora, partendo dalla classe &#8220;<strong>x-flip-card</strong>&#8221; possiamo notare come ne venga impostata la dimensione che abbiamo specificato tramite la variabile <strong>$size</strong>. Inoltre, come già accennato, viene impostata la proprietà addetta a preservare il posizionamento 3d di tutti i suoi elementi figli e la durata delle animazioni di trasformazione a 1 secondo. Qualora vogliate rallentare o accelerare la velocità dell&#8217;animazione, allora non dovrete fare altro che modificare tale valore a vostro piacimento.<br />
Per quanto riguarda le facce, queste verranno posizionate in modalità &#8220;<strong>absolute</strong>&#8221; all&#8217;interno del container, avranno una dimensione pari al 100% sia in larghezza che in altezza rispetto il &#8220;cardEl&#8221; contenitore e ne verranno nascoste le facce posteriori di ognuna di queste. Se avete una leggera dimestichezza con il 3d, considerate questa regola come l&#8217;unico modo per mostrare le sole facce dalle quali partono perpendicolarmente le normali che compongono un poligono., mentre, quelle alle loro spalle, verranno oscurate.<br />
In questo modo si eviteranno problemi di rendering durante l&#8217;animazione Flip di transizione.<br />
Avrete sicuramente notato inoltre che per la sola faccia contenente la cover del brano, avente classe &#8220;<strong>x-front</strong>&#8220;, viene impostata la proprietà che impone all&#8217;immagine di background, di occupare il 100% dello spazio disponibile, andandola eventualmente a rimpicciolire o ingrandire al fine di occupare perfettamente lo spazio disponibile, mentre per la faccia contenente la progress bar di avanzamento, avente appunto classe &#8220;<strong>x-back</strong>&#8221; verrà impostata un layout di tipo  &#8220;box&#8221; andando a centrare tutti i suoi elementi figli sia verticalmente che orizzontalmente.<br />
Infine, non dimenticate che quest&#8217;ultima faccia, così come abbiamo già accennato, dovrà essere posizionata &#8220;spalle contro spalle&#8221; con quella frontale, semplicemente ruotandola di 180° sull&#8217;asse Y. Questo conferirà quel senso di tridimensionalità durante l&#8217;animazione di transizione.</p>
<h3>8.4. Il pulsante di Stop</h3>
<p>Così come tutti gli elementi che compongono la UI, anche il pulsante di stop ha bisogno di alcuni stili base addetti ad impostarne la sua dimensione, la dimensione della sua icona ecc. Essendo tali regole molti semplici da comprendere, non mi soffermerò a spiegare il significato di ognuna di queste, ma mi limiterà ad elencarle.<br />
L&#8217;unica cosa che dovrete tenere a mente è che, poichè tale pulsante verrà renderizzato all&#8217;interno della faccia posteriore, occorrerà definire tutte queste regole all&#8217;interno del blocco &#8220;x-back&#8221; così come mostrato qui di seguito.</p>
<pre class="brush: css; title: ; notranslate">
...
                &amp;.x-back {

                    @include display-box;
                    @include box-pack(center);
                    @include box-align(center);

                    -webkit-transform: rotateY(180deg);
                    -webkit-box-sizing: border-box;

                    .x-button {

                        @include border-radius($size);
                        min-height: $button-size;
                        width: $button-size;
                        height: $button-size;

                        .x-button-icon {

                            width: $button-icon-size;
                            height: $button-icon-size;
                            -webkit-mask-size: $button-icon-size;
                            -webkit-mask-repeat: no-repeat;
                            margin: 1px -3px;
                            background: #4F4F4F;

                        }

                    }
...
</pre>
<p>Infine, poichè abbiamo impostato una UI ad un&#8217;icona di default all&#8217;interno delle configurazioni, sarà necessario definirle, in modo tale che il CSS contenga tutti gli elementi di cui il pulsante ha bisogno. Quindi:</p>
<pre class="brush: css; title: ; notranslate">
@include pictos-iconmask('stop');
</pre>
<p>Con questa semplice istruzione, includeremo la mask icon che verrà utilizzata dal pulsante stesso per visualizzare la classica icona a forma di piccolo quadrato che caratterizza i classici pulsanti di stop.<br />
Infine, avremo anche bisogno della seguente istruzione</p>
<pre class="brush: css; title: ; notranslate">
@include sencha-button-ui('white', #FFF);
</pre>
<p>che servirà a definire una nuova UI avente il bianco come colore di sfondo e che verrà applicato al pulsante.</p>
<h3>8.5. Proprietà comuni a più elementi</h3>
<p>Come abbiamo già accennato più di una volta, tutti gli elementi addetti alla composizione della progress bar, dovranno avere la stessa posizione, dimensione e avere la medesima forma circolare.<br />
Per questo motivo, onde evitare inutili ridondanze, andiamo ora a definire un set di regole che verranno applicate all&#8217;elemento &#8220;<strong>progressEl</strong>&#8221; (alla quale ricordiamo è stata impostata la classe base &#8220;<strong>x-progress</strong>&#8220;), agli elementi &#8220;<strong>x-slice</strong>&#8221; contenitori ed agli elementi slices veri e propri.</p>
<pre class="brush: css; title: ; notranslate">
...
                   .x-progress, .x-progress .x-slice, .x-progress .x-slice div {

                        @include border-radius($size / 2);

                        position: absolute;
                        top: 0;
                        left: 0;
                        width: $size - ($margin * 2);
                        height: $size - ($margin * 2);
    
                    }
...
</pre>
<p>Ricordiamoci che, anche in questo caso, le proprietà sopra menzionate, essendo relative alla faccia posteriore del nostro &#8220;cardEl&#8221;, andranno definite all&#8217;interno del blocco &#8220;<strong>x-back</strong>&#8220;.</p>
<h3>8.6. Chiudiamo con gli Slices</h3>
<p>Abbiamo ormai quasi concluso l&#8217;impostazione degli stili di tutti gli elementi che compongono il nostro componente, ma, come i più attenti di voi avranno sicuramente notato, l&#8217;ultima cosa che ci manca sono le proprietà relative all&#8217;elemento container &#8220;x-progress&#8221; e degli slices figli.<br />
Facciamo quindi un ultimo sforzo ed analizziamo l&#8217;ultima manciata di regole.</p>
<pre class="brush: css; title: ; notranslate">
                 .x-progress {

                        @include display-box;
                        @include box-pack(center);
                        @include box-align(center);

                        margin: $margin;
                        background-color: #FFF;
                        border: solid 1px #BBB;

                        .x-slice {

                            &amp;.x-half {

                                clip: rect(0px, $size, $size, $size / 2 - $margin);
                                div {
                                    clip: rect(0px, $size / 2 - $margin , $size, 0);
                                    @include rotate(0deg);
                                }                

                            }

                            &amp;.x-end {

                                clip: rect(0px, $size / 2 - $margin, $size, 0);
                                div {
                                    clip: rect(0, $size / 2 - $margin , $size, 0);
                                    @include rotate(180deg);
                                }

                            }

                            div {
                                background-color: #3f89ee;
                            }

                        }

                    }

</pre>
<p>Partendo dall&#8217;elemento &#8220;x-progress&#8221; noterete senz&#8217;altro che è stato solamente impostato il medesimo layout della classe &#8220;x-back&#8221;, ovvero di tipo &#8220;box&#8221; preoccupandoci del fatto che tutti i figli vengano perfettamente centrati ed allineati al suo interno.<br />
Potete inoltre notare come per i nodi &#8220;x-slice&#8221; vengano applicate le proprietà di &#8220;clip&#8221; così come mostrato delle figure visualizzate in uno dei post precedenti, ovvero andandone a nascondere solamente una parte e seguendo una disposizione a specchio.<br />
Infine, entrambi i nodi div figli delle classi &#8220;x-half&#8221; (alias &#8220;slice1&#8243;) e &#8220;x-end&#8221; (alias &#8220;slice2&#8243;), vengono riempiti con un colore di background tendente all&#8217;azzurro, in modo tale che, durante la loro rotazione, tale colore vada pian piano a sostituire il colore bianco di sfondo del componente, simulando di conseguenza, una progress bar in fase di aggiornamento costante. Semplice non è vero? <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
Non dimenticate inoltre che, sempre per via della disposizione a specchio illustrata in uno dei paragrafi precedenti, lo slice avente classe &#8220;x-end&#8221; (alias slice2), ovvero quello avente il ruolo di ricoprire la seconda metà della progress bar, dovrà essere ruotato di 180° lungo l&#8217;asse Y.</p>
<p style="text-align: right;"><a href="http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-5.html">Quinta ed Ultima Parte >></a></p>
<p><img src='http://www.andreacammarata.com/wp-content/uploads/2012/08/post-icon-4.png'></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-4.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ext.tux.AudioCover &#8211; Parte 3</title>
		<link>http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-3.html</link>
		<comments>http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-3.html#comments</comments>
		<pubDate>Mon, 20 Aug 2012 08:03:20 +0000</pubDate>
		<dc:creator>Andrea Cammarata</dc:creator>
				<category><![CDATA[Sencha Touch 2]]></category>

		<guid isPermaLink="false">http://www.andreacammarata.com/?p=1102</guid>
		<description><![CDATA[5. Parametri di configurazione Ogni componente che si rispetti deve fornire un set di parametri di configurazione pubblici che l&#8217;utente possa modificare a suo piacimento al fine di venire incontro ai requisiti richiesti dall&#8217;applicazione in cui questo viene utilizzato, quindi, anche nel nostro caso, tali parametri non dovranno venir meno. Al momento mi vengono in(...)]]></description>
			<content:encoded><![CDATA[<h2>5. Parametri di configurazione</h2>
<p>Ogni componente che si rispetti deve fornire un set di parametri di configurazione pubblici che l&#8217;utente possa modificare a suo piacimento al fine di  venire incontro ai requisiti richiesti dall&#8217;applicazione in cui questo viene utilizzato, quindi, anche nel nostro caso, tali parametri non dovranno venir meno. Al momento mi vengono in mente almeno una decina di diverse configurazioni che potremo esporre, ma per ora ci limiteremo a quelle essenziali, senza le quali, il nostro ux sarebbe inutile.<br />
Probabilmente vi starete chiedendo di quali configurazioni sto parlando, e, se così fosse, lasciatevi consigliare una pausa accompagnata da un buon  caffè nero fumante, perchè se non ci siete ancora arrivati, molto probabilmente avete solamente bisogno di un break <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Lo so lo so, rientrare dalle vacanze estive e dura per tutti, ma un buon caffè vi aiuterà a digerire al meglio il resto di questo tutorial <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Fatto? Benissimo! Possiamo ora riprendere andando a specificare le uniche configurazioni assolutamente necessarie per il nostro componente</p>
<pre class="brush: jscript; title: ; notranslate">
/**
 * @class Ext.tux.AudioCover
 * @extend Ext.Audio
 * @author Andrea Cammarata
 */
Ext.define('Ext.tux.AudioCover',{
    extend: 'Ext.Audio',
    xtype: 'audiocover',
    config: {  
    
        /**
         * @cfg coverUrl
         * The url of the picture used as the cover of the audio file.
         * @accessor
         */
        coverUrl: null,

        /**
         * @cfg {Object} stopButton
         * The configuration for the stop button.
         */
        stopButton: {
            iconMask: true,
            iconCls: 'stop',
            ui: 'white'
        }

    },
    cachedConfig: {

        /**
         * @cfg baseCls
         * The base CSS class used to render the component.
         * @accessor
         */
        baseCls: 'x-tux-audiocover',

       /**
         * @cfg enableControls
         * Hide the default browser controls because we are going
         * to provide a custom UI to control the audio file.
         * @accessor
         */
        enableControls: false
    
    },
    ...
</pre>
<p>Come avrete sicuramente notato, ho definito due diverse tipologie di configurazioni: &#8220;config&#8221; e &#8220;cachedConfig&#8221;.<br />
La prima, così come accennato poco fa, permette di esporre alcune proprietà che potranno essere personalizzate dall&#8217;utente di modo tale da poterlo personalizzare, la seconda invece, ci consentirà di configurare il componente tramite alcune impostazioni che verranno mantenute private e quindi non esposte all&#8217;utente.<br />
Partendo dalle configurazioni pubbliche, noterete che abbiamo definito, in primis, la proprietà &#8220;<strong>coverUrl</strong>&#8220;. Come facilmente intuibile anche leggendo i commenti presenti all&#8217;interno del codice stesso, modificandone il valore, l&#8217;utente avrà la possibilità di specificare l&#8217;url dell&#8217;immagine che verrà utilizzata come copertina del brano al quale questa sarà associato. La seconda configurazione invece, denominata &#8220;<strong>stopButton</strong>&#8220;, verrà invece utilizzata per specificare alcuni parametri di configurazione utilizzati per la creazione del pulsante di Stop del brano. Come vedete, sono stati specificati alcuni valori di default, ma nulla vi vieterà di poterli modificare in fase di definizione del componente, nel caso, per esempio, vogliate modificarne l&#8217;icona, il colore, ecc. Semplice non è vero?  Alcuni di voi si staranno sicuramente chiedendo: &#8220;Se queste sono le uniche configurazioni pubbliche esposte dal componente, dove andremo a specificare l&#8217;url del file audio da riprodurre?&#8221; Ahiaiaiii, se questo è il vostro caso avete sicuramente bisogno di un altro caffè <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Tenete sempre bene a mente che stiamo estendendo il componente base &#8220;Ext.Audio&#8221;, perciò oltre a quella da noi definita, avremo a disposizione anche tutte quelle rese pubbliche dal componente esteso, per questo motivo la risposta alla vostra domanda è semplice: L&#8217;url del file audio da riprodurre andrà specificato tramite il parametro di configurazione &#8220;<strong>url</strong>&#8221; esposto, per l&#8217;appunto, dal componente &#8220;Ext.Audio&#8221;.<br />
Per quanto riguarda la proprietà &#8220;<strong>baseCls</strong>&#8221; definita all&#8217;interno dell&#8217;oggetto &#8220;cachedConfig&#8221;, non c&#8217;è molto da dire, se non il fatto che questa configurazione ci permetterà di definire tutti gli stili CSS necessari a renderizzare correttamente il componente. Tutto qui!<br />
Infine, sempre all&#8217;interno della &#8220;cachedConfig&#8221; potete notare un&#8217;altra configurazione denominata &#8220;<strong>enableControls</strong>&#8221; impostata a valore false. Questo perchè il browser visualizza una user interface di default che permette all&#8217;utente di controllare il file audio, ma, siccome è nostro intento quello di definirne una personalizzata, dobbiamo chiedere al browser di non mostrare quella di default in quanto non ne abbiamo bisogno. Molto bene, ora che la definizione delle configurazioni del componente è conclusa, passiamo ad analizzare le varie funzioni di cui avremo bisogno.</p>
<h2>6. Solo 8 funzioni?!</h2>
<p>Vi sembrerà assurdo ma tutto quello di cui abbiamo bisogno ora sono solamente otto funzioni che serviranno a dare vita al nostro componente.<br />
Andiamole quindi ad analizzare singolarmente.</p>
<h3>6.1. Inizializzazione</h3>
<p>Ogni componente deve essere inizializzato prima di poter essere utilizzato</p>
<pre class="brush: jscript; title: ; notranslate">
   /**
     * Component initialization function.
     * @private
     */
    initialize: function(){

        var me = this;

        /* Set the listeners to the Ext.Audio functions
         * that will allow us to syncronize the progress time
         * with the slices childs rotation. */
        me.on({
            timeupdate: 'onUpdateTime',
            ended: 'showFront',
            scope: me
        });

        /* Set the handler on the cover element to show the back
         * face when the user tap on it. */
        me.coverEl.on('tap', 'showBack', me);

        // Initialize the Ext.Audio component
        me.callParent(arguments);
    
    }
</pre>
<p>Penso sia abbastanza inutile spendere ulteriori parole su queste funzioni visto che i commenti presenti nel codice parlano da soli, ma, in breve:<br />
La funzione &#8220;<strong>initialize</strong>&#8221; ci permette, come avrete capito, di inizializzare il nostro componente. Tutto ciò che ho fatto, è stato di impostare dei listeners a sue degli eventi esposti dal componente base &#8220;Ext.Audio&#8221; al fine di poter sincronizzare la rotazione di avanzamento riproduzione tramite la chiamata alla funzione &#8220;<strong>onUpdateTime</strong>&#8221; e di riportare il componente sulla faccia di copertina non appena la riproduzione dell&#8217;audio ad esso collegato sarà terminata, tramite chiamata alla funzione &#8220;<strong>showFront</strong>&#8220;. Da notare inoltre come è stato anche impostato un handler all&#8217;evento tap dell&#8217;elemento contenente la copertina del brano. In questo modo, non appena l&#8217;utente la toccherà, verrà visualizzata la faccia posteriore contenente la progressbar circolare, tramite la chiamata alla funzione &#8220;<strong>showBack</strong>&#8220;. A questo punto l&#8217;inizializzazione del componente è terminata!</p>
<h3>6.2. L&#8217;effetto Flip di transizione</h3>
<p>Ora che l&#8217;inizializzazione del componente è conclusa, diamo un&#8217;occhiata a tre semplici funzioni che permetteranno al componente di mostrare, tramite un&#8217;effetto di transizione cosiddetto &#8220;Flip&#8221;, la faccia frontale contenente la copertina del brano, oppure quella posteriore contenente la barra di avanzamento circolare addetta a visualizzare lo stato di riproduzione del brano.</p>
<pre class="brush: jscript; title: ; notranslate">
   /**
     * Show the cover face and stop the audio.
     */
    showFront: function(){
        this.flip(true);
    },
    
    /**
     * Show the progressbar face and start the audio.
     */
    showBack: function(){
        this.flip(false);
    },

    /**
     * Flip the card to the front / back face after
     * playing / stopping the audio file.
     * @param {Boolean} toFront True to show the front cover face, otherwise
     * will be shown the back progressbar one.
     * @private
     */
    flip: function(toFront){
    
        // Play or stop tha audio file
        this[toFront ? 'stop' : 'play']();
    
        // Flip the card element
        this.cardEl.setStyle('-webkit-transform', Ext.String.format('rotateY({0}deg)', toFront ? 0 : 180));
    
    }
</pre>
<p>Come potete notare abbiamo definito due semplici funzioni chiamate &#8220;<strong>showFront</strong>&#8221; e &#8220;<strong>showBack</strong>&#8220;, il cui compito è semplicemente quella di richiamare una terza funzione denominata &#8220;<strong>flip</strong>&#8221; passando un parametro true, nel caso si voglia mostrare la faccia anteriore, oppure false nel caso la faccia da visualizzare fosse quella posteriore. La funzione &#8220;flip&#8221;, a questo punto, valutando il valore del parametro specificato, stopperà o manderà in play il file audio associato e ruoterà sull&#8217;asse Y l&#8217;elemento container &#8220;<strong>cardEl</strong>&#8220;, che, ricordiamo, è addetto a contenere tutti gli elementi HTML relativi ad entrambe le facce, di 0 gradi, nel caso debba essere mostrata la copertina, oppure di 180° nel caso debba essere mostrata la barra di avanzamento. A questo punto l&#8217;elemento &#8220;<strong>cardEl</strong>&#8220;, impiegherà un secondo per completare la transizione da una faccia all&#8217;altra. Questo perchè, come vedrete nella successivamente nella creazione del file SASS, andremo ad impostare la velocità di transizione tramite una semplice regola</p>
<pre class="brush: css; title: ; notranslate">
-webkit-transition: -webkit-transform 1s;
</pre>
<p>Vi aspettavate qualcosa di più complicato? Beh vi sbagliavate <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Come avrete sicuramente potuto capire leggendo questo tutorial, con una buona conoscenza di CSS e delle basi di Sencha Touch, potrete creare facilmente diversi componenti, dove, l&#8217;unico limite, sarà dato dalla vostra fantasia.</p>
<h3>6.3. Aggiornamento Copertina</h3>
<p>L&#8217;aggiornamento della copertina è qualcosa di veramente banale, infatti, se avete un minimo di familiarità con il framework, saprete sicuramente che il <strong>&#8220;ClassManager&#8221;</strong>, definisce automaticamente tre funzioni associate ad ogni proprietà specificata all&#8217;interno dell&#8217;oggetto &#8220;config&#8221;: <strong>get</strong>, <strong>apply</strong> e <strong>update</strong>, seguite dal nome del parametro avente la prima lettera in maiuscolo. Nel nostro caso infatti, verranno definite le funzioni:</p>
<ul>
<li><strong>getCoverUrl</strong>: Reperisce l&#8217;url dell&#8217;immagine di copertina associata al brano.</li>
<li><strong>applyCoverUrl</strong>: Addetta ad impostare e ritornare il valore specificato.</li>
<li><strong>updateCoverUrl</strong>: Addetta ad aggiornare l&#8217;url dell&#8217;immagine di copertina.</li>
</ul>
<p>Come appena accennato, queste funzioni vengono create automaticamente, ma nulla ci vieta di effettuare un override al fine di poterle utilizzare a nostro piacimento. Per quanto riguarda l&#8217;immagine di copertina infatti, non ci basta che l&#8217;url specificato venga solamente assegnato alla proprietà associata, ma tale url dovrà essere anche impostato come immagine di background del&#8217;elemento &#8220;<strong>coverEl</strong>&#8220;, quindi tutto ciò che dobbiamo fare è ridefinire la funzione &#8220;<strong>updateCoverUrl</strong>&#8221; come segue:</p>
<pre class="brush: jscript; title: ; notranslate">
   /**
     * Update tha audio cover Url.
     * @param {String} value The new audio cover Url.
     * @private
     */
    updateCoverUrl: function(value){
        this.coverEl.setStyle('background', Ext.String.format('url({0})', value));
    }
</pre>
<p>In questo modo, non appena il componente verrà renderizzato sulla pagina, oppure decidiate di aggiornare dinamicamente l&#8217;immagine di copertina, questa verrà immediatamente impostata come background dell&#8217;elemento &#8220;coverUrl&#8221; andando quindi ad impostare come sfondo della faccia anteriore e, woilà, il gioco è fatto <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<h3>6.4. Il pulsante di Stop</h3>
<p>Per poter terminare la riproduzione del brano in esecuzione, dovremo ora creare un pulsante di stop che verrà posizionato esattamente al centro della progressbar presente sulla faccia posteriore, quindi, tenendo presente quanto spiegato nel paragrafo precedente in merito alle tre funzioni automaticamente create e chiamate dal ClassManager per ogni parametro di configurazione diamo un&#8217;occhiata al codice che segue:</p>
<pre class="brush: jscript; title: ; notranslate">
   /**
     * Create the stop button and update the getStopButton reference.
     * @param {Object} config The configuration used to create the button.
     * @private
     */
    applyStopButton: function(config) {
        return Ext.factory(config, Ext.Button, this.getStopButton());
    },
    
    /**
     * Update the Stop button creating the new one and destroying
     * the old one if any.
     * @param {Ext.Button} newButton The new button created.
     * @param {Ext.Button} oldButton The old button that eventually already exists.
     * @private
     */
    updateStopButton: function(newButton, oldButton){
    
        if (newButton) {
            newButton.renderTo(this.progressEl);
            newButton.on('tap', 'showFront', this);
        }
        else if (oldButton) {
            oldButton.destroy();
        }
        
    },
</pre>
<p>Anche in questo caso i commenti sono abbastanza esaurienti, ma cerchiamo comunque di fornire qualche informazione in più.<br />
La funzione &#8220;<strong>applyStopButton</strong>&#8221; viene richiamata automaticamente al rendering del componente passando come parametro la configurazione che abbiamo definito all&#8217;interno dell&#8217;oggetto &#8220;config&#8221;, quindi, in questo caso, andremo a creare e ritornarne un componente base di tipo &#8220;<strong>Ext.Button</strong>&#8221; utilizzando tale configurazione e la funzione &#8220;<strong>Ext.factory</strong>&#8220;. Tale funzione, oltre a permetterci di creare un componente, ci consente anche di aggiornare una funzione di riferimento, che, nel nostro caso, sarà &#8220;<strong>getStopButton</strong>&#8220;. Così facendo, qualora vogliate reperire il pulsante di stop o aggiornarne dinamicamente l&#8217;aspetto, vi sarà facilmente possibile semplicemente richiamandone dall&#8217;esterno tale funzione. Ad esempio, nel caso per qualche motivo vogliate ad un certo punto aggiornarne la ui da &#8220;white&#8221; a &#8220;action&#8221;, potrete tranquillamente farlo mediante la seguente riga di codice:</p>
<pre class="brush: jscript; title: ; notranslate">
&lt;CMP&gt;.getStopButton().setUi('action');
</pre>
<p>dove &#8220;CMP&#8221; sarà il componente &#8220;Ext.tux.AudioCover&#8221; del quale volete aggiornare il pulsante di Stop.</p>
<h3>6.5. Diamo vita alla Progress Bar</h3>
<p>L&#8217;ultima funzione di cui abbiamo bisogno per completare il codice del nostro componente è una funzione cha andrà ad aggiornare costantemente la rotazione degli slice in corrispondenza all&#8217;attuale tempo di esecuzione del brano collegato. Andiamo quindi, come già accennato nel paragrafo relativo all&#8217;inizializzazione del componente a definire la funzione &#8220;<strong>onUpdateTime</strong>&#8220;.</p>
<pre class="brush: jscript; highlight: [20,28,29,30,31,32,33]; title: ; notranslate">
   /**
     * Core component function used to syncronize the slices
     * rotation to simulate the progress effect. 
     * This function is called everytime the Media element changes
     * is current time.
     * @param {Ext.Media} media The linked media element.
     * @param {Number} time The current media time in seconds.
     * @private.
     */
    onUpdateTime: function(media, time){

        var deg1 = 0,
            deg2 = 180;

        if(time === 0) {
            return;
        }
        
        // Let's calculate the new slice rotation
        var sliceDeg = (time * 360) / this.getDuration();

        if(sliceDeg === 0) {
            return;
        }
        
        /* If the current time passed the half, we need to rotate
         * the sencond slice instead of the first one. */
        if(sliceDeg &gt; 180) {
            deg1 = 180;
            deg2 = sliceDeg;
        } else {
            deg1 = sliceDeg;
        }

       // Rotate the slices to simulate to syncronize the progress
        this.slice1.setStyle('-webkit-transform', Ext.String.format('rotateZ({0}deg)', deg1));
        this.slice2.setStyle('-webkit-transform', Ext.String.format('rotateZ({0}deg)', deg2));

    },
</pre>
<p>Anche in questo caso, la funzione è davvero molto semplice. Alla riga numero 20 infatti, potete notare come vengano calcolati i gradi di rotazione dello slice con una semplice proporzione, considerando la durata complessiva del file audio, il tempo corrente di riproduzione, è la massima rotazione possibile pari a 360°. Tramite questo semplice calcolo potremo infatti capire di quanti gradi ruotare uno dei due slice definiti, ma non sabbiamo ancora quale. Come già spiegato in precedenza, ognuno dei due slice può coprire solamente metà della progressbar per via della proprietà CSS &#8220;Clip&#8221; impostata. Il primo quindi (slice1), coprirà l&#8217;avanzamento relativo alla prima metà della durata massima del brano (quindi la parte destra), mentre il secondo (slice2) coprirà la metà finale rimanente. Per questo motivo entrambi potranno essere ruotati di un massimo di 180°. Come potete notare alla riga 28 infatti, viene verificato l&#8217;angolo di rotazione precedentemente calcolato, e, se questo è minore di 180° allora verrà ruotato il primo slice mentre il secondo manterrà la sua rotazione iniziale pari a 0° risultando completamente nascosto grazie alle regole CSS clip applicate. Nel caso in cui invece l&#8217;angolo di rotazione fosse superiore a 180° allora sarebbe il secondo ad essere ruotato, mentre il primo verrebbe mantenuto alla sua rotazione massima di 180°. In questo modo si otterà un&#8217;avanzamento lineare che andrà a coprire completamente i 360° della forma circolare conferita alla barra di avanzamento. Beh, cosa ne dite&#8230;non è un bel trucco <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .</p>
<h2>7. Considerazioni finali sul Codice</h2>
<p>A questo punto il codice sorgente del nostro componente è concluso. So che vi sembrerà assurdo e che avreste giurato fosse molto più complicato, ma come avete potuto vedere con i vostri occhi, sono bastate poche semplici funzioni e quale regola CSS per creare quello che, a detta del mio caro amico sviluppare Objective C, sarebbe stato impossibile ricreare tramite &#8220;semplice codice HTML&#8221;. Sencha Touch è un framework estremamente flessibile e molto semplice da estendere, quindi la prossima volta che creerete la vostra Web application, non limitatevi ad utilizzare i classici componenti base, ma spremete un po le meningi per creare qualcosa di originale e personalizzato che conferirà alla vostra applicazione una user interface da fare invidia anche alle applicazioni native iOS, Android, ecc.. Ho sviluppato diverse applicazioni e componenti utilizzando questo framework per diversi clienti sparsi qua e la nel mondo, e posso assicurarvi che, fino ad ora, non ho ancora trovato un componente nativo che mi facesse pensare: &#8220;Cavolo, questo è impossibile in HTML?&#8221;. Quindi se avete un&#8217;applicazione o un componente da realizzare, ma non avete molta dimestichezza con Sencha Touch, non preoccupatevi. Contattate me o direttamente il nostro team <a href="http://www.sencha.com/support/services/">Sencha Services</a>, dove io e molti altri sviluppatori professionisti ed esperti sul framework e le tecnologie web, sapranno sicuramente in grado di consigliarvi e dare vita al vostro progetto.<br />
Terminate queste piccole considerazioni, non è ancora tempo di riposare, abbiamo ancora una piccola parte da analizzare, ovvero la creazione del CSS che andrà a disporre correttamente tutti gli elementi della UI all&#8217;interno del nostro componente, rendendolo finalmente utilizzabile.</p>
<p style="text-align: right;"><a href="http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-4.html">Quarta Parte >></a></p>
<p><img src='http://www.andreacammarata.com/wp-content/uploads/2012/08/post-icon-3.png'></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-3.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ext.tux.AudioCover &#8211; Parte 2</title>
		<link>http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-2.html</link>
		<comments>http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-2.html#comments</comments>
		<pubDate>Mon, 20 Aug 2012 08:02:54 +0000</pubDate>
		<dc:creator>Andrea Cammarata</dc:creator>
				<category><![CDATA[Sencha Touch 2]]></category>

		<guid isPermaLink="false">http://www.andreacammarata.com/?p=1072</guid>
		<description><![CDATA[4. Definiamo il Template Arrivati a questo punto siamo pronti a scrivere qualche riga di codice che permetterà al nostro componente di fornirci tutti gli elementi HTML che verranno utilizzati al fine di renderizzare la UI, quindi, il primo step, è sicuramente quello di definirne il template. Per tutti quelli che non hanno molta familiarità(...)]]></description>
			<content:encoded><![CDATA[<h2>4. Definiamo il Template</h2>
<p>Arrivati a questo punto siamo pronti a scrivere qualche riga di codice che permetterà al nostro componente di fornirci tutti gli elementi HTML che verranno utilizzati al fine di renderizzare la UI, quindi, il primo step, è sicuramente quello di definirne il template. Per tutti quelli che non hanno molta familiarità con Sencha Touch, basti sapere che il Template, permette di definire una sorta di scheletro del componente, andando a definire, all&#8217;interno di un semplice array, quale tipo di elemento HTML dovrà essere utilizzato, la classe da applicare, un array di eventuali elementi figli ed un nome univoco che verrà utilizzato all&#8217;interno del componente stesso al fine di poter reperire ogni singolo nodo DOM definito.<br />
La definizione di un template è molto semplice, e vedrete che non avrete difficoltà a comprendere le righe di codice che seguiranno, ma nel caso aveste qualche dubbio o vogliate approfondire maggiormente il significato dei vari attributi, vi consiglio di dare un&#8217;occhiata a <a target="_blank" href="http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/progressbar-development.html#template">questo vecchio post </a>dove è stato ampiamente spiegato il significato di ognuno di questi.</p>
<h3>4.1. La Flip Card</h3>
<p>Iniziamo subito a definire il template della flip-card, ovvero quell&#8217;elemento HTML che visualizzerà due diverse facce dove su quella frontale verrà visualizzata la copertina del brano, mentre su quella posteriore, per il momento, verrà semplicemente visualizzato il testo &#8220;Back&#8221;. Non preoccupatevi, torneremo tra poco sulla parte posteriore andando a sostituire il testo con tutti gli elementi che comporranno la progressbar circolare.</p>
<pre class="brush: jscript; title: ; notranslate">
/**
 * @class Ext.tux.AudioCover
 * @extend Ext.Audio
 * @author Andrea Cammarata
 */
Ext.define('Ext.tux.AudioCover',{
    extend: 'Ext.Audio',
    xtype: 'audiocover',
    template: [
        {
            // The media element is required
            reference: 'media',
            preload: 'auto',
            tag: 'audio'
        },
        {
            cls: 'x-flip-card',
            reference: 'cardEl',
            children: [
                {
                    cls: 'x-face x-front',
                    reference: 'coverEl'
                },
                {
                    cls: 'x-face x-back',
                    text: 'Back'
                }
            ]
        }
    ]
});
</pre>
<p>La prima cosa che dovete assolutamente notare guardando queste righe di codice, è il nodo avente tag &#8220;<strong>audio</strong>&#8220;, infatti, poichè stiamo andando ad estendere un componente &#8220;Ext.Audio&#8221; e allo stesso tempo effettuando l&#8217;override del template di questo componente, è assolutamente necessario  che l&#8217;elemento media venga mantenuto, così come anche il suo attributo &#8220;reference&#8221; non deve essere assolutamente modificato. Questo perchè, non intendiamo andare a riscrivere completamente il componente Ext.Audio, anzi, al contrario, intendiamo sfruttare funzioni e funzionalità già definite come base del nostro ux. Quindi, nel caso in cui decidessimo di rimuovere l&#8217;elemento &#8220;audio&#8221; il componente andrebbe in crash immediatamente al rendering della pagina, poichè le funzioni già presenti, non sarebbero più in grado di trovare tale riferimento tramite l&#8217;utilizzo dell&#8217;istruzione &#8220;<strong>this.media</strong>&#8220;. Per questo motivo quindi, questo elemento non va rimosso, ne tantomeno modificato, tutti ciò che dobbiamo fare è andare ad aggiungere tutti gli elementi mancanti necessari alla creazione della UI.<br />
A tal proposito, come avrete sicuramente notato, abbiamo quindi definito l&#8217;elemento &#8220;<strong>cardEl</strong>&#8220;, il quale, a sua volta possiede due figli, ai quali, ovviamente, al primo corrisponde la faccia frontale, ovvero quella che visualizzerà la copertina, mentre il secondo conterrà la progressbar di avanzamento. Avrete sicuramente notato che alla faccia frontale è stato assegnato un reference, mentre a quella posteriore no. Questo perchè il componente dovrà andare a manipolare dinamicamente la faccia frontale andando a modificarne l&#8217;immagine di copertina, mentre  non dovrà mai curarsi direttamente di quella posteriore, ma, come vedremo in seguito, solamente dei suoi figli.<br />
Bene, ora che abbiamo definito il template della Flip Card, fermiamoci un momento per fare due considerazioni su come questi elementi dovranno essere disposti da un punto di vista del CSS:<br />
Iniziamo con il dire che l&#8217;elemento &#8220;cardEl&#8221; ha il ruolo di container per le due facce. Questo ci sarà utile quando il componente dovrà ruotare simulando l&#8217;effetto &#8220;Flip&#8221;, poichè, applicando le trasformazioni CSS di rotazione a questo elemento, entrambe le facce ruoteranno simultaneamente, quindi non dovremo preoccuparci di ruotarle singolarmente. Altra considerazione di cui tener conto è che la faccia posteriore verrà sovrapposta, con posizionamento &#8220;absolute&#8221;, su quella anteriore, con la sola differenza che questa verrà prima ruotate di 180° sull&#8217;asse Y in modo tale da posizionarle &#8220;schiena contro schiena&#8221; all&#8217;interno del container.<br />
La regola che ci consentirà tale disposizione è</p>
<pre class="brush: css; title: ; notranslate">
-webkit-transform: rotateY(180deg);
</pre>
<p>applicata alla sola faccia addetta alla visualizzazione della progressbar di avanzamento.</p>
<p>Infine, non dobbiamo assolutamente dimenticarci che entrambe le facce dovranno nascondere la loro faccia posteriore tramite l&#8217;istruzione </p>
<pre class="brush: css; title: ; notranslate">
-webkit-backface-visibility: hidden;
</pre>
<p>mentre l&#8217;elemento &#8220;cardEl&#8221; container dovrà preservare le trasformazioni CSS 3d applicate a tutti i suo figli, in modo tale che nel momento in cui verrà ruotato mostrando una delle due facce, le rotazioni di tali nodi non vengano trascurate.<br />
Tutto questo è possibile semplicemente ricordandosi di applicare la regola</p>
<pre class="brush: css; title: ; notranslate">
-webkit-transform-style: preserve-3d;
</pre>
<p>Se volete approfondire maggiormente queste regole CSS, vi consiglio di leggere uno dei tanti articoli presenti in rete. Non vi preoccupate comunque, verso la fine di questo articolo verrà visualizzato il documento SASS completo che, sono sicuro vi aiuterà a capire meglio.</p>
<h3>4.2. La ProgressBar</h3>
<p>Questa è forse la parte più complicata da comprendere dell&#8217;intero articolo, quindi richiede un po di concentrazione.<br />
Prima di iniziare quindi, vi consiglio vivamente di dare un&#8217;occhiata a <a target="blank" href="http://www.impressivewebs.com/css-clip-property/">questo articolo</a> che vi spiegherà nel dettaglio tutto ciò che dovete sapere in merito ad una proprietà CSS molto interessate, ovvero la proprietà <strong>Clip</strong>.<br />
In sintesi, tale proprietà permette di mascherare una parte di un&#8217;immagine, di un div, ecc. rendendone visibile solamente una parte.<br />
Considerate questa proprietà come un&#8217;evoluzione della regola &#8220;visibility: hidden;&#8221; che, invece, permette di nascondere completamente un elemento.<br />
Se siete sicuri di aver compreso il funzionamento di tale proprietà, andiamo a vedere ora la parte di template che verrà utilizzata per la costruzione della progress bar di avanzamento riproduzione.</p>
<pre class="brush: jscript; highlight: [18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41]; title: ; notranslate">
template: [
    {
        // The media element is required
        reference: 'media',
        preload: 'auto',
        tag: 'audio'
    },
    {
        cls: 'x-flip-card',
        reference: 'cardEl',
        children: [
            {
                cls: 'x-face x-front',
                reference: 'coverEl'
            },
            {
                cls: 'x-face x-back',
                children: [
                    {
                        cls: 'x-progress',
                        reference: 'progressEl',
                        children: [
                            {
                                cls: 'x-slice x-half',
                                children: [
                                    { 
                                        reference: 'slice1' 
                                    }
                                ]
                             },
                             {
                                 cls: 'x-slice x-end',
                                 children: [
                                    { 
                                        reference: 'slice2'
                                    }
                                 ]
                             }
                        ]
                    }
                ]
            }
        ]
    }
]
</pre>
<p>Anche in questo caso abbiamo definito un nodo container &#8220;<strong>progressEl</strong>&#8221; che, una volta arrotondati i bordi tramite la proprietà &#8220;<strong>border-rarius</strong>&#8221; e posizionato al centro della faccia, conferirà alla progressbar, la forma circolare base caratteristica di questo componente. Ma purtroppo, come sicuramente avrete capito, questo non è abbastanza. Dando un&#8217;occhiata al template noterete sicuramente che all&#8217;interno del container, sono stati definite due div avante come classe base &#8220;x-slice&#8221;, e, al loro interno, altre due div avente soltanto un nome di riferimento. Questo dovrebbe farvi capire che saranno proprio quest&#8217;ultimi elementi HTML che andranno manipolati dinamicamente dal componente al fine di simulare l&#8217;effetto di avanzamento di riproduzione del brano. Iniziamo con il dire che ad entrambi i nodi avente classe base &#8220;x-slice&#8221; ed ai loro figli, verranno arrotondati i bordi con lo stesso raggio utilizzato per il nodo container. Questo perchè, ovviamente, la forma caratteristica del componente è circolare, quindi sarebbe poco intelligente avere elementi di forma rettangolare al suo interno. Bene, ma cerchiamo di arrivare al succo: Come possiamo simulare l&#8217;avanzamento circolare all&#8217;interno del componente utilizzando i soli elementi HTML finora definiti? Sono sicuro che ve lo state chiedendo da un po, non è vero? <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Bene, per capire al meglio questo concetto purtroppo le parole non bastano, quindi diamo insieme un&#8217;occhiata alle immagini sottostanti che hanno lo scopo di illustrare il posizionamento dei vari elementi che compongono la progressbar. Onde evitare inutili confusioni, verrà preso come riferimento l&#8217;elemento container &#8220;progressEl&#8221;, il primo elemento &#8220;x-slice&#8221; (x-half) ed il suo nodo figlio. </p>
<p><a href="http://www.andreacammarata.com/wp-content/uploads/2012/08/base.png" rel="prettyPhoto[1072]"><img src="http://www.andreacammarata.com/wp-content/uploads/2012/08/base.png" alt="" title="Base" width="600" height="300" class="aligncenter size-full wp-image-1087" /></a></p>
<p>Come potete vedere da questa immagine, tutti gli elementi, fatta esclusione per il nodo avente classe &#8220;x-face.x-back&#8221;, hanno tutti una forma circolare, concentrici e esattamente della medesima dimensione. Attenzione però, vi faccio notare che l&#8217;unico dei tre div a forma circolare ad avere un colore di riempimento di rilievo diverso dal bianco è il nodo figlio dell&#8217;elemento avente classe &#8220;x-slice.x-half&#8221;, ovvero quello a cui è stato impostato il nome di riferimento a &#8220;slice1&#8243;.<br />
Bene, ora che abbiamo capito come sono disposti gli elementi, passiamo a dare un&#8217;occhiata all&#8217;immagine che segue.</p>
<p><a href="http://www.andreacammarata.com/wp-content/uploads/2012/08/base2.png" rel="prettyPhoto[1072]"><img src="http://www.andreacammarata.com/wp-content/uploads/2012/08/base2.png" alt="" title="" width="600" height="300" class="aligncenter size-full wp-image-1090" /></a></p>
<p>Nel primo riquadro potete notare com&#8217;è stato applicata la regola &#8220;clip&#8221; all&#8217;elemento avente classe &#8220;x-slice.x-half&#8221;, tenendo bene in mente che la parte evidenziata in grigio e la parte non visibile dell&#8217;elemento, pertanto, sarà visibile solamente la metà destra. Tutto quello al di sotto della parte sinistra quindi, verrà completamente tenuto nascosto.<br />
Nel secondo riquadro invece potete notare come il figlio dell&#8217;elemento sopra citato (slice1) abbia applicato la regola clip esattamente nel modo opposto al suo nodo padre, nascondendo la parte destra e mostrando completamente la parte sinistra.<br />
Fermandovi a ragionare un secondo capirete che, al momento in cui la progressbar verrà renderizzata e che quindi il tempo di riproduzuione è uguale a zero, la parte in blu raffigurante l&#8217;avanzamento verrà completamente nascosta, in quanto posta al di sotto della metà nascosta del nodo &#8220;x-slice.x-half&#8221;. Ora, tutto quello che ci occorre per mostrare l&#8217;avanzamento dello stato di riproduzione, è semplicemente sincronizzare la riproduzione dell&#8217;elemento media definito all&#8217;interno del template, con la rotazione sull&#8217;asse Z dell&#8217;elemento slice1. In questo modo, man mano che il tempo attuale di riproduzione del brano aumenterà, la parte visualizzata di tale elemento, entrerà all&#8217;interno della parte destra mostrata dal nodo padre, visualizzandone uno spicchio sempre più grande così come mostrato nel box numero 3 della figura soprastante, fino a raggiungere una rotazione massima di 180°. A questo punto non sarà più possibile ruotare l&#8217;elemento &#8220;slice1&#8243;, ma passeremo allo &#8220;slice2&#8243;.<br />
L&#8217;elemento &#8220;slice2&#8243; e il nodo padre &#8220;x-slice.x-end&#8221; sono infatti posizionati a specchio rispetto ai &#8220;fratelli&#8221; della prima metà, di conseguenza sarà possibile visualizzare anche lo stato di avanzamento corrispondente alla seconda metà del brano, coprendone i restanti 180°.<br />
Complicato? Sono sicuro che inizialmente farete un po fatica a comprenderne completamente il funzionamento ( anche per via della pessima qualità delle mie immagini <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ), ma vedrete che rileggendo un paio di volte, tutto risulterà molto più chiaro e sarete così pronti per procedere con la lettura della terza parte di questo tutorial dove andremo finalmente a definire le funzioni che, di fatto, daranno vita a tutti questi elementi HTML e, di conseguenza, rendendo finalmente utilizzabile il componente stesso. </p>
<p style="text-align: right;"><a href="http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-3.html">Terza Parte >></a></p>
<p><img src='http://www.andreacammarata.com/wp-content/uploads/2012/08/post-icon-2.png'></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-2.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Ext.tux.AudioCover &#8211; Parte 1</title>
		<link>http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-1.html</link>
		<comments>http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-1.html#comments</comments>
		<pubDate>Mon, 20 Aug 2012 08:01:21 +0000</pubDate>
		<dc:creator>Andrea Cammarata</dc:creator>
				<category><![CDATA[Sencha Touch 2]]></category>

		<guid isPermaLink="false">http://www.andreacammarata.com/?p=1044</guid>
		<description><![CDATA[Ormai giunto alla versione 2.1.0 B2, Sencha Touch resta tutt&#8217;ora il framework web più innovativo, dinamico ed utilizzato dagli sviluppatori che intendono realizzare un&#8217;applicazione mobile il più possibilmente universale, cioè supportata dalla maggior parte dei sistemi operativi in circolazione come iOS, Android, ecc. Negli ultimi mesi infatti, la community di Sencha ha avuto il piacere(...)]]></description>
			<content:encoded><![CDATA[<p>Ormai giunto alla versione 2.1.0 B2, Sencha Touch resta tutt&#8217;ora il framework web più innovativo, dinamico ed utilizzato dagli sviluppatori che intendono realizzare un&#8217;applicazione mobile il più possibilmente universale, cioè supportata dalla maggior parte dei sistemi operativi in circolazione come iOS, Android, ecc. Negli ultimi mesi infatti, la community di Sencha ha avuto il piacere di accogliere il suo membro 403.400, e tale numero sembra destinato a crescere giorno dopo giorno. La maggior parte dei nuovi iscritti, così come coloro che hanno sentito parlare di Sencha Touch, ma che non intendono scendere nel dettaglio di questo framework, risultano essere piuttosto scettici in merito alle sue potenzialità, dubbi per lo più sollevati dalla infondata convinzione che una web application non potrà mai essere messa a confronto con un&#8217;applicazione nativa. Il linguaggio Objective C, utilizza per lo sviluppo di applicazioni iOS, così come Java per Android, a loro dire, fornirebbe agli sviluppatori maggiori strumenti e flessibilità di quanto una &#8220;semplice pagina HTML&#8221; e qualche foglio di stile possano garantire. Questa errata corrente di pensiero e proprio quella che mi ha spinto alla realizzazione del componente Ext.tux.AudioCover in oggetto ed alla conseguente scrittura di questo post. Tornando indietro di qualche settimana infatti, scrissi un <a href="http://www.andreacammarata.com/news/ext-tux-audiocover.html">articolo</a> e postai un video che dimostrava tale componente in azione e spiegandone la motivazione che mi spinse alla sua realizzazione. Per farla breve, un mio amico sviluppatore Objective C, spinto dalla stessa convinzione della netta superiorità delle applicazioni native, mi espose le sue motivazioni prendendo come esempio il componente, che permette agli utenti di ascoltare l&#8217;anteprima di una canzone mostrandone l&#8217;avanzamento in una sorta di progress bar a forma circolare. Secondo lui infatti, HTML e CSS non sarebbero bastati a dar vita alla controparte Sencha Touch, sfidandomi alla sua realizzazione. Solo a quel punto si sarebbe ricreduto. Sono sicuro che tutti gli sviluppatori web con buone conoscenze di CSS3 che stanno leggendo questo articolo staranno sicuramente pensando: &#8220;Ma che amici hai?&#8221; <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . Ora le possibilità sono due: O questa persona ha delle fette di prosciutto spesse dieci centimetri davanti agli occhi, oppure le sue limitate conoscenze di tutto ciò che è nell&#8217;ambito web risulta essere avvolto da una poltre spessa e oscura che ne impedisce il passaggio della luce. Conoscendo il soggetto direi che entrambe le alternative sono valide <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . Di fronte a questa situazione ho deciso di accettare la sfida, così, la stessa mattina in cui avrei dovuto solamente preparare le valigie e recarmi in aeroporto con destinazione Miami per trascorre qualche settimana di vacanza, ho sviluppato il componente in circa quattro ore, preparato bagagli, sbeffeggiato il caro amico, caricato la ragazza e partito per la Florida <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> . L&#8217;obbiettivo di questo articolo quindi, è quello di poter finalmente dare l&#8217;idea concreta, che ormai, con le giuste conoscenze di HTML e CSS (meglio SASS), non c&#8217;è barriera che non possiate infrangere nello sviluppo delle vostre applicazioni Sencha Touch, così come anche di componenti personalizzati, i cosiddetti ux, o come piace definire a me, tux (Touch User Extensions). Cercherò in questi mesi, di scrivere una serie di articoli che avranno lo scopo di guidarvi nella realizzazione di componenti personalizzati che saranno riproduzioni identiche delle medesime controparti native e darvi così la convinzione che Sencha Touch, non ha proprio nulla da invidiare a Objective C e Java per quanto riguarda la UI, gli unici limiti saranno dovuti alle vostre conoscenze e creatività.</p>
<h2>1. Considerazioni prima di iniziare</h2>
<p>La prima cosa in assoluto ancor prima di iniziare a scrivere la prima riga di codice di ogni componente che intendiamo realizzare e pensare quale questo dovrà andare ad estendere. Sencha Touch infatti fornisce numerosi componenti base come Container, Panel, List, Carousel, ecc.. e se il nostro componente deve esporre una User Interface, questo dovrà sicuramente essere l&#8217;estensione di qualcosa di diverso di un semplice Object e, in ogni caso, questo dovrà estendere almeno la classe base Ext.Component. Occorrerebbe un articolo dedicato alla scelta si quello giusto da estendere in base al componente che intendiamo realizzare effettuando diverse considerazioni, quindi non mi soffermerei troppo sull&#8217;argomento al momento, quindi cerchiamo di ragionare velocemente elencando le funzionalità base che il nostro componente dovrà fornire:</p>
<ul>
<li>Riproduzione di file audio (prevalentemente MP3).</li>
<li>Funzioni di Play, Pause e Stop del file audio in riproduzione</li>
<li>Avere accesso ad alcune informazioni importanti sul file audio quali durata del brano e tempo corrente di riproduzione</li>
<li>Possibilità di override della User Interface. Deve essere quindi almeno un estensione della classe base Ext.Component così come accennato pocanzi.</li>
</ul>
<p>Bene, a questo punto è abbastanza lampante che il componente che stiamo cercando è niente poco di meno che l&#8217;Ext.Audio.<br />
Tale componente infatti ci fornisce già tutte le funzioni di cui abbiamo bisogno per il controllo del file audio, il reperimento delle sue informazioni, ed inoltre, essendo lui stesso un&#8217;estensione di Ext.Media che a sua volta è un&#8217;estensione di Ext.Component, ci consente di manipolare con facilità il template HTML con il quale questo viene renderizzato nella nostra applicazione dandoci di conseguenza la possibilità di definire la user interface necessaria a mostrare la copertina associata al file audio e la barra di avanzamento circolare. Direi che non ci manca proprio niente!<br />
Deciso quindi il componente che ci fornirà le fondamenta per il tux, non ci resta che analizzare graficamente il componente nativo iOS, evidenziandone caratteristiche grafiche e funzionalità.</p>
<h2>2. Analisi UI e funzionalità</h2>
<p style="text-align: left;">Ora che abbiamo deciso quale componente fornirà le funzionalità necessarie allo sviluppo della nostra estensione, entriamo nel vivo del tutorial partendo con l&#8217;analizzare attentamente com&#8217;è strutturato da un punto di vista grafico il componente iOS e capirne il reale funzionamento. Non fraintendetemi, non che ci sia nulla di così complicato da capire, ma è meglio avere avere le idee chiare prima di iniziare a buttar giù le prime righe di codice, in modo da stabilire fin da subito gli elementi HTML di cui avremo bisogno per costruire l&#8217;interfaccia grafica, le proprietà CSS che dovranno essere applicate e gli eventi che andranno gestiti per garantirne le medesime funzionalità.<br />
Per far tutto ciò, iniziamo con il dare un&#8217;occhiata a due screenshot di questo componente, presi direttamente da iOS 6 (beta 4):</p>
<table align="center">
<tbody>
<tr>
<td style="padding: 10px;"><img class="size-full wp-image-1049 aligncenter" title="Copertina" src="http://www.andreacammarata.com/wp-content/uploads/2012/08/screen-1.png" alt="" width="320" height="169" /></td>
<td style="padding: 10px;"><img class="size-full wp-image-1051 alignleft" title="Avanzamento" src="http://www.andreacammarata.com/wp-content/uploads/2012/08/screen-2.png" alt="" width="320" height="169" /></td>
</tr>
</tbody>
</table>
<p>Nella prima immagine a sinistra potete notare lo stato di &#8220;idle&#8221; del componente, ovvero quel momento in cui, la lista contenente tutti i brani viene renderizzata e nessuno di questi è attualmente in stato di Play. In questo stato tutti i componenti associati ad ogni singola canzone mostrano la copertina dell&#8217;album al quale questa appartiene, in attesa di un tap da parte dell&#8217;utente su una di queste al fine di iniziarne la riproduzione musicale mostrando una sorta di progress bar circolare con al mezzo un pulsante di stop che, se premuto, permette l&#8217;immediata interruzione così come mostrato nella seconda immagine posta sulla destra. Da non trascurare inoltre un dettaglio molto importante al fine di ricreare fedelmente questo componente, dettaglio che non viene mostrato nelle due immagini soprastanti: Non appena l&#8217;utente avrà toccato la copertina del brano, il componente dovrà utilizzare un effetto di transizione chiamato &#8220;flip&#8221; nel passare dallo stato di idle allo stato di riproduzione e viceversa.<br />
Ricordate inoltre che sarà consentita la riproduzione di un solo brano alla volta e, nel caso in cui l&#8217;utente decidesse di avviare la riproduzione di un&#8217;altro mentre uno è già in riproduzione, quest&#8217;ultimo dovrà essere riportato allo stato di Idle mostrandone la copertina. A questo punto potrà essere avviata la riproduzione del nuovo brano mostrandone lo stato di avanzamento.</p>
<h2>3. La Sfida</h2>
<p>La vera e propria sfida nel riuscire a realizzare questo tipo di componente è data da due obbiettivi distinti:</p>
<ul>
<li>Definire un elemento HTML che ci permetta di sovrapporre due DIV delle quali, nella prima, verrà visualizzata la copertina del brano, mentre nella seconda andremo a creare la progressbar circolare addetta a mostrare lo stato avanzamento della riproduzione del brano collegato. Non dimentichiamoci inoltre che la visualizzazione di queste due &#8220;facce&#8221; dovrà essere alternata, andando a nascondere la seconda quando la prima è visibile e viceversa, inoltre, questo passaggio dovrà avvenire tramite un&#8217;effetto di transizione detto &#8220;Flip&#8221;, il quale conferirà al componente un pizzico di tridimensionalità.</li>
<li>Creare la progress bar di tipo circolare che verrà costantemente sincronizzata con il tempo di riproduzione del brano in esecuzione.</li>
</ul>
<p>Non preoccupatevi, sembra più complicato di quanto non lo sia in realtà, quindi andiamo con ordine e vedrete che tutto questo ci sarà possibile tramite due semplici regole CSS e qualche &#8220;trucchetto&#8221; che sono sicuro gradirete <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
Seguitemi quindi nella seconda parte di questo articolo dove, finalmente, inizieremo a &#8220;stendere&#8221; il codice base del nostro componente.</p>
<p style="text-align: right;"><a href="http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-2.html">Seconda Parte >></a></p>
<p><img src='http://www.andreacammarata.com/wp-content/uploads/2012/08/post-icon-1.png'></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreacammarata.com/tutorials/sencha-touch-2-tutorials/ext-tux-audiocover-part-1.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ext.tux.AudioCover</title>
		<link>http://www.andreacammarata.com/news/ext-tux-audiocover.html</link>
		<comments>http://www.andreacammarata.com/news/ext-tux-audiocover.html#comments</comments>
		<pubDate>Sat, 21 Jul 2012 12:02:07 +0000</pubDate>
		<dc:creator>Andrea Cammarata</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.andreacammarata.com/?p=1037</guid>
		<description><![CDATA[This small post just to show you a work in progress Sencha Touch 2 custom component which replicate the same ui and behavior shown on iOS iTunes lists. I&#8217;ve decided to work on this component for three hours this morning after I had a conversation with an iOS developer friend of mine last night which(...)]]></description>
			<content:encoded><![CDATA[<p>This small post just to show you a work in progress Sencha Touch 2 custom component which replicate the same ui and behavior shown on iOS iTunes lists. I&#8217;ve decided to work on this component for three hours this morning after I had a conversation with an iOS developer friend of mine last night which was skeptical about Sencha Touch capabilities. His point was that the framework will never have the same component of iOS because the OS made in Apple has some components that are impossible to replicate with simple HTML and js code, so I&#8217;ve asked him to make me an example, and he talked me about the iTunes list where the user is able to see the track cover and hear the audio preview with a nice radial progress ui. Do you all know what I&#8217;m talking about, isn&#8217;t? Well, I&#8217;ve smiled back at him saying: &#8220;You are definitively an Objective-C developer <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> . It&#8217;s evident that you have basic experience with HTML5 and CSS3 technologies <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> &#8221;.  So, dear Sam, take a look at the following video. Are you still skeptical? <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
What do you think guys? Can this be compared to the native iOS component?<br />
Please consider that I&#8217;ve spent only four hours of my free time on that, and that with a couple of more hours, this can be improved in different ways.<br />
Oww, don&#8217;t forget that thanks to SASS this is fully customizable in colors, size, etc..<br />
When I&#8217;ll be back from holidays I will probably write a full tutorial on how to develop this and, as always, this will be released for free on my <a href="https://github.com/AndreaCammarata">Github account</a>.<br />
Let me know what do you think <img src='http://www.andreacammarata.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><center><br />
<iframe title="YouTube video player" class="youtube-player" type="text/html" width="640" height="360" src="http://www.youtube.com/embed/foHkZUtsMNI" frameborder="0" allowFullScreen="true"> </iframe><br />
</center></p>
<p><img src='http://www.andreacammarata.com/wp-content/uploads/2012/07/post-image.png'></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreacammarata.com/news/ext-tux-audiocover.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>iOS6 Passkit Test</title>
		<link>http://www.andreacammarata.com/news/ios6-passkit-test.html</link>
		<comments>http://www.andreacammarata.com/news/ios6-passkit-test.html#comments</comments>
		<pubDate>Thu, 14 Jun 2012 00:25:26 +0000</pubDate>
		<dc:creator>Andrea Cammarata</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.andreacammarata.com/?p=1025</guid>
		<description><![CDATA[Come tutti ormai sapete, il keynote di apertura del WWDC 2012 ha avuto tre grandi protagonisti: il MacBook di nuova generazione con retina display, Mountain Lion e iOS6. In merito a quest&#8217;ultimo sono state presentate numerose funzionalità tra le quali Passbook, un&#8217; applicazione direttamente integrata nel nuovo sistema operativo di casa Apple che permette l&#8217;archiviazione(...)]]></description>
			<content:encoded><![CDATA[<p>Come tutti ormai sapete, il keynote di apertura del WWDC 2012 ha avuto tre grandi protagonisti: il MacBook di nuova generazione con retina display, Mountain Lion e iOS6. In merito a quest&#8217;ultimo sono state presentate numerose funzionalità tra le quali Passbook, un&#8217; applicazione direttamente integrata nel nuovo sistema operativo di casa Apple che permette l&#8217;archiviazione di carte d&#8217;imbarco, biglietti di concerti, coupons, ecc. i quali, tramite l&#8217;integrazione di codici a barre e di un sofisticato sistema di auto aggiornamento, permette agli utenti di avere un portafogli virtuale che, di fatto, andrebbe a racchiudere e rimpiazzare tutte le carte magnetiche, e non solo, in vostro possesso. Incuriosito da questa nuova funzionalità, ho immediatamente dedicato del tempo alla lettura della documentazione, e alla creazione di un pass di prova che mi permettesse di avere sempre a disposizione una Membership Card che attestasse la mia iscrizione al forum Premium Sencha, visualizzando il mio username, il numero di post, le risposte fornite agli utenti, ecc. e in modo che il QRCode contenuto al suo interno permettesse, a seguito di una scansione, di raggiungere direttamente il mio profilo sul forum. Non voglio dilungarmi troppo nella scrittura di questo post in quanto, molto probabilmente, nei prossimi giorni ne scriverò un&#8217;altro che illustrerà step by step tutti i passaggi da seguire per poter creare il vostro pass personalizzato, quindi vi accenno solamente che qual&#8217;ora anche voi vogliate sperimentare con Passbook, vi occorrerà pazienza, in quanto la documentazione in merito al momento risulta essere davvero incompleta oltre che piena di errori e non sono state ancora fornite le dimensioni ufficiali delle immagini relative al background, logo e thumbnail, quindi vi consiglio di mantenere la calma in quanto il primo errore dal quale farete sicuramente fatica a venire a capo sarà che Mail vi mostrerà un messaggio di errore per riferirvi che non è stato in grado di aprire il pass allegato oppure che effettuando il download direttamente da Safari la toolbar cambierà diventerò per un secondo nera per poi ritornare al suo colore originale senza aver di fatto aver riconosciuto la vostra pass.<br />
Per questi e molti altri errori, vi rimando a <a href="https://devforums.apple.com/message/674361#674361">questa discussione</a> direttamente sul forum Apple, all&#8217;interno della quale potrete trovare alcuni esempi funzionanti e probabilmente, la soluzione a tutti i problemi che potrete incontrare. Ovviamente, non dimenticate di leggere la <a href="https://developer.apple.com/library/prerelease/ios/index.html#documentation/UserExperience/Conceptual/PassKit_PG/Introduction.html">documentazione ufficiale</a>, anche se come detto,  è incompleta e non del tutto attendibile per quanto riguarda l&#8217;impostazione dei campi da visualizzare.<br />
A seguire potrete trovare alcuni screenshot della pass che ho creato martedì stesso, subito dopo aver installato iOS6 sul mio device.</p>
<table>
<tr>
<td>
<div id="attachment_1026" class="wp-caption aligncenter" style="width: 230px"><a href="http://www.andreacammarata.com/wp-content/uploads/2012/06/photo-1.png" rel="prettyPhoto[1025]"><img src="http://www.andreacammarata.com/wp-content/uploads/2012/06/photo-1.png" alt="" title="photo 1" width="220" height="380" class="size-full wp-image-1026" /></a><p class="wp-caption-text">Pass front view</p></div>
</td>
<td>
<div id="attachment_1027" class="wp-caption aligncenter" style="width: 230px"><a href="http://www.andreacammarata.com/wp-content/uploads/2012/06/photo-2.png" rel="prettyPhoto[1025]"><img src="http://www.andreacammarata.com/wp-content/uploads/2012/06/photo-2.png" alt="" title="photo 2" width="220" height="380" class="size-full wp-image-1027" /></a><p class="wp-caption-text">Pass back view</p></div>
</td>
<td>
<div id="attachment_1028" class="wp-caption aligncenter" style="width: 230px"><a href="http://www.andreacammarata.com/wp-content/uploads/2012/06/photo-3.png" rel="prettyPhoto[1025]"><img src="http://www.andreacammarata.com/wp-content/uploads/2012/06/photo-3.png" alt="" title="photo 3" width="220" height="380" class="size-full wp-image-1028" /></a><p class="wp-caption-text">Destroying the pass!</p></div>
</td>
</tr>
</table>
<p><img src='http://www.andreacammarata.com/wp-content/uploads/2012/06/passkit-post-image.png'></p>]]></content:encoded>
			<wfw:commentRss>http://www.andreacammarata.com/news/ios6-passkit-test.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
