<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[HINA::工程幼稚園]]></title>
  <link href="http://blog.hinablue.me/atom.xml" rel="self"/>
  <link href="http://blog.hinablue.me/"/>
  <updated>2014-06-10T14:59:22+08:00</updated>
  <id>http://blog.hinablue.me/</id>
  <author>
    <name><![CDATA[Hina Chen]]></name>
    <email><![CDATA[hinablue@gmail.com]]></email>
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[[Famo.us] Inputs 模組 Part 2]]></title>
    <link href="http://blog.hinablue.me/entry/famous-inputs-modules-part-2/"/>
    <updated>2014-06-10T14:48:50+08:00</updated>
    <id>http://blog.hinablue.me/entry/famous-inputs-modules-part-2</id>
    <content type="html"><![CDATA[<p>接續著講滑鼠、觸控等其他的模組。</p>

<!-- more -->


<h3>MouseSync</h3>

<p>顧名思義，就是跟滑鼠控制相關的同步事件模組，預設值有以下項目，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">MouseSync</span><span class="p">.</span><span class="nx">DEFAULT_OPTIONS</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">direction</span><span class="o">:</span> <span class="kc">undefined</span><span class="p">,</span> <span class="c1">// 方向</span>
</span><span class='line'>    <span class="nx">rails</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span> <span class="c1">// 指定單一方向移動</span>
</span><span class='line'>    <span class="nx">scale</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="c1">// 滑鼠軌跡放大倍率</span>
</span><span class='line'>    <span class="nx">propogate</span><span class="o">:</span> <span class="kc">true</span> <span class="c1">// 在文件中加入 mouseleave 事件監聽</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<h4>常數</h4>

<p>這兩個常數是給 <code>direction</code> 所使用的，</p>

<ul>
<li><code>MouseSync.DIRECTION_X</code></li>
<li><code>MouseSync.DIRECTION_Y</code></li>
</ul>


<h4>方法</h4>

<ul>
<li><code>getOptions</code> 取得設定值</li>
<li><code>setOptions</code> 設定設定值</li>
</ul>


<h4>事件</h4>

<ul>
<li><code>start</code></li>
<li><code>update</code></li>
<li><code>end</code></li>
</ul>


<h3>ScrollSync</h3>

<p>關於捲軸的同步事件模組，實際上他也會監聽滑鼠的滾輪事件，預設值有，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">ScrollSync</span><span class="p">.</span><span class="nx">DEFAULT_OPTIONS</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">direction</span><span class="o">:</span> <span class="kc">undefined</span><span class="p">,</span> <span class="c1">// 方向</span>
</span><span class='line'>    <span class="nx">minimumEndSpeed</span><span class="o">:</span> <span class="kc">Infinity</span><span class="p">,</span> <span class="c1">// 捲軸移動結束時的移動速度</span>
</span><span class='line'>    <span class="nx">rails</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span> <span class="c1">// 指定單一方向移動</span>
</span><span class='line'>    <span class="nx">scale</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="c1">// 移動軌跡放大倍率</span>
</span><span class='line'>    <span class="nx">stallTime</span><span class="o">:</span> <span class="mi">50</span><span class="p">,</span> <span class="c1">// 結束移動後多久（單位 ms）觸發 end 事件</span>
</span><span class='line'>    <span class="nx">lineHeight</span><span class="o">:</span> <span class="mi">40</span> <span class="c1">// 捲動行高</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<h4>常數</h4>

<p>這兩個常數是給 <code>direction</code> 所使用的，</p>

<ul>
<li><code>ScrollSync.DIRECTION_X</code></li>
<li><code>ScrollSync.DIRECTION_Y</code></li>
</ul>


<h4>方法</h4>

<ul>
<li><code>getOptions</code> 取得設定值</li>
<li><code>setOptions</code> 設定設定值</li>
</ul>


<h4>事件</h4>

<ul>
<li><code>start</code></li>
<li><code>update</code></li>
<li><code>end</code></li>
</ul>


<h3>TouchSync</h3>

<p>這個模組在 <code>TouchTracker</code> 有稍微提及，他監聽了觸控的三個動作，並且使用 <code>TouchTracker</code> 將觸控資料記錄下來，基本的預設值有，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">TouchSync</span><span class="p">.</span><span class="nx">DEFAULT_OPTIONS</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">direction</span><span class="o">:</span> <span class="kc">undefined</span><span class="p">,</span> <span class="c1">// 方向</span>
</span><span class='line'>    <span class="nx">rails</span><span class="o">:</span> <span class="kc">false</span><span class="p">,</span> <span class="c1">// 指定單一方向移動</span>
</span><span class='line'>    <span class="nx">scale</span><span class="o">:</span> <span class="mi">1</span> <span class="c1">// 觸控軌跡放大倍率</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<h4>常數</h4>

<p>這兩個常數是給 <code>direction</code> 所使用的，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">TouchSync</span><span class="p">.</span><span class="nx">DIRECTION_X</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span><span class='line'><span class="nx">TouchSync</span><span class="p">.</span><span class="nx">DIRECTION_Y</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<h4>方法</h4>

<ul>
<li><code>getOptions</code> 取得設定值</li>
<li><code>setOptions</code> 設定設定值</li>
</ul>


<h4>事件</h4>

<ul>
<li><code>start</code></li>
<li><code>update</code></li>
<li><code>end</code></li>
</ul>


<h3>PinchSync, ScaleSync, RotateSync</h3>

<p>手勢控制事件同步模組，用於雙指捏入與滑開的控制，基本上 <code>PinchSync</code> 與 <code>ScaleSync</code> 是相當類似的東西，只不過 <code>ScaleSync</code> 控制了元件的縮放，差別僅止于此。</p>

<p>而 <code>RotateSync</code> 則是雙指之間的旋轉，其三者的預設值皆相同，</p>

<p>預設值有，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">PinchSync</span><span class="p">.</span><span class="nx">DEFAULT_OPTIONS</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">scale</span><span class="o">:</span> <span class="mi">1</span> <span class="c1">// 雙指移動放大倍率</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">ScaleSync</span><span class="p">.</span><span class="nx">DEFAULT_OPTIONS</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">scale</span> <span class="o">:</span> <span class="mi">1</span> <span class="c1">// 雙指移動放大倍率</span>
</span><span class='line'><span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="nx">RotateSync</span><span class="p">.</span><span class="nx">DEFAULT_OPTIONS</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">scale</span> <span class="o">:</span> <span class="mi">1</span> <span class="c1">// 雙指移動放大倍率</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<h4>方法</h4>

<ul>
<li><code>getOptions</code> 取得設定值</li>
<li><code>setOptions</code> 設定設定值</li>
</ul>


<h3>TwoFingerSync</h3>

<p>雙指移動的幕後功臣，上述三個雙指移動的事件同步模組，都是由這裡擴展出去的，由於只是作為一個可擴展的模組，所以他沒有任何的預設值，都是提供方法讓其他人使用。</p>

<h4>靜態方法</h4>

<ul>
<li><code>calculateAngle(posA, posB)</code> 計算兩點的 <code>atan2</code>（反正切弦）角度（單位是弧度</li>
<li><code>calculateDistance(posA, posB)</code> 計算兩點間的距離</li>
<li><code>calculateCenter(posA, posB)</code> 計算兩點間的中心點</li>
</ul>


<h4>私有方法</h4>

<p>以下三個私有方法，皆由 <code>EventHandler.setInputHandler</code> 接管，</p>

<ul>
<li><code>handleStart(event)</code></li>
<li><code>handleMove(event)</code></li>
<li><code>handleEnd(event)</code></li>
</ul>


<h3>GenericSync</h3>

<p>這個輸入事件同步模組，是先前介紹所有模組的集大成。也就是說，你可以用這一個模組來掌控所有前面所敘述過的模組。</p>

<h4>register 靜態方法</h4>

<p><code>GenericSync</code> 提供了一個註冊的靜態方法，當你要使用相關模組時，你必須要把這些模組註冊過，才能夠使用。</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">GenericSync</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/inputs/GenericSync&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">ScrollSync</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/inputs/ScrollSync&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">TouchSync</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/inputs/TouchSync&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">GenericSync</span><span class="p">.</span><span class="nx">register</span><span class="p">({</span><span class="nx">scroll</span> <span class="o">:</span> <span class="nx">ScrollSync</span><span class="p">,</span> <span class="nx">touch</span> <span class="o">:</span> <span class="nx">TouchSync</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">sync</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">GenericSync</span><span class="p">([</span><span class="s1">&#39;scroll&#39;</span><span class="p">,</span> <span class="s1">&#39;touch&#39;</span><span class="p">],</span> <span class="p">{</span><span class="nx">direction</span> <span class="o">:</span> <span class="nx">GenericSync</span><span class="p">.</span><span class="nx">DIRECTION_X</span><span class="p">});</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h4>方法</h4>

<ul>
<li><code>setOptions</code> 設定設定值</li>
<li><code>pipeSync</code> 將已註冊的同步事件模組傳遞至設定的物件上</li>
<li><code>unpipeSync</code> 在指定物件上註銷同步事件模組</li>
<li><code>addSync</code> 加入指定的同步事件模組</li>
</ul>


<h4>範例</h4>

<p>這個例子會在畫面上畫出一個 <code>500x5500</code> 的紅色長方形，當你滑鼠在紅色區塊滾動時，會觸發事件 <code>start</code>，你可以利用事件傳回的資料，來任意移動你的長方形區塊（或是做其他的事情</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// import dependencies</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">Engine</span>  <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Engine&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">Surface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Surface&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">GenericSync</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/inputs/GenericSync&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">ScrollSync</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/inputs/ScrollSync&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">TouchSync</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/inputs/TouchSync&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">GenericSync</span><span class="p">.</span><span class="nx">register</span><span class="p">({</span><span class="nx">scroll</span> <span class="o">:</span> <span class="nx">ScrollSync</span><span class="p">,</span> <span class="nx">touch</span> <span class="o">:</span> <span class="nx">TouchSync</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">mainContext</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">sync</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">GenericSync</span><span class="p">([</span><span class="s1">&#39;scroll&#39;</span><span class="p">,</span> <span class="s1">&#39;touch&#39;</span><span class="p">],</span> <span class="p">{</span><span class="nx">direction</span> <span class="o">:</span> <span class="nx">GenericSync</span><span class="p">.</span><span class="nx">DIRECTION_X</span><span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">sync</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;start&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">surface</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">500</span><span class="p">,</span> <span class="mi">5500</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s1">&#39;red&#39;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">surface</span><span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">sync</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">mainContext</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">surface</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Famo.us] Inputs 模組 Part 1]]></title>
    <link href="http://blog.hinablue.me/entry/famous-inputs-modules-part-1/"/>
    <updated>2014-06-09T22:28:13+08:00</updated>
    <id>http://blog.hinablue.me/entry/famous-inputs-modules-part-1</id>
    <content type="html"><![CDATA[<p>在 Famo.us 當中，提供了不少關於輸入（<em>input</em>）的模組，主要是用於接收使用者的操作輸入，諸如滑鼠、捲軸、觸控等等。</p>

<!-- more -->


<h3>輸入控制</h3>

<p>常見的輸入控制，除了滑鼠與觸控外，捲軸與手勢動作也包含在這些模組當中，主要有下列輸入模組可以使用，</p>

<h4>非輸入模組</h4>

<ul>
<li><code>Accumulator</code> 累加器，他提供一組累加功能，單純的使用 setter/getter 來加入或是取得你所累加的數字（或是數字陣列</li>
<li><code>TouchTracker</code> 追蹤觸控輸入，當觸控元件並非選取狀態時，追蹤每一個觸控軌跡</li>
</ul>


<h4>同步事件模組</h4>

<p>這些模組並不能直接使用在物件上，必須要與事件控制合併使用才會有效果，</p>

<ul>
<li><code>GenericSync</code> 通用輸入（包含滑鼠、觸控與捲軸輸入</li>
<li><code>MouseSync</code> 滑鼠輸入</li>
<li><code>PinchSync</code> 雙指捏入手勢</li>
<li><code>RotateSync</code> 雙指旋轉手勢</li>
<li><code>ScaleSync</code> 雙指縮放手勢（與 <code>PinchSync</code> 類似</li>
<li><code>ScrollSync</code> 滑鼠滾輪輸入</li>
<li><code>TouchSync</code> 觸控輸入</li>
<li><code>TwoFingerSync</code> 雙指輸入（包含 <code>PinchSync</code>,<code>RotateSync</code> 與 <code>ScaleSync</code></li>
</ul>


<h4>直接使用的模式檔案</h4>

<p>亦即，這些檔案並非以 AMD 的模組形態存在，他只是單純初始化一個模式，只要載入檔案就會生效，</p>

<ul>
<li><code>inputs/DesktopEmulationMode.js</code> 只要是觸控裝置，他會取消所有滑鼠動作（恰巧與他的名字相反</li>
<li><code>inputs/FastClick.js</code> 模擬觸控行為下的快速點擊，用於加速判別是否為 <code>click</code> 動作</li>
</ul>


<h4>Accumulator</h4>

<p>累加器的使用方式很簡單，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// 你必須要傳入數字，陣列，或是他也接受 Transitionable 物件</span>
</span><span class='line'><span class="c1">// 第二個參數是事件名稱，亦即觸發該事件，會更新累加器</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">accumulator</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Accumluator</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">],</span> <span class="s1">&#39;update&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">accumulator</span><span class="p">.</span><span class="nx">emit</span><span class="p">(</span><span class="s1">&#39;update&#39;</span><span class="p">,</span> <span class="p">{</span> <span class="nx">delta</span><span class="o">:</span> <span class="mi">10</span> <span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">accumulator</span><span class="p">.</span><span class="nx">get</span><span class="p">());</span> <span class="c1">// [10, 10]</span>
</span></code></pre></td></tr></table></div></figure>


<h4>TouchTracker</h4>

<p>該模組本身會將事件傳回 <code>TouchSync</code> 與其相關同步事件模組上面，你可以在 <code>TouchSync</code> 上面看到私有變數 <code>_touchTracker</code> 就是由該模組所回傳的事件。</p>

<h5>事件</h5>

<ul>
<li><code>touchstart</code></li>
<li><code>touchmove</code></li>
<li><code>touchend</code></li>
<li><code>touchcancel</code></li>
<li><code>unpipe</code> 如果觸發該事件，會把自身所儲存的軌跡資料清除</li>
</ul>


<h5>方法</h5>

<ul>
<li><code>track</code> 你必須要傳入一個觸控物件（<em>Object</em>）該物件必須包含 <code>identifier</code> 屬性</li>
</ul>


<p>如果以下述範例來說明的話，這個物件會包含這些值，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="nx">count</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span> <span class="c1">// 觸控數量</span>
</span><span class='line'>  <span class="nx">history</span><span class="o">:</span> <span class="p">[</span> <span class="p">{...},</span> <span class="p">{...},</span> <span class="p">{...},</span> <span class="p">...</span> <span class="p">],</span> <span class="c1">// 所有移動過的資料物件，裡面的物件跟這個物件結構相同</span>
</span><span class='line'>  <span class="nx">identifier</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span> <span class="c1">// 觸控數量唯一識別值</span>
</span><span class='line'>  <span class="nx">origin</span><span class="o">:</span> <span class="nx">Surafce</span><span class="p">,</span> <span class="c1">// 觸控事件觸發來源</span>
</span><span class='line'>  <span class="nx">timestamp</span><span class="o">:</span> <span class="mi">140232312327</span><span class="p">,</span> <span class="c1">// 時間戳記</span>
</span><span class='line'>  <span class="nx">x</span><span class="o">:</span> <span class="mi">339</span><span class="p">,</span> <span class="c1">// 觸控坐標點 x</span>
</span><span class='line'>  <span class="nx">y</span><span class="o">:</span> <span class="mi">160</span> <span class="c1">// 觸控坐標點 y</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<h5>使用範例</h5>

<p>直接使用的話，你必須要有個元件才行，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="c1">// import dependencies</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">Engine</span>  <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Engine&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">Surface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Surface&#39;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">TouchTracker</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/inputs/TouchTracker&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">mainContext</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">touchtracker</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">TouchTracker</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">surface</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">500</span><span class="p">,</span> <span class="mi">500</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s1">&#39;red&#39;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">surface</span><span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">touchtracker</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">touchtracker</span><span class="p">.</span><span class="nx">on</span><span class="p">(</span><span class="s1">&#39;trackmove&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">mainContext</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">surface</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>下回待續 XDD</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Famo.us] SlideShow 模組開發]]></title>
    <link href="http://blog.hinablue.me/entry/famous-custom-module-slideshow/"/>
    <updated>2014-06-05T23:11:05+08:00</updated>
    <id>http://blog.hinablue.me/entry/famous-custom-module-slideshow</id>
    <content type="html"><![CDATA[<p>身為農夫，種點菜也是很合理的。</p>

<!-- more -->


<h3>Slideshow</h3>

<p><img src="http://blog.hinablue.me/images/famous-slideshow.jpg" alt="slideshow sketch" /></p>

<p>概念是這樣，我們利用左右兩邊的頁面來置換中間的頁面，所以只需要兩段 <code>Transform</code> 來做這個動作。這個東西其實用 Famo.us 幾個模組就能兜出來，只是為了方便起見，所以才把它打包成模組方便使用。</p>

<h4>Famo.us 模組</h4>

<p>由於 Famo.us 是使用 AMD 的方式來載入外部組件，所以基本上，就是寫一個屬於你自己的元件來使用。一個基本元件構成需要這幾個部分，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="s1">&#39;use strict&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">Slidershow</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Slidershow</span><span class="p">.</span><span class="nx">DEFAULT_OPTIONS</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Slidershow</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">commit</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">commit</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">container</span><span class="p">.</span><span class="nx">render</span><span class="p">();</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Slidershow</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">render</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">render</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">[</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>        <span class="nx">target</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">container</span><span class="p">.</span><span class="nx">render</span><span class="p">()</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">];</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">Slidershow</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>其中我們會看到 <code>commit</code> 與 <code>render</code> 兩個方法，這兩個方法在模組當中是屬於私有方法。這是 Famo.us 將元件交給 <code>Engine</code> 的時候所需要的方法。目前官方並沒有特別去解釋這兩個方法應該如何使用，不過萬能的原始碼還是會告訴我們一些端倪。</p>

<p>其中，如果你的 <code>render</code> 並不是返回 <code>RenderNode</code> 所需陣列，那你就必須要使用 <code>commit</code> 方法來返回單一 <code>render</code> 後的結果。</p>

<p>意思就是說，以下這兩種方法式可以交互使用的，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="s1">&#39;use strict&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">Slidershow</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">id</span> <span class="o">=</span> <span class="nx">Entity</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Slidershow</span><span class="p">.</span><span class="nx">DEFAULT_OPTIONS</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Slidershow</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">commit</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">commit</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">container</span><span class="p">.</span><span class="nx">render</span><span class="p">();</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Slidershow</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">render</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">render</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="k">this</span><span class="p">.</span><span class="nx">id</span><span class="p">;</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">Slidershow</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="s1">&#39;use strict&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">Slidershow</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Slidershow</span><span class="p">.</span><span class="nx">DEFAULT_OPTIONS</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Slidershow</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">render</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">render</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">[</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>        <span class="nx">target</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">container</span><span class="p">.</span><span class="nx">render</span><span class="p">()</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">];</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">Slidershow</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h4>渲染方式</h4>

<p>是的，你可以不使用 <code>commit</code>，但是你不能省略 <code>render</code> 這個方法。但是，其中 <code>render</code> 所返回的物件，根據原始碼觀落陰得知，大概是下列元件（這一點尚未跟官方證實，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="nx">align</span><span class="o">:</span> <span class="kc">null</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">opacity</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">origin</span><span class="o">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
</span><span class='line'>  <span class="nx">size</span><span class="o">:</span> <span class="kc">null</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">target</span><span class="o">:</span> <span class="mi">0</span><span class="p">,</span>
</span><span class='line'>  <span class="nx">transform</span><span class="o">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">]</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>其中 <code>align</code> 代表原件對齊的方式，僅接受二維陣列，例如 <code>[0, 0]</code> 或是 <code>[0.5, 0.5]</code> 這樣的寫法。而 <code>origin</code> 則是原件對齊的基準點，基本上是 <code>[0, 0]</code> 代表左上角。這兩個設定必須要同時存在，才會發生效用，如果其中一方是 <code>null</code> 則物件不會受到對齊的影響。</p>

<p><code>opacity</code> 則是指定整個物件的透明度，而 <code>size</code> 目前完全看不出來有什麼干擾，而 <code>transform</code> 則是接受 Famo.us 的 <code>Tramsform</code> 所產生的 Matrix3D 陣列，如果你想自己手寫也沒什麼問題。</p>

<p>而 <code>target</code> 就是最終要交給 <code>RenderNode</code> 去做產出的東西，如果你的 <code>target</code> 只是單純指定一個 <code>id</code> 或是字串，那麼你就必須要有 <code>commit</code> 來返回你需要演算的結果（也就是可渲染物件（ <em>renderable</em></p>

<p>所以，要就是使用 <code>render</code> 方法返回所有你需要渲染的物件，不然就是利用 <code>commit</code> 來返回單一渲染物件，差別僅在此。</p>

<h4>初始化</h4>

<p>首先，我們需要一個工具來管理我們的設定值，所以可以直接使用 <code>OptionsManager</code> 來達到我們的需求，然後，我們再給他一個基本的 <code>ContainerSurface</code> 好讓 <code>render</code> 可以去渲染這個元件，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="s1">&#39;use strict&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">OptionsManager</span>       <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/OptionsManager&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">ContainerSurface</span>     <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/surfaces/ContainerSurface&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">Slidershow</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">options</span> <span class="o">=</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">Slidershow</span><span class="p">.</span><span class="nx">DEFAULT_OPTIONS</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">_optionsManager</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">OptionsManager</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">options</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="k">this</span><span class="p">.</span><span class="nx">setOptions</span><span class="p">(</span><span class="nx">options</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">container</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ContainerSurface</span><span class="p">();</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Slidershow</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">setOptions</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">setOptions</span><span class="p">(</span><span class="nx">options</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">_optionsManager</span><span class="p">.</span><span class="nx">setOptions</span><span class="p">(</span><span class="nx">options</span><span class="p">);</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Slidershow</span><span class="p">.</span><span class="nx">prototype</span><span class="p">.</span><span class="nx">render</span> <span class="o">=</span> <span class="kd">function</span> <span class="nx">render</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">return</span> <span class="p">[</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>        <span class="nx">target</span><span class="o">:</span> <span class="k">this</span><span class="p">.</span><span class="nx">container</span><span class="p">.</span><span class="nx">render</span><span class="p">()</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">];</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">Slidershow</span><span class="p">.</span><span class="nx">DEFAULT_OPTIONS</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">width</span><span class="o">:</span> <span class="nb">window</span><span class="p">.</span><span class="nx">innerWidth</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">height</span><span class="o">:</span> <span class="mi">500</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">dotNav</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">controlNav</span><span class="o">:</span> <span class="kc">true</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">transition</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">duration</span><span class="o">:</span> <span class="mi">600</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">curve</span><span class="o">:</span> <span class="s1">&#39;easeInOut&#39;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">module</span><span class="p">.</span><span class="nx">exports</span> <span class="o">=</span> <span class="nx">Slidershow</span><span class="p">;</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>然後我們就做完了（咦！咦！咦！</p>

<h3>小結</h3>

<p>實際操作請參考這裡，</p>

<p><a href="http://famous.hinablue.me/SlideShow/">http://famous.hinablue.me/SlideShow/</a></p>

<p>原始碼請到我的 github 上面抄（誒</p>

<p><a href="https://github.com/hinablue/famous.tw/blob/master/SlideShow/js/Slidershow.js">https://github.com/hinablue/famous.tw/blob/master/SlideShow/js/Slidershow.js</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Famo.us] Event 核心與模組介紹]]></title>
    <link href="http://blog.hinablue.me/entry/famous-event-and-event-modules/"/>
    <updated>2014-06-05T22:59:58+08:00</updated>
    <id>http://blog.hinablue.me/entry/famous-event-and-event-modules</id>
    <content type="html"><![CDATA[<p>EventHandler, EventEmitter 這兩項核心很常出現在其他的模組當中，主要是負責事件控制、監聽與觸發，但是他跟 DOM 就沒有關係，單純的是綁在模組或是元件上面。</p>

<!-- more -->


<h3>EventEmitter 核心</h3>

<p>是 <code>EventHandler</code> 核心所依賴的核心（沒有之一，用於將事件往下擴散（或是將其子元件事件綁定在自己身上。</p>

<h4>方法</h4>

<ul>
<li><code>emit(type, event)</code> 觸發一個事件 <em>type</em>，並將該方法傳送到底下所屬的所有子處理程序</li>
<li><code>on(type, handler)</code> 綁定一個事件，並指派一個子處理程序 <em>handler</em></li>
<li><code>addListener</code> 等同於 <code>on</code></li>
<li><code>removeListener(type, handler)</code> 移除一個事件，並且移除其子處理程序 <em>handler</em></li>
<li><code>bindThis(owner)</code> 指定自身的擁有者（通常為另一個物件或是模組</li>
</ul>


<h3>EventHandler 核心</h3>

<p>依賴 <code>EventEmitter</code> 核心，做到更多事件控制的模組。他本身集合了事件與處理程序（<em>callback</em>）的分配，將二者放到陣列裡面互相對應，除了往下（<em>downstream</em>）傳遞之外，也能往上（<em>upstream</em>）監聽。</p>

<h4>靜態方法</h4>

<p>這兩項靜態方法，多是用於模組擴展時使用，目的是要讓你可以指派一個處理程序，讓他接收指定物件的事件觸發動作，或是接收指定物件的事件輸出。</p>

<ul>
<li><code>EventHandler.setInputHandler</code> 事件輸入（觸發</li>
<li><code>EventHandler.setOutputHandler</code> 事件輸出（控制器輸出</li>
</ul>


<h4>方法</h4>

<ul>
<li><code>emit</code>, <code>trigger</code> 同 <code>EventEmitter</code> 的 <code>emit</code></li>
<li><code>on</code>, <code>addListener</code> 同 <code>EventEmitter</code> 的 <code>on</code></li>
<li><code>pipe</code> 將自身的事件指派給指定的物件</li>
<li><code>unpipe</code> 取消上述指派</li>
<li><code>subscribe</code> 監聽來自上層物件的事件</li>
<li><code>unsubscribe</code> 取消上述監聽</li>
</ul>


<h3>EventHandler 補充</h3>

<p>整個 Famo.us 所有的事件控制都由這兩個模組延伸出去，其中 <code>EventHandler</code> 占了大多數，這個模組有兩個靜態方法，個別都是一種混插（<em>mixin</em>）的方法，</p>

<ul>
<li><code>setInputHandler</code> 可接受 <code>trigger</code>, <code>subscribe</code>, 與 <code>unsubscribe</code></li>
<li><code>setOutputHandler</code> 可接受 <code>pipe</code>, <code>unpipe</code>, <code>on</code>, <code>addListener</code>, 與 <code>removeListener</code></li>
</ul>


<p>這兩個靜態方法多用於模組擴充上面，意即，當你自行開發的模組需要使用事件的時候，可以設定兩組參數來接收這兩個靜態方法。而這兩組方法可以將所有的事件綁定在你所指定的控制器身上（通常是自己。</p>

<p>以 <code>Scrollview</code> 為例，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">_eventInput</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">EventHandler</span><span class="p">();</span>
</span><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">_eventOutput</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">EventHandler</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">_eventInput</span><span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">sync</span><span class="p">);</span>
</span><span class='line'><span class="k">this</span><span class="p">.</span><span class="nx">sync</span><span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">_eventInput</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">EventHandler</span><span class="p">.</span><span class="nx">setInputHandler</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">_eventInput</span><span class="p">);</span>
</span><span class='line'><span class="nx">EventHandler</span><span class="p">.</span><span class="nx">setOutputHandler</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="k">this</span><span class="p">.</span><span class="nx">_eventOutput</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h4>方法</h4>

<ul>
<li><code>emit</code>, <code>trigger</code> 針對監聽者群觸發事件（包含自定事件</li>
<li><code>pipe</code>, <code>unpipe</code> 針對監聽者群 A 發送（或取消）指定事件給 B 監聽者群</li>
<li><code>on</code>, <code>addListener</code> 針對監聽者群註冊事件</li>
<li><code>subscribe</code>, <code>unsubscribe</code> 針對監聽者群 A 訂閱（或取消）來自 B 監聽者群的指定事件</li>
</ul>


<p><code>pipe</code> 與 <code>subscribe</code> 可以解釋為，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// 以下兩種寫法，結果相同</span>
</span><span class='line'><span class="nx">objectA</span><span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">objectB</span><span class="p">);</span>
</span><span class='line'><span class="nx">objectB</span><span class="p">.</span><span class="nx">subscribe</span><span class="p">(</span><span class="nx">objectA</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h4>EventEmitter 方法補充</h4>

<ul>
<li><code>emit</code> 針對監聽者觸發事件</li>
<li><code>on</code>, <code>addListener</code> 針對監聽者註冊事件</li>
<li><code>removeListener</code> 針對監聽者移除事件</li>
</ul>


<p>注意與 <code>EventHandler</code> 不同的地方，在於 <code>EventHandler</code> 是針對所有 <em>同類型事件</em> 的監聽者群去做動作，而 <code>EventEmitter</code> 只會針對 <em>同類型事件</em> 的單一監聽者做動作。兩者的面相並不太一樣，簡單來說，如果是以模組擴展為原則，那麼就是直接使用 <code>EventHandler</code> 就可以了。</p>

<p>至於 <code>EventEmitter</code> 能做什麼，只要是你模組當中，只需要單一事件操控（或者說不想讓整個事件對外擴散或是外部有權控制，那麼用 <code>EventEmitter</code> 也許就能符合你的需求。</p>

<h3>Events 模組</h3>

<ul>
<li><code>EventMapper</code> 將事件控制方法指派給所指定的方法</li>
<li><code>EventFilter</code> 過濾事件控制方法與傳入資料，符合指定條件才會觸發事件</li>
<li><code>EventArbiter</code> 設定事件控制器的<em>模式</em></li>
</ul>


<h4>EventMapper</h4>

<p>必須要傳入一個物件，這個物件需要擁有等同于 <code>EventEmitter</code> 或是 <code>EventHandler</code> 模組的條件，或是必須要有 <code>emit</code> 方法（此為必要條件之一</p>

<p>該模組的功能是，將所傳入的事件與其資料，透過所指定的物件，去觸發自定的事件控制器，舉個例子來說，當我觸發 <code>click</code> 的時候，我可以透過 <code>EventMapper</code> 將這個 <code>click</code> 事件，在物件中觸發，並去執行其他的程序。</p>

<p>有點類似於事件控制的路由器的角色。</p>

<h4>EventFilter</h4>

<p>必須要傳入一個條件程序，該條件程序必須返回 <code>true</code> 或 <code>false</code>，用以過濾所傳入的事件是否允許被觸發，這個條件程序的寫法為，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">condition</span> <span class="o">=</span> <span class="kd">function</span><span class="p">(</span> <span class="nx">type</span><span class="p">,</span> <span class="nx">data</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">type</span> <span class="o">=</span> <span class="nx">type</span><span class="p">;</span> <span class="c1">// 所傳入的事件，例如 click</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">data</span> <span class="o">=</span> <span class="nx">data</span><span class="p">;</span> <span class="c1">// 所傳入的事件資料</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="kc">true</span><span class="p">;</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>這個模組最主要是用於判別哪些事件，是否要在元件中被觸發。可以有效的控制透過 <code>EventHandler</code> 所傳來的事件，讓事件有執行與否的決定權。</p>

<h4>EventArbiter</h4>

<p>設定事件模式，這個模組有兩個特殊方法，</p>

<ul>
<li><code>setMode</code> 將事件派發指定為該模式</li>
<li><code>forMode</code> 建立一個事件派發模式（或是返回該模式所屬的事件控制，如果該模式已存在</li>
</ul>


<p>這個模組的功用，在於設定整個事件傳送過程中，事件被傳遞到哪一個位置上，所設計出來的。舉個簡易的例子來說，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">eventArbiter</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">EventArbiter</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="nx">eventArbiter</span><span class="p">.</span><span class="nx">forMode</span><span class="p">(</span><span class="s1">&#39;start&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">eventArbiter</span><span class="p">.</span><span class="nx">forMode</span><span class="p">(</span><span class="s1">&#39;step1&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">eventArbiter</span><span class="p">.</span><span class="nx">forMode</span><span class="p">(</span><span class="s1">&#39;step2&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">eventArbiter</span><span class="p">.</span><span class="nx">forMode</span><span class="p">(</span><span class="s1">&#39;end&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">eventArbiter</span><span class="p">.</span><span class="nx">setMode</span><span class="p">(</span><span class="s1">&#39;start&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>上述它會自動產生四個 <code>EventHandler</code> 的模組，分別在四種模式 <code>start</code>, <code>step1</code>, <code>step2</code>, 與 <code>end</code>，然後，我們將他設定在 <code>start</code>，則該模組（<em>eventArbiter</em>）會派發事件給所屬的 <code>EventHandler</code>，並且會觸發一個 <code>change</code> 事件，傳出 <code>{from: startMode, to: mode}</code> 這樣的資料。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Famo.us] Transform 核心模組]]></title>
    <link href="http://blog.hinablue.me/entry/famous-transform/"/>
    <updated>2014-06-05T22:52:25+08:00</updated>
    <id>http://blog.hinablue.me/entry/famous-transform</id>
    <content type="html"><![CDATA[<p>Transform 是整個 Famo.us 動態效果的核心，預設全部都使用 <code>matrix3d()</code> 來做，有關於 <code>matrix</code> 的部分，可以參考 <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function">MDN 的說明</a>。</p>

<!-- more -->


<h3>Transform 核心</h3>

<p>由於是使用 <code>matrix3d</code> 的關係，所以 <code>Transform</code> 最終輸出的結果，都會是一組 16 個數字的陣列（它是由一組 4x4 的矩陣轉換而來，上述提及的 MDN 說明當中，有詳細的數學說明，有興趣的人可以去研究一下</p>

<p>這個核心可以做的事情很多，最主要就是幫你把 <code>matrix3d</code> 繁瑣的運算換成方法，他也提供了不少運算用的方法，如果你有需要的話。</p>

<h4>常見方法</h4>

<p>由於整個 <code>Transform</code> 都是靜態方法，所以直接呼叫就會返回相對應的陣列。</p>

<ul>
<li><code>Transform.translate(x, y, z)</code> 三軸方向移動</li>
<li><code>Transform.scale(x, y, z)</code> 三軸方向縮放</li>
<li><code>Transform.rotate(phi, theta, psi)</code> 三軸方向旋轉，x 代表 phi，y 代表 theta，z 則是 psi，傳入的並不是角度，而是弧度（<em>radians</em>），亦即 <code>Math.PI * 45 / 180</code> 代表旋轉 45 度。</li>
<li><code>Transform.rotateX(phi)</code>, <code>Transform.rotateY(theta)</code>, <code>Transform.rotateZ(psi)</code> 將上述的 <code>rotate</code> 拆分成三個軸</li>
<li><code>Transform.skew(phi, theta, psi)</code> 三軸傾斜</li>
<li><code>Transform.perspective(focusZ)</code> 取得 Z 軸透視（單位 px</li>
</ul>


<h4>運算方法</h4>

<ul>
<li><code>Transform.multiply4x4(a, b)</code> 兩組 <code>Transform</code> 矩陣相乘，<code>a</code>, <code>b</code> 必須皆為 <code>Transform</code> 所產生的 4x4 矩陣（一組 16 個數字陣列</li>
<li><code>Transform.multiply(a, b)</code> 快速矩陣相乘（將矩陣最後一列改為 <code>[0, 0, 0, 1]</code> 相乘</li>
<li><code>Transform.thenMove(m, t)</code> 回傳矩陣依照 <code>t</code> 方向移動後的結果矩陣</li>
<li><code>Transform.moveThen(v, m)</code> 先依照 <code>v</code> 方向運算移動矩陣，之後再將運算結果做一次 <code>thenMove</code> 的運算</li>
<li><code>Transform.thenScale(m, s)</code> 回傳矩陣依照 <code>s</code> 方向縮放後的結果矩陣</li>
<li><code>Transform.rotateAxis(v, theta)</code> 回傳矩陣依照指定軸 <code>v</code> 順時鐘旋轉 <code>theta</code> 的結果矩陣，指定軸 <code>v</code> 必須為一組陣列，包含三個繞軸的單位向量（<em>unit vector representing the axis</em>）</li>
<li><code>Transform.aboutOrigin(v, m)</code> 返回一個相對於變形原點的矩陣，<code>v</code> 是為原點，<code>m</code> 為變形後的一組 <code>Transform</code></li>
<li><code>Transform.getTranslate(m)</code> 返回一組移動向量，<code>m</code> 為變形後的一組 <code>Transform</code></li>
<li><code>Transform.inverse(m)</code> 返回一個 <code>m</code> 的<a href="http://zh.wikipedia.org/wiki/%E4%BB%BF%E5%B0%84%E5%8F%98%E6%8D%A2">仿射矩陣</a>的反矩陣</li>
<li><code>Transform.transpose(m)</code> 返回一個 <code>m</code> 的<a href="http://zh.wikipedia.org/wiki/%E8%BD%AC%E7%BD%AE%E7%9F%A9%E9%98%B5">轉置矩陣</a></li>
<li><code>Transform.interpret(M)</code> 將 <code>M</code> 拆解成 <code>translate</code>, <code>rotate</code>, <code>scale</code> 與 <code>skew</code> 元件</li>
<li><code>Transform.average(M1, M2, t)</code> 回傳一組 <code>M1</code>, <code>M2</code> 加權平均的陣列，<code>t</code> 為權數</li>
<li><code>Transform.build(spec)</code> 將 <code>translate</code>, <code>rotate</code>, <code>scale</code> 與 <code>skew</code> 元件組合為 <code>Transform</code> 陣列</li>
<li><code>Transform.equals(a, b)</code> 比較 <code>a</code>, <code>b</code> 是否相同</li>
<li><code>Transform.notEquals(a, b)</code> 比較 <code>a</code>, <code>b</code> 是否不相同</li>
<li><code>Transform.normalizeRotation(rotation)</code> 將三軸旋轉的結果侷限在 <code>-pi ~ pi</code> 之間，<code>rotation</code> 必須是三個浮點數所組成之陣列</li>
</ul>


<h4>屬性方法</h4>

<ul>
<li><code>Transform.inFront</code> 是一組陣列，目的是將目標物件依照 Z 軸往上拉昇一個位階</li>
<li><code>Transform.behind</code> 與上述相反，往下推降一個位階</li>
</ul>


<h4>簡易範例</h4>

<p> <a href="http://famous.hinablue.me/transformExamples/">http://famous.hinablue.me/transformExamples/</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Famo.us] RenderNode 核心說明]]></title>
    <link href="http://blog.hinablue.me/entry/famous-rendernode/"/>
    <updated>2014-06-05T22:48:57+08:00</updated>
    <id>http://blog.hinablue.me/entry/famous-rendernode</id>
    <content type="html"><![CDATA[<p>RenderNode 算是整個 Famo.us 對於元件樹狀結構的核心，他專門用來處理你的元件，在樹狀結構中應該要<strong>怎麼長</strong>是靠他來處理。</p>

<!-- more -->


<h3>RenderNode 核心</h3>

<p>這個核心很特殊，你應該也幾乎沒有機會能直接使用他。他的初始化必須要是一個可渲染（<em>renderable</em>）的元件，而這個元件經過初始化後，自身就會轉換成 RenderNode 物件，來提供給 Famo.us 的引擎去做渲染動作。</p>

<p>什麼叫做可渲染元件？官方定義的有，</p>

<ul>
<li><code>core/Group</code></li>
<li><code>core/RenderNode</code></li>
<li><code>core/Scene</code></li>
<li><code>core/Surface</code></li>
<li><code>core/View</code></li>
<li><code>core/ViewSequence</code></li>
<li><code>surfaces/ContainerSurface</code></li>
<li><code>views/EdgeSwapper</code></li>
<li><code>views/GridLayout</code></li>
<li><code>views/HeaderFooterLayout</code></li>
<li><code>views/Lightbox</code></li>
<li><code>views/RenderController</code></li>
<li><code>views/ScrollContainer</code></li>
<li><code>views/Scroller</code></li>
<li><code>views/Scrollview</code></li>
<li><code>views/SequentialLayout</code></li>
<li><code>widgets/Slider</code></li>
<li><code>widgets/ToggleButton</code></li>
</ul>


<p>以後會不會增加，不確定。</p>

<h4>渲染</h4>

<p>渲染方式是依照堆疊在他的 <code>_child</code> 中的物件分層次，透過 <code>ElementAllocator</code> 將物件產出到 DOM 裡面去，順序這件事情之前在 Famo.us 官方有人提出討論過，實驗的結果，好像是先 <code>var</code> 先贏！</p>

<p>我實際就沒有太深入去研究這個順序問題，不過對於 DOM 來說，誰先誰後好像又會牽扯到 <code>z-index</code> 的問題，官方的解法是要你使用 <code>Transform</code> 去解決，不過，個人覺得，如果你真的很在意 DOM 順序，請在 <code>new</code> 任何可渲染物件的時候，留意一下上下順序（由上到下，DOM 就由先到後</p>

<h4>方法</h4>

<ul>
<li><code>add</code> 加一個子元件（一定要有一個可渲染物件</li>
<li><code>get</code> 取得第一個子元件，或是自己</li>
<li><code>set</code> 覆寫所有子元件，或是自己</li>
<li><code>getSize</code> 第一個子元件（或自己）的尺寸</li>
</ul>


<p>對於 <code>add</code> 有一個特別的使用方式（對於 <code>Modifier</code> 來說），舉例子來看會比較清楚，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">Engine</span>     <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;famous/core/Engine&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">Surface</span>    <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;famous/core/Surface&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">Modifier</span>   <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;famous/core/Modifier&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">RenderNode</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;famous/core/RenderNode&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">mainContext</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">renderNode</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">RenderNode</span><span class="p">();</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">modifier</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Modifier</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">origin</span><span class="o">:</span> <span class="p">[</span><span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">]</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">surface</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">content</span><span class="o">:</span> <span class="s2">&quot;Secondary&quot;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">lineHeight</span><span class="o">:</span> <span class="s2">&quot;100px&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">textAlign</span><span class="o">:</span> <span class="s2">&quot;center&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s2">&quot;red&quot;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>    <span class="nx">renderNode</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">modifier</span><span class="p">).</span><span class="nx">add</span><span class="p">(</span><span class="nx">surface</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">renderNode</span><span class="p">.</span><span class="nx">get</span><span class="p">());</span> <span class="c1">// You will get the Modifier, not Surface.</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">mainContext</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">renderNode</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>你會發現，你用 <code>get()</code> 的時候，會拿到 <code>Modifier</code> 而非 <code>Surface</code>，這一點是因為 <code>Modifier</code> 可以被加入到任何 <code>RenderNode</code> 物件裡面，所以即便他並不是可渲染物件，他還是可以存在於 <code>RenderNode</code> 當中，這是比較特別的地方。</p>

<p>好處？好處就是動態效果製作時，我可以直接由 <code>RenderNode</code> 當中取出 <code>Modifier</code>，而不用另外找地方儲存（這樣還得用迴圈去運算，費時耗工</p>

<h4>使用時機</h4>

<p>通常 <code>RenderNode</code> 只是提供一個容器給物件來做存放，在開發 widgets 或是特殊的 views 的時候比較常見，由於 <code>get()</code> 方法相當方便（如上所述，對於 <code>Modifier</code> 相當友善），所以，如果你不是需要特殊物件的效果，也可以使用 <code>RenderNode</code> 來儲存你的元件。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Famo.us] Scene 核心說明]]></title>
    <link href="http://blog.hinablue.me/entry/famous-scene/"/>
    <updated>2014-06-05T22:46:32+08:00</updated>
    <id>http://blog.hinablue.me/entry/famous-scene</id>
    <content type="html"><![CDATA[<p>這個核心模組是用於提供一個已經定義好的結構化場景，定義什麼呢？</p>

<!-- more -->


<h3>Scene 核心</h3>

<p>說穿了，他等同於一組 <code>Modifier</code> 物件，定義了以下這些事情，</p>

<ul>
<li><code>translate</code></li>
<li><code>rotate</code></li>
<li><code>rotateX</code></li>
<li><code>rotateY</code></li>
<li><code>rotateZ</code></li>
<li><code>rotateAxis</code></li>
<li><code>scale</code></li>
<li><code>skew</code></li>
</ul>


<p>以上必須要是 <code>Transform</code> 模組的相對應物件。</p>

<ul>
<li><code>matrix3d</code></li>
</ul>


<p>以上必須要是一個 <code>Function</code> 用以返回 <code>matrix3d</code> 的數組（陣列數組</p>

<p>由於 <code>Scene</code> 本身會產生 <code>RenderNode</code> 的物件，所以有關於 <code>RenderNode</code> 的相關設定他也可以延伸使用，它會將相關的設定，套用到場景中的子元件身上。</p>

<p>另外，你需要一個 <code>id</code> 來識別這個場景。</p>

<h4>方法</h4>

<p>這個模組只有三種方法，</p>

<ul>
<li><code>create</code> 字面上叫做建立，實際上，他會複製一個場景</li>
<li><code>load</code> 讀取定義好的場景屬性，但是不真實建立一個場景物件</li>
<li><code>add</code> 將物件加入對應的場景子元件設定當中</li>
</ul>


<h4>簡單範例</h4>

<p>以下範例取自官方 <a href="https://github.com/Famous/examples/blob/master/src/examples/core/Scene/example.js">Famo.us Example</a> 並且加入額外的修改，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">Engine</span>     <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;famous/core/Engine&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">Surface</span>    <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;famous/core/Surface&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">Scene</span>      <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;famous/core/Scene&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">Transform</span>  <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s2">&quot;famous/core/Transform&quot;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">mainContext</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">sceneDefinition</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">id</span><span class="o">:</span> <span class="s2">&quot;root&quot;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">opacity</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">target</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>            <span class="p">{</span>
</span><span class='line'>                <span class="nx">transform</span><span class="o">:</span> <span class="nx">Transform</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span>
</span><span class='line'>                <span class="nx">target</span><span class="o">:</span> <span class="p">{</span><span class="nx">id</span><span class="o">:</span> <span class="s2">&quot;foo&quot;</span><span class="p">}</span>
</span><span class='line'>            <span class="p">},</span>
</span><span class='line'>            <span class="p">{</span>
</span><span class='line'>                <span class="nx">transform</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>                    <span class="p">{</span><span class="nx">rotateZ</span><span class="o">:</span> <span class="mf">0.1</span><span class="p">},</span>
</span><span class='line'>                    <span class="p">{</span><span class="nx">scale</span><span class="o">:</span> <span class="p">[</span><span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">,</span> <span class="mi">1</span><span class="p">]}</span>
</span><span class='line'>                <span class="p">],</span>
</span><span class='line'>                <span class="nx">origin</span><span class="o">:</span> <span class="p">[</span><span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">],</span>
</span><span class='line'>                <span class="nx">target</span><span class="o">:</span> <span class="p">{</span><span class="nx">id</span><span class="o">:</span> <span class="s2">&quot;bar&quot;</span><span class="p">}</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">]</span>
</span><span class='line'>    <span class="p">};</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">myScene</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Scene</span><span class="p">(</span><span class="nx">sceneDefinition</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">surface</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">400</span><span class="p">,</span> <span class="mi">400</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">content</span><span class="o">:</span> <span class="s2">&quot;Hello World&quot;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">classes</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;red-bg&quot;</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">lineHeight</span><span class="o">:</span> <span class="s2">&quot;400px&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">textAlign</span><span class="o">:</span> <span class="s2">&quot;center&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s2">&quot;red&quot;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">surfaceTwo</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">400</span><span class="p">,</span> <span class="mi">400</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">content</span><span class="o">:</span> <span class="s2">&quot;Secondary&quot;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">classes</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;grey-bg&quot;</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">lineHeight</span><span class="o">:</span> <span class="s2">&quot;400px&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">textAlign</span><span class="o">:</span> <span class="s2">&quot;center&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s2">&quot;red&quot;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">surfaceThree</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">200</span><span class="p">,</span> <span class="mi">200</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">content</span><span class="o">:</span> <span class="s2">&quot;Hello World&quot;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">classes</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;red-bg&quot;</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">lineHeight</span><span class="o">:</span> <span class="s2">&quot;200px&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">textAlign</span><span class="o">:</span> <span class="s2">&quot;center&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s2">&quot;black&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">color</span><span class="o">:</span> <span class="s2">&quot;white&quot;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">surfaceFour</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">200</span><span class="p">,</span> <span class="mi">200</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">content</span><span class="o">:</span> <span class="s2">&quot;Secondary&quot;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">classes</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;grey-bg&quot;</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">lineHeight</span><span class="o">:</span> <span class="s2">&quot;200px&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">textAlign</span><span class="o">:</span> <span class="s2">&quot;center&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s2">&quot;black&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">color</span><span class="o">:</span> <span class="s2">&quot;white&quot;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">surfaceFive</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">content</span><span class="o">:</span> <span class="s2">&quot;Hello World&quot;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">classes</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;red-bg&quot;</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">lineHeight</span><span class="o">:</span> <span class="s2">&quot;100px&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">textAlign</span><span class="o">:</span> <span class="s2">&quot;center&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s2">&quot;white&quot;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">surfaceSix</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">content</span><span class="o">:</span> <span class="s2">&quot;Secondary&quot;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">classes</span><span class="o">:</span> <span class="p">[</span><span class="s2">&quot;grey-bg&quot;</span><span class="p">],</span>
</span><span class='line'>        <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>            <span class="nx">lineHeight</span><span class="o">:</span> <span class="s2">&quot;100px&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">textAlign</span><span class="o">:</span> <span class="s2">&quot;center&quot;</span><span class="p">,</span>
</span><span class='line'>            <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s2">&quot;white&quot;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">mySceneClone</span> <span class="o">=</span> <span class="nx">myScene</span><span class="p">.</span><span class="nx">create</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">mySceneClone</span><span class="p">.</span><span class="nx">id</span><span class="p">[</span><span class="s2">&quot;foo&quot;</span><span class="p">].</span><span class="nx">add</span><span class="p">(</span><span class="nx">surfaceFive</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">mySceneClone</span><span class="p">.</span><span class="nx">id</span><span class="p">[</span><span class="s2">&quot;bar&quot;</span><span class="p">].</span><span class="nx">add</span><span class="p">(</span><span class="nx">surfaceSix</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">mainContext</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">mySceneClone</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">myScene</span><span class="p">.</span><span class="nx">id</span><span class="p">[</span><span class="s2">&quot;foo&quot;</span><span class="p">].</span><span class="nx">add</span><span class="p">(</span><span class="nx">surfaceThree</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">myScene</span><span class="p">.</span><span class="nx">id</span><span class="p">[</span><span class="s2">&quot;bar&quot;</span><span class="p">].</span><span class="nx">add</span><span class="p">(</span><span class="nx">surfaceFour</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">mainContext</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">myScene</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">newScene</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Scene</span><span class="p">()</span>
</span><span class='line'>    <span class="nx">newScene</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="nx">sceneDefinition</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">newScene</span><span class="p">.</span><span class="nx">id</span><span class="p">[</span><span class="s2">&quot;foo&quot;</span><span class="p">].</span><span class="nx">add</span><span class="p">(</span><span class="nx">surface</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">newScene</span><span class="p">.</span><span class="nx">id</span><span class="p">[</span><span class="s2">&quot;bar&quot;</span><span class="p">].</span><span class="nx">add</span><span class="p">(</span><span class="nx">surfaceTwo</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">mainContext</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">newScene</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>我們以上面的例子來說明，首先我們建立一個場景，叫做 <code>root</code>，然後賦予一個屬性，叫做 <code>opacity: 1</code>，接著開始設定子元件的特性（簡單來說，就是統一設定個別的 <code>Modifier</code></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">sceneDefinition</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">id</span><span class="o">:</span> <span class="s2">&quot;root&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">opacity</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">target</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="nx">transform</span><span class="o">:</span> <span class="nx">Transform</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">10</span><span class="p">),</span>
</span><span class='line'>            <span class="nx">target</span><span class="o">:</span> <span class="p">{</span><span class="nx">id</span><span class="o">:</span> <span class="s2">&quot;foo&quot;</span><span class="p">}</span>
</span><span class='line'>        <span class="p">},</span>
</span><span class='line'>        <span class="p">{</span>
</span><span class='line'>            <span class="nx">transform</span><span class="o">:</span> <span class="p">[</span>
</span><span class='line'>                <span class="p">{</span><span class="nx">rotateZ</span><span class="o">:</span> <span class="mf">0.1</span><span class="p">},</span>
</span><span class='line'>                <span class="p">{</span><span class="nx">scale</span><span class="o">:</span> <span class="p">[</span><span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">,</span> <span class="mi">1</span><span class="p">]}</span>
</span><span class='line'>            <span class="p">],</span>
</span><span class='line'>            <span class="nx">origin</span><span class="o">:</span> <span class="p">[</span><span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">],</span>
</span><span class='line'>            <span class="nx">target</span><span class="o">:</span> <span class="p">{</span><span class="nx">id</span><span class="o">:</span> <span class="s2">&quot;bar&quot;</span><span class="p">}</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">]</span>
</span><span class='line'><span class="p">};</span>
</span></code></pre></td></tr></table></div></figure>


<p>最後，把對應的子元件加入場景，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">myScene</span><span class="p">.</span><span class="nx">id</span><span class="p">[</span><span class="s2">&quot;foo&quot;</span><span class="p">].</span><span class="nx">add</span><span class="p">(</span><span class="nx">surface</span><span class="p">);</span>
</span><span class='line'><span class="nx">myScene</span><span class="p">.</span><span class="nx">id</span><span class="p">[</span><span class="s2">&quot;bar&quot;</span><span class="p">].</span><span class="nx">add</span><span class="p">(</span><span class="nx">surfaceTwo</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>你也可以先新增一個場景，然後再讀入設定，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">newScene</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Scene</span><span class="p">()</span>
</span><span class='line'><span class="nx">newScene</span><span class="p">.</span><span class="nx">load</span><span class="p">(</span><span class="nx">sceneDefinition</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>或者是，複製一個場景（複製的功能<strong>不會</strong>複製底下的物件，所以，你必須把物件<strong>加回去</strong></p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">mySceneClone</span> <span class="o">=</span> <span class="nx">myScene</span><span class="p">.</span><span class="nx">create</span><span class="p">();</span>
</span><span class='line'><span class="nx">mySceneClone</span><span class="p">.</span><span class="nx">id</span><span class="p">[</span><span class="s2">&quot;foo&quot;</span><span class="p">].</span><span class="nx">add</span><span class="p">(</span><span class="nx">surfaceFive</span><span class="p">);</span>
</span><span class='line'><span class="nx">mySceneClone</span><span class="p">.</span><span class="nx">id</span><span class="p">[</span><span class="s2">&quot;bar&quot;</span><span class="p">].</span><span class="nx">add</span><span class="p">(</span><span class="nx">surfaceSix</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h4>額外屬性</h4>

<p>還記得剛剛的 <code>opacity: 1</code> 嗎？我說過 <code>Scene</code> 其實是一組類似 <code>Modifier</code> 模組的東西，所以，你可以用這一類的屬性來直接套用到<strong>全部</strong>的子元件上面，例如，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">var</span> <span class="nx">sceneDefinition</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">id</span><span class="o">:</span> <span class="s2">&quot;root&quot;</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">opacity</span><span class="o">:</span> <span class="mi">1</span><span class="p">,</span>
</span><span class='line'>        <span class="nx">origin</span><span class="o">:</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="c1">// 全部子元件都給他 origin: [1, 1] 的設定</span>
</span><span class='line'><span class="c1">// 後略</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Famo.us] Surface 與 Modifier 核心模組]]></title>
    <link href="http://blog.hinablue.me/entry/famous-surface-and-modifier/"/>
    <updated>2014-06-05T22:40:39+08:00</updated>
    <id>http://blog.hinablue.me/entry/famous-surface-and-modifier</id>
    <content type="html"><![CDATA[<p>Surface 與 Modifier 是最常使用的模組，<a href="http://blog.hinablue.me/entry/famous-install-and-play-with-surface-modifier/">先前</a>有提過，這次稍微詳細介紹一下。</p>

<!-- more -->


<h3>Surface 核心模組</h3>

<p>這個模組預設會產生一組 <code>&lt;div&gt;</code> 的 DOM 元素，然後再進行操作。初始化的參數可以有，</p>

<ul>
<li><code>size</code> 是個陣列 [width, height] 單位是 px，必須要是數字</li>
<li><code>classes</code> 也是陣列，這裡的內容會是 <code>&lt;div&gt;</code> 元素的 class 屬性值</li>
<li><code>properties</code> 必須是一個 Object，內容是 CSS 設定值</li>
<li><code>content</code> 內容是 HTML 字串</li>
</ul>


<h4>可改變的設定</h4>

<ul>
<li><code>elementType</code> 預設是 <code>div</code>，你也可以用 <code>span</code> 他就會建立一個 <code>&lt;span&gt;</code> 的 DOM 元素</li>
<li><code>elementClass</code> 預設是 <code>famous-surface</code>，你也可以改掉</li>
</ul>


<h4>模組方法</h4>

<ul>
<li><code>on</code>, <code>removeListener</code>, <code>emit</code>, <code>pipe</code>, <code>unpipe</code> 與 <code>EventHandler</code> 有關，主要就是用於監聽事件，或是將自身事件傳遞給指定模組</li>
<li><code>setProperties</code>, <code>getProperties</code> 設定與取出 <code>properties</code> 內容</li>
<li><code>addClass</code>, <code>removeClass</code> 設定與移除單一 class</li>
<li><code>setClasses</code>, <code>getClassList</code> 設定多組 class 與取得目前 classes 列表</li>
<li><code>setContent</code>, <code>getContent</code> 設定與取得 content 內容</li>
<li><code>setOptions</code> 改變 options 初始值</li>
<li><code>getSize</code>, <code>setSize</code> 設定與取得 size</li>
</ul>


<h3>Modifier 核心</h3>

<p><a href="http://blog.hinablue.me/entry/famous-install-and-play-with-surface-modifier/">之前</a>有提過 Modifier 的一些使用說明，不過最近一次官方更新，有些東西被棄用了（至於要怎麼取代，或是用什麼取代，就沒有特別提及。</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;famous-surface&quot;</span> <span class="na">style=</span><span class="s">&quot;/* Modifier 會在這裡發生 */&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>其他的就不再贅述，先來看看可以使用的屬性與方法，</p>

<ul>
<li><code>transform</code> CSS3 變形設定，必須傳入 <code>Transform</code> 物件</li>
<li><code>opacity</code> 透明度，數字，範圍由 0 ~ 1</li>
<li><code>origin</code> 對齊，詳情請看<a href="http://blog.hinablue.me/entry/famous-install-and-play-with-surface-modifier/">之前的介紹</a></li>
<li><code>size</code> 尺寸，詳情請看<a href="http://blog.hinablue.me/entry/famous-install-and-play-with-surface-modifier/">之前的介紹</a></li>
</ul>


<h4>方法</h4>

<ul>
<li><code>transformFrom</code> 設定變形</li>
<li><code>opacityFrom</code> 設定透明度</li>
<li><code>originFrom</code> 設定對齊定位</li>
<li><code>sizeFrom</code> 設定尺寸</li>
</ul>


<h4>以下方法將來會棄用</h4>

<ul>
<li><code>setTransform</code></li>
<li><code>setOpacity</code></li>
<li><code>setOrigin</code></li>
<li><code>setSize</code></li>
<li><code>halt</code></li>
<li><code>getTransform</code></li>
<li><code>getFinalTransform</code></li>
<li><code>getOpacity</code></li>
<li><code>getOrigin</code></li>
<li><code>getSize</code></li>
</ul>


<p>棄用超多的（雖然目前還可用，不過如果有用到，得改掉才行。基本上，在 <code>Modifier</code> 原始碼當中，對於棄用這些方法，都有給建議的替代方式，不過大多都是說，</p>

<p><strong>叫你去原先設定 Transform 的物件去拿</strong></p>

<p>我不知道這樣是好是壞，對於 <code>Modifier</code> 來說，他不用扛那麼多東西在身上或許是好，不過對於開發者來說，還得多準備一個地方來放對應的 <code>Transform</code> 或是 <code>TransitionableTransform</code> 其實也挺傷腦筋的。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Famo.us] Engine, Context 與 ElementAllocator]]></title>
    <link href="http://blog.hinablue.me/entry/famous-engine-context-and-elementallocator/"/>
    <updated>2014-05-12T12:25:29+08:00</updated>
    <id>http://blog.hinablue.me/entry/famous-engine-context-and-elementallocator</id>
    <content type="html"><![CDATA[<p>這三樣東西是組成 Famo.us 引擎的主要功臣，負責 rFA 與 DOM 的溝通橋樑。</p>

<!-- more -->


<h3>Engine 核心</h3>

<p>在 Famo.us 當中，這個核心做的事情其實並不會太多，大抵上就是這些，</p>

<ul>
<li>設定 <a href="https://developer.mozilla.org/zh-TW/docs/Web/API/Window.requestAnimationFrame">rFA</a></li>
<li>監聽 <code>resize</code></li>
<li>強迫取消 <code>touchmove</code> 事件（使用 preventDefault()</li>
<li>使用 <code>EventHandler</code> 監聽事件</li>
<li>使用 <code>OptionsManager</code> 設定預設值，並且監聽其 <code>change</code> 來更新元件</li>
</ul>


<h4>Engine 方法</h4>

<ul>
<li><code>pipe</code>, <code>unpipe</code>, <code>on</code>, <code>emit</code> 對於 <code>EventHandler</code> 相關模組的操作</li>
<li><code>getFPS</code> 取得目前 Engine 的 FPS</li>
<li><code>setFPSCap</code> 設定 FPS 上限</li>
<li><code>setOptions</code> 設定 Engine 的屬性</li>
<li><code>createContext</code> 建立一個 div 的 Engine 框架，所有元件都必須被 <code>add</code> 在這個框架裡面。這個框架是採用核心模組 <code>Context</code> 來建立，所以會回傳 <code>Context</code> 這個元件。</li>
<li><code>registerContext</code> 用來註冊一個 <code>Context</code> 元件，並且在下一次 loop 的時候出現在畫面上</li>
<li><code>nextTick</code> 傳入下一個 loop 所需要執行的 function（它只會執行一次</li>
<li><code>defer</code> 跟 <code>nextTick</code> 很類似，但是是延遲執行（如果每次運行時間小於 <code>MAX_DEFER_FRAME_TIME</code> 的話，預設是 10（單位秒</li>
</ul>


<h4>Engine 監聽事件</h4>

<ul>
<li><code>prerender</code> 在做 <code>nextTick</code> 與 <code>defer</code> 之前會先 emmit</li>
<li><code>postrender</code> 做完 <code>nextTick</code> 與 <code>defer</code> 之後才會 emmit</li>
</ul>


<h4>FPS</h4>

<p>預設的 Engine 所使用的 FPS 是 <code>1000 / frameTime</code>，而這個 <code>frameTime</code> 的來由，是經過每次 loop 的執行時間去相減（單位是秒，也就是說，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">frameTime</span> <span class="o">=</span> <span class="err">目前時間</span> <span class="o">-</span> <span class="err">上一次運行的時間戳記</span>
</span></code></pre></td></tr></table></div></figure>


<p>所以 Engine 並不是真的運行在 60 fps 底下的，而是依照你的瀏覽器執行時間來決定目前的 FPS 該是多少。而，<code>setFPSCap</code> 則是在這個取得 <code>frameTime</code> 的方法之前，做一個限制，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="c1">// skip frame if we&#39;re over our framerate cap</span>
</span><span class='line'><span class="k">if</span> <span class="p">(</span><span class="nx">frameTimeLimit</span> <span class="o">&amp;&amp;</span> <span class="nx">currentTime</span> <span class="o">-</span> <span class="nx">lastTime</span> <span class="o">&lt;</span> <span class="nx">frameTimeLimit</span><span class="p">)</span> <span class="k">return</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>也就是說，如果你設定 <code>Engine.setFPSCap( 60 );</code> 就代表這個 <code>frameTimeLimit</code> 是 <code>1000 / 60</code>，如果運行的 loop 小於這個時間（速度過快，那麼這一次的 loop 就不會被執行了。</p>

<h4>使用範例</h4>

<p>以下是 <code>Engine.createContext</code>, <code>Engine.registerContext</code> 操作範例，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Engine</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Engine&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Context</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Context&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Surface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Surface&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">elem</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">&#39;div&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">elem</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">backgroundColor</span> <span class="o">=</span> <span class="s1">&#39;black&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">elem</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">width</span> <span class="o">=</span> <span class="s1">&#39;100px&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">elem</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">height</span> <span class="o">=</span> <span class="s1">&#39;100px&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">elem</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">context</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Context</span><span class="p">(</span><span class="nx">elem</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">Engine</span><span class="p">.</span><span class="nx">registerContext</span><span class="p">(</span> <span class="nx">context</span> <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">mainCtx</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">surface</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s1">&#39;red&#39;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">mainCtx</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">surface</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>輸出結果在畫面上，你可以看瀏覽器所產生的 DOM 會有兩個 <code>&lt;div&gt;</code>，大概會長這樣，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">style=</span><span class="s">&quot;background-color: black; width: 100px; height: 100px;&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;famous-container&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">style=</span><span class="s">&quot;transform-origin: 0% 0% 0px; opacity: 0.999999; z-index: 0; transform: matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1); background-color: black; width: 100px; height: 100px;&quot;</span> <span class="na">class=</span><span class="s">&quot;famous-surface&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>這樣應該可以理解 <code>Engine.createContext</code> 與 <code>Engine.registerContext</code> 的差別。<code>Engine</code> 核心中，最主要的就是 <code>Context</code> 核心處理 DOM 的部分。而處理 DOM 的部分則是 <code>ElementAllocator</code> 來負責，這裡就分別說明。</p>

<h3>ElementAllocator 核心</h3>

<p>這個核心專門在處理 DOM 中的元素，當你初始化這個物件的時候，預設就會拿到 <code>document.createDocumentFragment()</code> 來當作初始物件（或者是，你也可以傳入一個 DOM 的物件給他</p>

<p>但是，由於這個物件的方法，在官方說明下都是屬於私有方法，單獨要拿出來用也不是不行。只是用法有別。主要這個物件，是用來儲存 DOM 的物件，</p>

<ul>
<li><code>allocate</code> 用於儲存 DOM 物件</li>
<li><code>deallocate</code> 用於取出儲存的 DOM 物件</li>
<li><code>migrate</code> 把原本所屬的 DOM 子元件，轉移到新的 DOM 父元件底下</li>
<li><code>getNodeCount</code> 計算所屬的子元件數量</li>
</ul>


<p>底下的例子就會在 <code>document.body</code> 底下加入一個空的 <code>&lt;div&gt;</code> 元素。</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="kd">var</span> <span class="nx">body</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ElementAllocator</span><span class="p">(</span><span class="nb">document</span><span class="p">.</span><span class="nx">getElementsByTagName</span><span class="p">(</span><span class="s1">&#39;body&#39;</span><span class="p">)[</span><span class="mi">0</span><span class="p">]);</span>
</span><span class='line'>  <span class="nx">body</span><span class="p">.</span><span class="nx">allocate</span><span class="p">(</span><span class="s1">&#39;div&#39;</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>不過既然他是私有物件，就不再多贅述了。</p>

<h3>Context 核心</h3>

<p>這個核心主要是將 RenderNode 打包成物件並且將它放到 DOM 裡面。</p>

<p>這個核心包含了，</p>

<ul>
<li><code>ElementAllocator</code></li>
<li><code>RenderNode</code></li>
<li><code>EventHandler</code></li>
</ul>


<h4>方法</h4>

<ul>
<li><code>add</code> 在這個物件內加入一個 renderable 物件</li>
<li><code>migrate</code> 與 <code>ElementAllocator</code> 類似，將這個物件搬移到另一個物件下</li>
<li><code>getSize</code> 取得該物件的寬度與高度</li>
<li><code>setSize</code> 設定該物件的寬度與高度，如果沒有傳入值，就是 <code>document</code> 的尺寸</li>
<li><code>getPerspective</code> 取得該物件的透視深度（單位 px</li>
<li><code>setPerspective</code> 設定物件透視深度，允許三個傳入值，分別是 <code>perspective</code>，<code>transition</code> 與 <code>callback</code>，其中 <code>transition</code> 必須要是 <code>Transitionable</code> 物件</li>
<li><code>on</code> 監聽事件</li>
<li><code>emit</code> 觸發事件</li>
<li><code>removeListener</code> 移除監聽事件</li>
<li><code>pipe</code>, <code>unpipe</code> 將自身事件指定（或取消）到其他物件上</li>
</ul>


<h4>使用方式</h4>

<p>這一個元件必須要傳入一個 DOM 的元件，舉個簡單的例子來看，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="kd">var</span> <span class="nx">elem</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">&#39;div&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">elem</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">backgroundColor</span> <span class="o">=</span> <span class="s1">&#39;black&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">elem</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">width</span> <span class="o">=</span> <span class="s1">&#39;100px&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="nx">elem</span><span class="p">.</span><span class="nx">style</span><span class="p">.</span><span class="nx">height</span> <span class="o">=</span> <span class="s1">&#39;100px&#39;</span><span class="p">;</span>
</span><span class='line'>  <span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">elem</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">ctx</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Context</span><span class="p">(</span><span class="nx">elem</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">console</span><span class="p">.</span><span class="nx">log</span><span class="p">(</span><span class="nx">ctx</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>這個 <code>ctx</code> 物件就可以用來控制 DOM 元件了。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Famo.us] ViewSequence 核心說明]]></title>
    <link href="http://blog.hinablue.me/entry/famous-viewsequence-explain/"/>
    <updated>2014-05-12T12:24:10+08:00</updated>
    <id>http://blog.hinablue.me/entry/famous-viewsequence-explain</id>
    <content type="html"><![CDATA[<p>標題與內容不符（不解釋</p>

<!-- more -->


<h3>ViewSequence 核心</h3>

<p>他是用來儲存一個序列化資料的模組，所以雖然字面上是 <code>ViewSequence</code>，但是骨子裡跟 <code>View</code> 沒有關係。</p>

<h4>初始化方法</h4>

<p>這個模組初始化可以傳入這幾個數值（使用 <code>Object</code> 的方式傳入，</p>

<ul>
<li><code>array</code> 傳入一個陣列，這個陣列用來儲存你的物件。</li>
<li><code>index</code> 定義第一個元素，這個模組用這個元素來當作第一個被 render 的物件</li>
<li><code>loop</code> 當巡迴過整個陣列之後，決定是否要返回第一個（或最後一個）元素</li>
<li><code>firstNode</code> 第一個元素</li>
<li><code>lastNode</code> 最後一個元素</li>
</ul>


<p>這個模組建立後，裡面會再建立一個結構函示，名稱雖為 <code>Backing</code>，不過外部使用時，是用 <code>_</code> 來取得。</p>

<h4>模組方法</h4>

<ul>
<li><code>getValue(n)</code> 取得第 n 個物件</li>
<li><code>setValue(n, value)</code> 將第 n 個物件設定為 <code>value</code></li>
<li><code>reindex(start, removeCount, insertCount)</code> 重新定義索引值</li>
<li><code>getPrevious</code> 取得目前索引值的上一個物件</li>
<li><code>getNext</code> 取得目前索引值的下一個物件</li>
<li><code>getIndex</code> 取得當前的索引值</li>
<li><code>toString</code> 將目前索引值輸出為字串</li>
<li><code>unshift(value)</code> 從開頭新增一個物件</li>
<li><code>push(value)</code> 從尾端新增一個物件</li>
<li><code>splice(index, howMany)</code> 從第 index 物件開始切割，然後<strong>移除掉</strong> howMany 個物件</li>
<li><code>swap(other)</code> 交換物件位置，與模組設定中的 <code>.index</code> 物件交換位置</li>
<li><code>getSize</code> 取得該 <code>.index</code> 物件的尺寸</li>
</ul>


<h4>簡易操作</h4>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="kd">var</span> <span class="nx">surf1</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">120</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s1">&#39;black&#39;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">surf2</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">130</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s1">&#39;black&#39;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">surf3</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">140</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s1">&#39;red&#39;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">surf4</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">150</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s1">&#39;black&#39;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">views</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ViewSequence</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">array</span><span class="o">:</span> <span class="p">[</span><span class="nx">surf1</span><span class="p">,</span> <span class="nx">surf2</span><span class="p">,</span> <span class="nx">surf3</span><span class="p">,</span> <span class="nx">surf4</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">index</span><span class="o">:</span> <span class="mi">2</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">mainCtx</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">mainCtx</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">views</span><span class="p">.</span><span class="nx">getNext</span><span class="p">());</span>
</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Famo.us] Views 模組說明]]></title>
    <link href="http://blog.hinablue.me/entry/famous-views-modules-explain/"/>
    <updated>2014-05-12T12:21:31+08:00</updated>
    <id>http://blog.hinablue.me/entry/famous-views-modules-explain</id>
    <content type="html"><![CDATA[<p>Views 模組，但是其實還是有跟 Views 無關的東西，大概有動畫特效的都可以算在這裡。只是有部分比較多功能的東西，放在 <code>widgets</code> 裡面去了。</p>

<!-- more -->


<h3>Views 模組</h3>

<p><code>views/*</code> 的模組，與 <code>core/View</code> 核心部分有些許不同，他並不是都會提供 <code>RenderNode</code> 給你使用，我這裡簡易說明一下底下的模組，</p>

<ul>
<li><code>views/Deck</code> 提供一個 <code>SequentialLayout</code> 並且讓他有開啟以及關閉的動畫效果。</li>
<li><code>views/Flipper</code> 提供一個滑動翻頁的動畫效果</li>
<li><code>views/GridLayout</code> 提供一個 [x, y] 的版面配置</li>
<li><code>views/HeaderFooterLayout</code> 提供一個 <code>header</code>, <code>content</code>, <code>footer</code> (由上到下) 的版面配置</li>
<li><code>views/Lightbox</code> 提供一個燈箱的動畫效果</li>
<li><code>views/ScrollContainer</code> 提供一個包含 <code>Scrollview</code> 的 <code>ContainerSurface</code> 元件</li>
<li><code>views/Scrollview</code> 提供一個捲軸容器</li>
<li><code>views/SequentialLayout</code> 提供一個縱向或是橫向的版面配置元件</li>
</ul>


<h3>動畫或行為類型的擴充模組</h3>

<ul>
<li><code>views/EdgeSwapper</code> 提供一個 <code>RenderController</code> 控制元件處理邊界滑入元件</li>
<li><code>views/RenderController</code> 提供一個 <code>RenderNode</code> 的控制器</li>
<li><code>views/Lightbox</code> 提供一個燈箱行為的 <code>RenderNode</code> 控制器</li>
<li><code>views/Scroller</code> 提供一個捲軸行為的 <code>RenderNode</code> 控制器</li>
</ul>


<p>這樣的模組在 <code>Famo.us</code> 裡面還蠻常見的，官方也沒告訴你要怎麼用，實際的使用案例裡面也找不到相關的使用方式（大概只能自己從原始碼中猜測&hellip;</p>

<p>簡單的說，上述幾個模組，可能是拿來擴充，或是發展成其他的模組而存在的。如果你單純要拿來用，那麼他大概可以這麼去理解他，</p>

<ul>
<li>提供一個 <code>Transitionable</code> 的元件，但是不是實體（也不是 DOM 實例</li>
<li>必須要提供一個 <code>RenderNode</code> 元件才能使用</li>
<li>本身必須加入一個已存在的實體或元件</li>
<li>除了 <code>Scroller</code> 以外，其他皆由 <code>show</code> 這個方法來控制</li>
</ul>


<h3>共通特性</h3>

<p>擴充模組，除了 <code>ScrollContainer</code> 會提供一個 <code>ContainerSurface</code> 元件外，其他的皆不會真的提供你可使用（顯示）的元件，也就是說，如果你只是 new 上述幾個模組，把它加入 <code>Engine</code>，那麼你的 DOM 會是<strong>空的</strong>。</p>

<p>以下稍微說明一下各個模組的簡易使用方式，</p>

<h4>Deck</h4>

<p>由於 <code>views/Deck</code> 是由 <code>views/SequentialLayout</code> 擴充而來，所以設定方式相同，只是預設值有些許差異。他產出的排列方式也很奇特，各位可以自行實驗，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Engine</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Engine&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Surface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Surface&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Modifier</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Modifier&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">View</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/View&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Deck</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/views/Deck&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Utility</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/utilities/Utility&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">mainCtx</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">myDeck</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">deck</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Deck</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">direction</span><span class="o">:</span> <span class="nx">Utility</span><span class="p">.</span><span class="nx">Direction</span><span class="p">.</span><span class="nx">X</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>  <span class="nx">deck</span><span class="p">.</span><span class="nx">sequenceFrom</span><span class="p">(</span><span class="nx">myDeck</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span><span class="p">(</span> <span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">10</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">view</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">View</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">surf</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>      <span class="nx">content</span><span class="o">:</span> <span class="nx">i</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s1">&#39;rgba(255, 0, 0, 0.7)&#39;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>    <span class="nx">mod</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Modifier</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">origin</span><span class="o">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
</span><span class='line'>      <span class="nx">transform</span><span class="o">:</span> <span class="nx">Transform</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">view</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">mod</span><span class="p">).</span><span class="nx">add</span><span class="p">(</span><span class="nx">surf</span><span class="p">);</span>
</span><span class='line'>    <span class="nx">myDeck</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">view</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">mainCtx</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">deck</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h4>EdgeSwapper</h4>

<p>從右邊滑入元件，如果不斷的給他 <code>.show()</code> 並送元件給他，他就會交換（一個淡入，一個淡出</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Engine</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Engine&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Surface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Surface&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Modifier</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Modifier&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">View</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/View&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">EdgeSwapper</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/views/EdgeSwapper&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">mainCtx</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">edgeSwapper</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">EdgeSwapper</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">surf1</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">content</span><span class="o">:</span> <span class="s1">&#39;This is a book.&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s1">&#39;rgba(255, 0, 0, 0.7)&#39;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">surf2</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">content</span><span class="o">:</span> <span class="s1">&#39;This is a pen.&#39;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s1">&#39;rgba(0, 255, 0, 0.7)&#39;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">edgeSwapper</span><span class="p">.</span><span class="nx">show</span><span class="p">(</span><span class="nx">surf1</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">setTimeout</span><span class="p">(</span><span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">edgeSwapper</span><span class="p">.</span><span class="nx">show</span><span class="p">(</span><span class="nx">surf2</span><span class="p">);</span>
</span><span class='line'>  <span class="p">},</span> <span class="mi">2000</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">mainCtx</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">edgeSwapper</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h4>Flipper</h4>

<p>顧名思義，就是製作一個可以前後翻頁的元件，預設動畫翻起來頗醜的 Orz</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Engine</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Engine&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Surface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Surface&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Modifier</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Modifier&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">View</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/View&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Flipper</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/views/Flipper&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Utility</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/utilities/Utility&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">mainCtx</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">flipper</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Flipper</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span><span class="p">(</span> <span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">view</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">View</span><span class="p">();</span>
</span><span class='line'>    <span class="nx">surf</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>      <span class="nx">content</span><span class="o">:</span> <span class="nx">i</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s1">&#39;rgba(255, 0, 0, 0.7)&#39;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>    <span class="nx">mod</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Modifier</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">origin</span><span class="o">:</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span>
</span><span class='line'>      <span class="nx">transform</span><span class="o">:</span> <span class="nx">Transform</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">view</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">mod</span><span class="p">).</span><span class="nx">add</span><span class="p">(</span><span class="nx">surf</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="nx">i</span> <span class="o">===</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">flipper</span><span class="p">.</span><span class="nx">setFront</span><span class="p">(</span><span class="nx">view</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">flipper</span><span class="p">.</span><span class="nx">setBack</span><span class="p">(</span><span class="nx">view</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">mainCtx</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">flipper</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h4>Lightbox</h4>

<p>燈箱控制元件，跟 <code>EdgeSwapper</code> 操作方法一樣，只是他多了 <code>hide()</code> 方法，可以讓你把燈箱藏起來。範例就不贅述了。</p>

<h4>RenderController</h4>

<p>這一個算是控制所有動作的核心，除了有 <code>hide()</code> 與 <code>show()</code> 之外，另外還有六個控制效果的方法，使用方式跟 <code>Lightbox</code>, <code>EdgeSwapper</code> 一樣，而六種方法分別是 <code>inTransformFrom</code>, <code>outTransformFrom</code>, <code>inOriginFrom</code>, <code>outOriginFrom</code>, <code>inOriginFrom</code>, <code>outOriginFrom</code>，全部都是必須傳入 <code>Function</code> 或是 <code>Transitionable</code> 來進行操作。</p>

<h4>SequentialLayout</h4>

<p>提供一個容器，讓你水平或是垂直放入元件，自身不會產生任何的實體 DOM 元素。</p>

<h4>GridLayout</h4>

<p>同 <code>SequentialLayout</code> 但是是以 <code>[col, row]</code> 的方式切割你的畫面（或是父元件，自身同樣不產生任何實體 DOM 元素。</p>

<h4>HeaderFooterLayout</h4>

<p>同 <code>GridLayout</code> 但是，只產生 <code>header</code>, <code>content</code>, <code>footer</code> 三組容器（由上至下，自身不會產生任何的實體 DOM 元素。這三組的範例待會一併說明。</p>

<h4>Scroller</h4>

<p>模擬一個捲軸，但是不監聽任何動作，單純將元件依照指定方向排列。使用 <code>positionFrom</code> 方法來控制捲軸的捲動。</p>

<h4>Scrollview</h4>

<p>同上，但是加入了滑鼠，觸控等動作的監聽，等同於原生捲軸的操作方式。但是，元件並不會產生系統的捲軸控制器。</p>

<h4>ScrollContainer</h4>

<p>同上，但是分別提供了一組 <code>Scrollview</code> 與 <code>ContainerSurface</code> 給你使用，你不需要額外做任何 <code>pipe</code> 或是 <code>subscribe</code> 的動作，就能產生一組捲軸控制元件，因為有 <code>ContainerSurface</code> 所以他會有一組實體的 DOM 元件。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Famo.us] View 核心說明]]></title>
    <link href="http://blog.hinablue.me/entry/famous-core-view-explain/"/>
    <updated>2014-05-12T12:19:07+08:00</updated>
    <id>http://blog.hinablue.me/entry/famous-core-view-explain</id>
    <content type="html"><![CDATA[<p>見山不是山，大概就是在說這個 View 模組。</p>

<!-- more -->


<h3>View 核心</h3>

<p>核心模組 <code>core/View</code> 是用於提供一個或是多個 <code>RenderNode</code> 的<strong>容器</strong>給框架引擎使用，它本身在輸出的時候並不會產生 DOM 實例，所以你在畫面上其實是看不到 <code>View</code> 這個模組的。</p>

<p>先解釋一下 <code>RenderNode</code> 這個東西，</p>

<ul>
<li>整個框架系統中，只要是產出與畫面有關的模組，都算是一種 <code>RenderNode</code></li>
<li>核心 <code>core/RenderNode</code> 只包含簡單的方法，一切由其他元件自行擴展</li>
<li>核心 <code>core/View</code> 就是由 <code>RenderNode</code> 擴展而來</li>
</ul>


<p><code>View</code> 的擴展包含有，</p>

<ol>
<li><code>EventHandler</code></li>
<li><code>OptionsManager</code></li>
<li><code>RanderNode</code></li>
</ol>


<p>那麼，哪一些東西算是 <code>RenderNode</code> 的容器或是會產生 <code>RenderNode</code> 的呢？</p>

<p>以下物件算是 <code>RenderNode</code> 的容器，</p>

<ul>
<li><code>core/View</code>, <code>core/ViewSequence</code>, <code>views/*</code> 核心與其模組</li>
<li><code>core/Surface</code>, <code>surfaces/*</code> 核心與其模組</li>
<li><code>wigets/*</code> 模組</li>
<li><code>core/RenderNode</code> 自身或是自行延展的模組</li>
</ul>


<p>以下物件會產生 <code>RenderNode</code></p>

<ul>
<li><code>core/Context</code></li>
<li><code>core/Engine</code></li>
<li><code>core/RenderNode</code></li>
<li><code>core/Scene</code></li>
<li><code>core/View</code></li>
<li><code>views/Flipper</code></li>
<li><code>views/GridLayout</code></li>
<li><code>views/HeaderFooterLayout</code></li>
<li><code>views/Lightbox</code></li>
<li><code>views/RenderController</code></li>
</ul>


<p><strong>請注意！</strong>上述物件所帶有的 <code>RenderNode</code> 並不是在相同的物件屬性上，舉例來說，你在 <code>core/View</code> 中能透過 <code>_node</code> 取得 <code>RenderNode</code> 物件（<strong>核心原件大部份都使用 <code>_node</code></strong>），但是在 <code>views/Flipper</code> 裡，<code>frontNode</code> 與 <code>backNode</code> 才是 <code>RenderNode</code>。</p>

<p>所以，如果把 <code>RenderNode</code> 放進<strong>不是</strong> <code>RenderNode</code> 的容器裡面會怎樣？</p>

<p><strong>報告學長，沒有畫面</strong></p>

<h4>View 核心操作解說</h4>

<p>先來看個例子，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Engine</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Engine&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Surface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Surface&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">View</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/View&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">mainContext</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">view</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">View</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">surf</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">200</span><span class="p">,</span> <span class="mi">200</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">content</span><span class="o">:</span> <span class="s2">&quot;test&quot;</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s2">&quot;red&quot;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">view</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">surf</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">mainContext</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">view</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>上述這個例子，你有沒有加入 <code>View</code> 輸出的結果都會一樣。原因在於，<code>Engine</code> 的 <code>createContext</code> 所提供的 <code>Context</code> 模組，自身就會提供 <code>RenderNode</code>，所以當然有沒有加上 <code>View</code> 差異就不大了。</p>

<p>既然有沒有 <code>View</code> 好像都無差別，那麼使用時機到底在哪裡？</p>

<ol>
<li>當模組必須也只接受 <code>RenderNode</code> 或其容器的時候</li>
<li>使用 <code>views/*</code> 其下所有模組的時候</li>
<li>轉換、包裝或是<strong>擴充</strong>模組</li>
<li>自行開發的模組</li>
</ol>


<p>上述頭兩項應該沒有異議，第三點提出來說明一下。或許你會問，包裝子元件我不也可以使用 <code>ContainerSurface</code> 嗎？其實可以（因為 <code>ContainerSurface</code> 也是 <code>RenderNode</code>（僅止於擴展方式不同</p>

<p>舉例來說，如果需要一個捲軸物件，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Engine</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Engine&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Surface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Surface&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">View</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/View&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">ContainerSurface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/surfaces/ContainerSurface&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">ScrollView</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/views/ScrollView&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">mainContext</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">views</span> <span class="o">=</span> <span class="p">[];</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">view</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ScrollView</span><span class="p">();</span>
</span><span class='line'>  <span class="nx">view</span><span class="p">.</span><span class="nx">sequenceFrom</span><span class="p">(</span><span class="nx">views</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">50</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">_container</span> <span class="o">=</span> <span class="nx">_createContainer</span><span class="p">(</span><span class="nx">view</span><span class="p">,</span> <span class="nx">i</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">views</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">_container</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">_createContainer</span><span class="p">(</span><span class="nx">view</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="kd">var</span> <span class="nx">surface</span><span class="p">,</span> <span class="nx">view</span> <span class="o">=</span> <span class="nx">view</span><span class="p">,</span> <span class="nx">i</span> <span class="o">=</span> <span class="nx">i</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">surface</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>      <span class="nx">content</span><span class="o">:</span> <span class="s1">&#39;box &#39;</span><span class="o">+</span> <span class="nx">i</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s2">&quot;red&quot;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">surface</span><span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">view</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="k">return</span> <span class="nx">surface</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">mainContext</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">view</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>我們就單獨看 <code>_createContainer</code> 這個 function，如果改寫成這樣，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">_createContainer</span><span class="p">(</span><span class="nx">view</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">surface</span><span class="p">,</span> <span class="nx">_view</span><span class="p">,</span> <span class="nx">view</span> <span class="o">=</span> <span class="nx">view</span><span class="p">,</span> <span class="nx">i</span> <span class="o">=</span> <span class="nx">i</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">surface</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">content</span><span class="o">:</span> <span class="s1">&#39;box &#39;</span><span class="o">+</span> <span class="nx">i</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s2">&quot;red&quot;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">surface</span><span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">view</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">_view</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">View</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">_view</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">surface</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">_view</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>他還是可以運作，而且輸出的 HTML 與上述第一個例子完全一樣。或者，我們換成 <code>ContainerSurface</code>，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="kd">function</span> <span class="nx">_createContainer</span><span class="p">(</span><span class="nx">view</span><span class="p">,</span> <span class="nx">i</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">surface</span><span class="p">,</span> <span class="nx">container</span><span class="p">,</span> <span class="nx">view</span> <span class="o">=</span> <span class="nx">view</span><span class="p">,</span> <span class="nx">i</span> <span class="o">=</span> <span class="nx">i</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">surface</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">content</span><span class="o">:</span> <span class="s1">&#39;box &#39;</span><span class="o">+</span> <span class="nx">i</span><span class="p">,</span>
</span><span class='line'>    <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s2">&quot;red&quot;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">container</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ContainerSurface</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">]</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">container</span><span class="p">.</span><span class="nx">pipe</span><span class="p">(</span><span class="nx">view</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">container</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">surface</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="k">return</span> <span class="nx">container</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>畫面結果會跟上述兩個例子完全一樣，但是 HTML 會有不同（請參考 #1 所述關於 <code>ContainerSurface</code> 的部分</p>

<p>那什麼情況不行，例如，你把 <code>View</code> 扔給 <code>Surface</code>（<strong>注意！</strong>扔給 <code>ContainerSurface</code> 是合法的</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="c1">// 這樣做，你的畫面會是空的（而且也不會有錯誤訊息</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">view</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">View</span><span class="p">();</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">surface</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">surface</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">view</span><span class="p">);</span>
</span><span class='line'>  <span class="nx">mainContext</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">surface</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h4>擴展應用</h4>

<p>由於 <code>View</code> 自身有 <code>EventHandler</code> 模組，所以在自行開發模組的時候，通常可以擴展這個核心來使用。而由於 <code>View</code> 本身與畫面呈現又有高度相關性，所以直接擴展使用其實是很方便的做法。</p>

<p>以下取自我的 <a href="https://github.com/hinablue/famous.tw/tree/master/500px">500px 範例</a>其中一段，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'>  <span class="c1">// 上略</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">function</span> <span class="nx">PhotosView</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">View</span><span class="p">.</span><span class="nx">apply</span><span class="p">(</span><span class="k">this</span><span class="p">,</span> <span class="nx">arguments</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">_createContent</span><span class="p">.</span><span class="nx">call</span><span class="p">(</span><span class="k">this</span><span class="p">);</span>
</span><span class='line'>    <span class="k">this</span><span class="p">.</span><span class="nx">createPhotoRowView</span> <span class="o">=</span> <span class="nx">createPhotoRowView</span><span class="p">;</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// 中略</span>
</span><span class='line'>  <span class="nx">container</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">scrollView</span><span class="p">);</span>
</span><span class='line'>  <span class="k">this</span><span class="p">.</span><span class="nx">_add</span><span class="p">(</span><span class="nx">mod</span><span class="p">).</span><span class="nx">add</span><span class="p">(</span><span class="nx">container</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="c1">// 下略</span>
</span></code></pre></td></tr></table></div></figure>


<p>自行擴展出一個 <code>PhotosView</code> 模組，自己把 <code>container</code> 加入，最後返回給 <code>Engine</code> 去做最後輸出。<code>View</code> 最大的用意在於，讓開發者自行去擴展所需要的輸出模組，或是做出更複雜（或龐大）的元件控制，最後收斂在 <code>View</code> 這個容器裡面，再輸出給 <code>Engine</code> 處理。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Famo.us] Surface 核心說明]]></title>
    <link href="http://blog.hinablue.me/entry/famous-core-surafce-explain/"/>
    <updated>2014-05-12T12:16:09+08:00</updated>
    <id>http://blog.hinablue.me/entry/famous-core-surafce-explain</id>
    <content type="html"><![CDATA[<p>簡單的核心說明，隨時會補充（因為不知道官方還會不會新增東西</p>

<!-- more -->


<h3>Surface 核心模組</h3>

<p>這個模組預設會產生一組 <code>&lt;div&gt;</code> 的 DOM 元素，然後再進行操作。初始化的參數可以有，</p>

<ul>
<li><code>size</code> 是個陣列 [width, height] 單位是 px，必須要是數字</li>
<li><code>classes</code> 也是陣列，這裡的內容會是 <code>&lt;div&gt;</code> 元素的 class 屬性值</li>
<li><code>properties</code> 必須是一個 Object，內容是 CSS 設定值</li>
<li><code>content</code> 內容是 HTML 字串</li>
</ul>


<h4>可改變的設定</h4>

<ul>
<li><code>elementType</code> 預設是 <code>div</code>，你也可以用 <code>span</code> 他就會建立一個 <code>&lt;span&gt;</code> 的 DOM 元素</li>
<li><code>elementClass</code> 預設是 <code>famous-surface</code>，你也可以改掉</li>
</ul>


<h4>模組方法</h4>

<ul>
<li><code>on</code>, <code>removeListener</code>, <code>emit</code>, <code>pipe</code>, <code>unpipe</code> 與 <code>EventHandler</code> 有關，主要就是用於監聽事件，或是將自身事件傳遞給指定模組</li>
<li><code>setProperties</code>, <code>getProperties</code> 設定與取出 <code>properties</code> 內容</li>
<li><code>addClass</code>, <code>removeClass</code> 設定與移除單一 class</li>
<li><code>setClasses</code>, <code>getClassList</code> 設定多組 class 與取得目前 classes 列表</li>
<li><code>setContent</code>, <code>getContent</code> 設定與取得 content 內容</li>
<li><code>setOptions</code> 改變 options 初始值</li>
<li><code>getSize</code>, <code>setSize</code> 設定與取得 size</li>
</ul>


<h3>本文同步更新</h3>

<p><a href="https://github.com/hinablue/famous.tw/issues/9">https://github.com/hinablue/famous.tw/issues/9</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Famo.us] 安裝與 Surface, Modifier 基本操作]]></title>
    <link href="http://blog.hinablue.me/entry/famous-install-and-play-with-surface-modifier/"/>
    <updated>2014-05-12T11:48:35+08:00</updated>
    <id>http://blog.hinablue.me/entry/famous-install-and-play-with-surface-modifier</id>
    <content type="html"><![CDATA[<p>Famo.us 原始碼可以在<a href="https://github.com/Famous/famous">官方的 github 下載</a></p>

<p>如果你已經可以進入 <a href="https://famo.us/university">Famo.us University</a>，那這裡或許可以跳過。</p>

<!-- more -->


<h3>基本使用</h3>

<p>Famo.us 是基於 <a href="http://requirejs.org/docs/whyamd.html">AMD</a> 的架構來撰寫，且搭配使用 <a href="http://requirejs.org">require.js</a>，所以稍微了解一下這兩個東西會比較容易上手。</p>

<h4>安裝</h4>

<p>你可以從官方的 github 把專案抓下來直接使用，也可以用 nodeJS 來安裝，這裡介紹一下 nodeJS 的安裝方法，或者是參考官方的 <a href="https://famo.us/install">Install</a></p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>sudo npm install -g yo grunt-cli bower generator-famous
</span><span class='line'>mkdir newProject && cd newProject
</span><span class='line'>yo famous
</span><span class='line'>
</span><span class='line'>     _-----_
</span><span class='line'>    |       |
</span><span class='line'>    |--(o)--|   .--------------------------.
</span><span class='line'>   `---------´  |    Welcome to Yeoman,    |
</span><span class='line'>    ( _´U`_ )   |   ladies and gentlemen!  |
</span><span class='line'>    /___A___\   '__________________________'
</span><span class='line'>     |  ~  |
</span><span class='line'>   __'.___.'__
</span><span class='line'> ´   `  |° ´ Y `
</span><span class='line'>
</span><span class='line'>You're using the fantastic Famo.us generator.
</span><span class='line'>[?] Your project name: (newProject)   // 輸入專案的名稱（不打也行
</span><span class='line'>[?] Your project description: e.g. Seed project to get started with Famo.us   // 輸入專案的描述（不打也行
</span><span class='line'>[?] Would you mind telling me your username on Github?  // 輸入你的 github 名稱（不打也行</span></code></pre></td></tr></table></div></figure>


<p>跑了一陣子之後，他會把需要的東西全部安裝完畢，最後用 <code>grunt serve</code> 來啟動服務。他會啟動瀏覽器連線到 <code>localhost:1337</code>，同時支援 livereload，所以你可以直接修改 js 檔案來看到效果。</p>

<p>檔案會放在 <code>app/src/main.js</code> 裡面。</p>

<h4>顯示元件</h4>

<p>建構一個畫面，我們需要 <code>Engine</code>, <code>Surface</code> 這兩個模組，所以，這樣就能夠在畫面上產生一段文字</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="kr">export</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Engine</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famo/core/Engine&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Surface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;fame/core/Surface&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">mainContext</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">surf</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>    <span class="c1">// 這個 size 代表這個 Surface 是 200x200 的正方形</span>
</span><span class='line'>    <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">200</span><span class="p">,</span> <span class="mi">200</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">content</span><span class="o">:</span> <span class="s2">&quot;Hello World&quot;</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">mainContext</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">surf</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>然後，我們可以利用 <code>Modifier</code> 這個模組，來修改或是製作這個 <code>Surface</code> 的效果</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Engine</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Engine&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Surface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Surface&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Modifier</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Modifier&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Transform</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Transform&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">mainContext</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">surf</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>    <span class="c1">// 這個 size 代表這個 Surface 是 200x200 的正方形</span>
</span><span class='line'>    <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">200</span><span class="p">,</span> <span class="mi">200</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">content</span><span class="o">:</span> <span class="s2">&quot;Hello World&quot;</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">mod</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Modifier</span><span class="p">({</span>
</span><span class='line'>      <span class="c1">// transform 表示套用一組 Tramsform 模組的效果</span>
</span><span class='line'>      <span class="nx">transform</span><span class="o">:</span> <span class="nx">Transform</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">),</span>
</span><span class='line'>      <span class="c1">// origin 表示把底下的元素放在螢幕某個位置，0.5, 0.5 代表正中央</span>
</span><span class='line'>      <span class="nx">origin</span><span class="o">:</span> <span class="p">[</span><span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">]</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">mainContext</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">mod</span><span class="p">).</span><span class="nx">add</span><span class="p">(</span><span class="nx">surf</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h4>Surface 核心模組</h4>

<p>它是屬於核心模組之一，原始碼在 <code>core/Surface.js</code> 可以查看。預設所使用的 Mockup 是 <code>&lt;div&gt;</code> 元素，預設的類別樣式名稱為 <code>famous-surface</code>，這兩項是無法被修改的。可以傳入的屬性有，</p>

<ul>
<li><code>properties</code> 用來設定 CSS 樣式</li>
<li><code>content</code> 傳入的內容，允許使用 HTML</li>
<li><code>classes</code> 傳入類別樣式名稱，必須使用陣列</li>
<li><code>size</code> 傳入元件的尺寸，陣列，規格為 <code>[ width, height ]</code>，必須單純為數字（單位 px，比較特別的是，他可以傳入 <code>undefined</code> 這個關鍵字，代表意義是 <code>100%</code></li>
</ul>


<h4>Modifier 核心模組</h4>

<p>核心之一，原始碼在 <code>core/Modifier.js</code> 可以查看。它可以當作是一種效果的套用（或是下層元素的濾鏡）來看，樹狀結構以上面的例子來看，會長成這樣</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">mainContent</span>
</span><span class='line'>    <span class="o">|</span>
</span><span class='line'> <span class="nx">Modifier</span>
</span><span class='line'>    <span class="o">|</span>
</span><span class='line'> <span class="nx">Surface</span>
</span></code></pre></td></tr></table></div></figure>


<p>這一個 Modifier 並不會產生任何的元素，相反的，它會是一種 CSS Style 屬性，<em>套用</em>在 Surface 的元素上面，以 HTML Mackup 來解釋就是這樣，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;famous-surface&quot;</span> <span class="na">style=</span><span class="s">&quot;/* Modifier 會在這裡發生 */&quot;</span><span class="nt">&gt;&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>它可以傳入的屬性有，</p>

<ul>
<li><code>transform</code> 這個傳入值必須要是 <code>Transform</code> 模組</li>
<li><code>opacity</code> 這個傳入值是透明度，範圍在 0 ~ 1</li>
<li><code>origin</code> 這是代表我要將所屬元素設定在畫面的哪個位置，它是一個陣列 <code>[ 垂直位置, 水平位置 ]</code></li>
<li><code>size</code> 這個尺寸跟 <code>Surface</code> 的尺寸設定相同，但是會覆蓋掉 <code>Surface</code> 所設定的尺寸</li>
</ul>


<p><code>origin</code> 是一種九宮格的形式，所代表的相對位置如下表，</p>

<table>
<thead>
<tr>
<th> </th>
<th> 左 </th>
<th> 中 </th>
<th> 右 </th>
</tr>
</thead>
<tbody>
<tr>
<td>上 </td>
<td> <code>[0, 0]</code> </td>
<td> <code>[0.5, 0]</code> </td>
<td> <code>[1, 0]</code> |</td>
</tr>
<tr>
<td>中 </td>
<td> <code>[0, 0.5]</code> </td>
<td> <code>[0.5, 0.5]</code> </td>
<td> <code>[1, 0.5]</code> |</td>
</tr>
<tr>
<td>下 </td>
<td> <code>[0, 1]</code> </td>
<td> <code>[0.5, 1]</code> </td>
<td> <code>[1, 1]</code> |</td>
</tr>
</tbody>
</table>


<h3>相關模組</h3>

<p>相同於核心的 <code>Surface</code> 與 <code>Modifier</code> 這兩個模組，Famous 對他有個別擴展兩組模組，分別是，</p>

<h4>Surface 模組</h4>

<ul>
<li><code>surfaces/CanvasSurface</code></li>
<li><code>surfaces/ContainerSurface</code></li>
<li><code>surfaces/ImageSurface</code></li>
<li><code>surfaces/InputSurface</code></li>
<li><code>surfaces/VideoSurface</code></li>
</ul>


<p>以上這幾種模組都是由 <code>core/Surface</code> 擴展而來，唯一的差異性是這些模組所使用的 HTML Tag 不盡相同，</p>

<table>
<thead>
<tr>
<th>模組 </th>
<th> 使用的 HTML Tag </th>
<th> 可傳入屬性設定 </th>
<th> </th>
</tr>
</thead>
<tbody>
<tr>
<td>Surface </td>
<td> <code>&lt;div&gt;</code> </td>
<td> 同上述 Surface 部分 </td>
<td></td>
</tr>
<tr>
<td>CanvasSurface </td>
<td> <code>&lt;canvas&gt;</code> </td>
<td> <code>canvasSize</code> 為一陣列 <code>[ width, height ]</code> </td>
<td></td>
</tr>
<tr>
<td>ContainerSurface </td>
<td> <code>&lt;div&gt;</code> </td>
<td> 同 Surface </td>
<td></td>
</tr>
<tr>
<td>ImageSurface </td>
<td> <code>&lt;img&gt;</code> </td>
<td> <code>content</code> 必須為圖片的 URL </td>
<td></td>
</tr>
<tr>
<td>InputSurface </td>
<td> <code>&lt;input&gt;</code> </td>
<td> <code>placeholder</code>, <code>value</code>, <code>type</code>, <code>name</code>，同時 <code>content</code> 是無效的 </td>
<td></td>
</tr>
<tr>
<td>VideoSurface </td>
<td> <code>&lt;video&gt;</code> </td>
<td> 同 Surface 但是多了 <code>autoplay</code> 是布林值 </td>
<td></td>
</tr>
</tbody>
</table>


<p>在此必須把 <code>ContainerSurface</code> 特別提出來說明，他與 <code>Surface</code> 雷同，但是在 HTML Mockup 的結構上並不太一樣，簡單來說，它可以把很多的 <code>Surface</code> 給包（<em>Group</em>）起來，舉例來說，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Engine</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Engine&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Surface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Surface&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Modifier</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Modifier&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Transform</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Transform&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">ContainerSurface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/surfaces/ContainerSurface&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">mainContainer</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">container</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ContainerSurface</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">surface</span><span class="p">,</span> <span class="nx">modifier</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">surface</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>      <span class="nx">content</span><span class="o">:</span> <span class="s1">&#39;box &#39;</span><span class="o">+</span> <span class="nx">i</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">modifier</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Modifier</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">transform</span><span class="o">:</span> <span class="nx">Transform</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span> <span class="nx">i</span> <span class="o">*</span> <span class="mi">110</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">container</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">modifier</span><span class="p">).</span><span class="nx">add</span><span class="p">(</span><span class="nx">surface</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">mainContainer</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">container</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>這樣的方式所產出的 HTML Mockup 會類似這樣（底下結構已簡化，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;famous-surface&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;famous-group famous-container-group&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;famous-surface&quot;</span><span class="nt">&gt;</span>test<span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;famous-surface&quot;</span><span class="nt">&gt;</span>test<span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;famous-surface&quot;</span><span class="nt">&gt;</span>test<span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;famous-surface&quot;</span><span class="nt">&gt;</span>test<span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;famous-surface&quot;</span><span class="nt">&gt;</span>test<span class="nt">&lt;/div&gt;</span>
</span><span class='line'>  <span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/div&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>這就是 <code>ContainerSurface</code> 主要的功能，將你的子元素包成一包，然後把這一包放到 DOM 裡面（或是另外給其他的模組使用。</p>

<h4>Modifier 模組</h4>

<ul>
<li><code>modifiers/Draggable</code></li>
<li><code>modifiers/Fader</code></li>
<li><code>modifiers/ModifierChain</code></li>
<li><code>modifiers/StateModifier</code></li>
</ul>


<p>首先先提一下 <code>StateModifier</code> 這個模組跟 <code>Modifier</code> 幾乎一樣，只是 <code>Modifier</code> 做的事情比 <code>StateModifier</code> 更多一些，所以其實可以把它看成是簡化版本的 <code>Modifier</code>。它只能更動原有的屬性設定，如，<code>size</code>, <code>origin</code>, <code>opacity</code>, <code>transform</code> 這四種而已。</p>

<p><code>Fader</code> 則更輕巧，他所能做的事情只有將你的元素淡入或是淡出（預設是隱藏的</p>

<p><code>ModifierChain</code> 則是可以把多種 <code>Modifier</code> 串起來，這樣你就不用一直使用 <code>.add()</code> 來新增了。</p>

<p><code>Draggable</code> <del>目前可利用狀況不明，你可以套用，但是做不出任何效果，我已經寫信去問官方，有回覆會再來這邊更新。</del></p>

<p>在等待官方回覆的同時，我依照 <code>EventHandler</code> 的特性來思考這個 <code>Modifier</code>，既然有 <code>pipe</code> 與 <code>subscribe</code> 可用，所以就嘗試了一下，後來官方也回信來，用法確實是需要使用 <code>pipe</code> 或是 <code>subscribe</code>，實際範例如下，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Engine</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Engine&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Surface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Surface&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Modifier</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Modifier&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Transform</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Transform&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Draggable</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/modifiers/Draggable&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">ContainerSurface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/surfaces/ContainerSurface&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">mainContext</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">container</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ContainerSurface</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">surface</span><span class="p">,</span> <span class="nx">modifier</span><span class="p">,</span> <span class="nx">drag</span><span class="p">;</span>
</span><span class='line'>  <span class="k">for</span> <span class="p">(</span><span class="kd">var</span> <span class="nx">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="nx">i</span> <span class="o">&lt;</span> <span class="mi">5</span><span class="p">;</span> <span class="nx">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">surface</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>      <span class="nx">content</span><span class="o">:</span> <span class="s1">&#39;box &#39;</span><span class="o">+</span> <span class="nx">i</span><span class="p">,</span>
</span><span class='line'>      <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>        <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s2">&quot;red&quot;</span>
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">modifier</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Modifier</span><span class="p">({</span>
</span><span class='line'>        <span class="nx">transform</span><span class="o">:</span> <span class="nx">Transform</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span> <span class="nx">i</span> <span class="o">*</span> <span class="mi">110</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">drag</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">Draggable</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>    <span class="c1">// 使用 subscribe</span>
</span><span class='line'>    <span class="nx">drag</span><span class="p">.</span><span class="nx">subscribe</span><span class="p">(</span><span class="nx">surface</span><span class="p">);</span>
</span><span class='line'>    <span class="c1">// 或是使用 pipe</span>
</span><span class='line'>    <span class="c1">// surface.pipe(drag);</span>
</span><span class='line'>
</span><span class='line'>    <span class="nx">container</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">drag</span><span class="p">).</span><span class="nx">add</span><span class="p">(</span><span class="nx">modifier</span><span class="p">).</span><span class="nx">add</span><span class="p">(</span><span class="nx">surface</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">mainContext</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">container</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<p>當中有提及 <code>subscribe</code> 與 <code>pipe</code> 在此暫且不詳細說明，之後提及 <code>EventHandler</code> 的時候會再詳細說明。</p>

<h4>Surface 新增模組</h4>

<ul>
<li><code>surfaces/FromContainerSurafce</code></li>
<li><code>surfaces/SubmitInputSurface</code></li>
<li><code>surfaces/TextareaSurface</code></li>
</ul>


<p>大概就如同字面上的意思，跟 <code>surfaces/InputSurface</code> 類似，主要是表單與其元件的模組。使用的方式也跟 <code>surfaces/InputSurface</code> 雷同。</p>

<h4>補充說明 ModifierChain</h4>

<p>補充說明 <code>ModifierChain</code> 的使用方式，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
</pre></td><td class='code'><pre><code class='js'><span class='line'><span class="nx">define</span><span class="p">(</span><span class="kd">function</span><span class="p">(</span><span class="nx">require</span><span class="p">,</span> <span class="nx">exports</span><span class="p">,</span> <span class="nx">module</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Engine</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Engine&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Surface</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Surface&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Modifier</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Modifier&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">ModifierChain</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/modifiers/ModifierChain&#39;</span><span class="p">);</span>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">Transform</span> <span class="o">=</span> <span class="nx">require</span><span class="p">(</span><span class="s1">&#39;famous/core/Transform&#39;</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">mainContext</span> <span class="o">=</span> <span class="nx">Engine</span><span class="p">.</span><span class="nx">createContext</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">surface</span><span class="o">=</span> <span class="k">new</span> <span class="nx">Surface</span><span class="p">({</span>
</span><span class='line'>    <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">],</span>
</span><span class='line'>    <span class="nx">properties</span><span class="o">:</span> <span class="p">{</span>
</span><span class='line'>      <span class="nx">backgroundColor</span><span class="o">:</span> <span class="s2">&quot;red&quot;</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>  <span class="p">});</span>
</span><span class='line'>
</span><span class='line'>  <span class="kd">var</span> <span class="nx">modifierChain</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">ModifierChain</span><span class="p">(</span>
</span><span class='line'>    <span class="k">new</span> <span class="nx">Modifier</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">origin</span><span class="o">:</span> <span class="p">[</span><span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">],</span>
</span><span class='line'>      <span class="nx">transform</span><span class="o">:</span> <span class="nx">Transform</span><span class="p">.</span><span class="nx">rotateZ</span><span class="p">(</span> <span class="mi">45</span> <span class="o">*</span> <span class="nb">Math</span><span class="p">.</span><span class="nx">PI</span> <span class="o">/</span> <span class="mi">180</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">}),</span>
</span><span class='line'>    <span class="k">new</span> <span class="nx">Modifier</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">transform</span><span class="o">:</span> <span class="nx">Transform</span><span class="p">.</span><span class="nx">translate</span><span class="p">(</span><span class="mi">100</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
</span><span class='line'>    <span class="p">}),</span>
</span><span class='line'>    <span class="k">new</span> <span class="nx">Modifier</span><span class="p">({</span>
</span><span class='line'>      <span class="nx">size</span><span class="o">:</span> <span class="p">[</span><span class="mi">200</span><span class="p">,</span> <span class="mi">200</span><span class="p">]</span>
</span><span class='line'>    <span class="p">}),</span>
</span><span class='line'>  <span class="p">);</span>
</span><span class='line'>
</span><span class='line'>  <span class="nx">mainContext</span><span class="p">.</span><span class="nx">add</span><span class="p">(</span><span class="nx">modifierChain</span><span class="p">).</span><span class="nx">add</span><span class="p">(</span><span class="nx">surface</span><span class="p">);</span>
</span><span class='line'><span class="p">});</span>
</span></code></pre></td></tr></table></div></figure>


<h3>小結</h3>

<p>本文在我的 <a href="https://github.com/hinablue/famous.tw/issues">famous.tw</a> 上面同步刊出。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Famo.us] 新一代 HTML5 Web Application JavaScript Framework]]></title>
    <link href="http://blog.hinablue.me/entry/famous-first-look/"/>
    <updated>2014-05-11T11:15:52+08:00</updated>
    <id>http://blog.hinablue.me/entry/famous-first-look</id>
    <content type="html"><![CDATA[<p>其實開始研究已經好一陣子了，只是想說 Blog 好久沒有文章，所以拿來灌水一下，免得乾旱過頭。我剛開始寫的時候，很多人都在問，到底 Famo.us 是什麼東西？</p>

<p>其實我本來也不理解，直到我聽到有人跟我說 Z>B&hellip;</p>

<!-- more -->


<h2>Famo.us</h2>

<p>這個 JavaScript Framework 是早在 2012 年發表展示的一個專案，一開始的 hello world 應用程式，可以看看這個影片，</p>

<iframe src="//www.youtube.com/embed/fzBC20B5dsk" frameborder="0" allowfullscreen></iframe>


<p>這個影片當初造成轟動，但是等到 Famo.us 正式發表的時候，已經是今年四月的事情了。</p>

<p>Famo.us 是一套由 JavaScript 所撰寫的 HTML5 Web Application Framework，用意在於讓開發者更便利的去製作一個，更貼近於原生應用程式（Native App）的工具。當初在 Beta launch 的發表會時，有團隊用兩個禮拜，加上 Famo.us 做出類 DNA 的應用程式（已跪，可惜影片目前找不到了（因為當初是用 Hangout，而且好像只有開頭有錄影而已，後面的 Demo 都石沈大海了</p>

<h3>效能</h3>

<p>根據官方對於 <a href="http://famo.us/guides/dev/render-tree.html">Render Tree</a> 的解釋，因為是用來做應用程式，所以整個 DOM 的架構，跟我們平常在做 Web 的概念不太一樣。他是很整齊的樹狀支，而且有很乾淨且嚴格的規範，亦即是把整個 DOM 給扁平化，所以在整個 Render Tree 的結構上，效能上就會有提升。</p>

<p>當然，如果你硬是要拿來跟原生應用程式比，我也沒有什麼意見，畢竟這取向不太相同。你可以看看這個利用 Famo.us 開發的 Facebook Pages 的範例，</p>

<iframe src="//www.youtube.com/embed/6jg-PlisAFc" frameborder="0" allowfullscreen></iframe>


<h3>開源</h3>

<p>Famo.us 的原始碼，都可以在<a href="https://github.com/famous">官方的 github</a> 上面找到。原本他們好像不是要做成開源，不過後來改變策略了，全部都以 <a href="http://opensource.org/licenses/MPL-2.0">MPL</a> 的方式開放原始碼。</p>

<p>所以目前官方都還有持續在更新，因為還是有許多地方持續在改進。像是我之前遇到的 Chrome 捲軸中風問題，後來就不藥而癒了，中間好像 Famo.us 的某些模組有更新（其實我也不確定是不是被修掉，不過起碼，之後再測試的時候就沒遇到問題了。</p>

<h3>小結</h3>

<p>Famo.us 還是很新的東西，目前註冊登入後的機制，好像也沒有完全開放。我只是不巧註冊 Famo.us 的時間比較早（Number in line 3406，所以比較早一點可以進去看到其他東西。</p>

<p>有興趣的人可以直接去 fork 官方的原始碼，再搭配我在 <a href="https://github.com/hinablue/famous.tw">github 上面</a>寫的簡單介紹，應該可以很快上手（我的文章都寫在 Issue 裡面，請不要跑錯地方，謝謝</p>

<p>目前也開了一個 <a href="https://www.facebook.com/groups/1391119357836268">FB 社團</a>，希望有興趣的人可以一起進來研究。</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[AWS] 使用 Uploadify 直接上傳 S3]]></title>
    <link href="http://blog.hinablue.me/entry/aws-s3-direct-upload-with-uploadify/"/>
    <updated>2014-03-25T20:23:46+08:00</updated>
    <id>http://blog.hinablue.me/entry/aws-s3-direct-upload-with-uploadify</id>
    <content type="html"><![CDATA[<p>其實以前知道 S3 可以直接上傳檔案到 Bucket 上面去，只是都沒有專案需要這方面的實作，所以就放置 play 了好一陣子。</p>

<p>直到我夢到一個副本級專案。</p>

<!-- more -->


<h2>AWS S3 Browser-based Uploads Using POST</h2>

<p>官方有說，</p>

<ul>
<li><a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/HTTPPOSTForms.html">HTML Forms</a></li>
<li><a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/HTTPPOSTExamples.html">Upload Examples</a></li>
<li><a href="http://docs.aws.amazon.com/AmazonS3/latest/dev/HTTPPOSTFlash.html">POST with Adobe Flash</a></li>
</ul>


<p>但是，依照 Amazon AWS 文件的慣例就是，文件基本上只是參考用，實際上會遇到的小毛病，也得要遇到了才知道。</p>

<h3>Note</h3>

<ul>
<li>MUST BE UTF-8 encoded（<strike>不解釋！</strike> 由於是使用 Client Browser 的方式去傳遞，所以只要是 FormData 送出的資料都必須要是 UTF-8 encoded，即便像我用 node-browser 這類的東西傳送也是一樣</li>
<li>非檔案內容不得超過 20KB</li>
<li>如果要上傳檔案，<code>file</code> 必須是表單的 <strong>最後一項</strong></li>
<li>可以使用特殊變數 <code>${filename}</code>，當你上傳檔案時，這個變數會自動置換成你上傳的檔案名稱</li>
</ul>


<h3>Policy 的規則</h3>

<p>除了必須要設定過期時間 <code>expiration</code> 與過濾條件 <code>conditions</code> 之外，過濾條件必須依循以下規則：</p>

<ul>
<li>必須要有 <code>acl</code>, <code>bucket</code>, <code>$key</code></li>
<li>除了特定標籤外，也可以任意使用欄位標籤</li>
<li>任何的 <strong>欄位標籤</strong> 必須使用 <code>start-with</code> 設定</li>
<li>預設的 <code>success_action_status</code> 會回傳 <code>HTTP 201</code> 要注意</li>
<li>如果使用 <code>success_action_redirect</code> 則你的主機需要設定 <code>Access-Control-Allow-Origin</code></li>
<li>如果你要用 JavaScript 讀取 header，要設定 <code>Access-Control-Expose-Headers</code></li>
</ul>


<h2>Uploadify HTML5 版本的問題</h2>

<p><strike>由於我不會寫 ROR 所以，</strike>以下以 PHP 來舉例</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
</pre></td><td class='code'><pre><code class='php'><span class='line'><span class="o">&lt;?</span><span class="nx">php</span>
</span><span class='line'><span class="nv">$aws_secret</span> <span class="o">=</span> <span class="s1">&#39;amazon access secret&#39;</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'><span class="nv">$policy</span> <span class="o">=</span> <span class="nb">base64_encode</span><span class="p">(</span>
</span><span class='line'>    <span class="s1">&#39;{&#39;</span><span class="o">.</span>
</span><span class='line'>        <span class="s1">&#39;&quot;expiration&quot;: &quot;&#39;</span><span class="o">.</span><span class="nb">date</span><span class="p">(</span><span class="s2">&quot;Y-m-d</span><span class="se">\T</span><span class="s2">H:i:s\Z&quot;</span><span class="p">,</span> <span class="nb">time</span><span class="p">()</span><span class="o">+</span><span class="mi">60</span><span class="o">*</span><span class="mi">30</span><span class="p">)</span><span class="o">.</span><span class="s1">&#39;&quot;,&#39;</span><span class="o">.</span>
</span><span class='line'>        <span class="s1">&#39;&quot;conditions&quot;: &#39;</span><span class="o">.</span>
</span><span class='line'>        <span class="s1">&#39;[&#39;</span><span class="o">.</span>
</span><span class='line'>            <span class="s1">&#39;{&quot;bucket&quot;: &quot;myuploader&quot;},&#39;</span><span class="o">.</span>
</span><span class='line'>            <span class="s1">&#39;{&quot;acl&quot;: &quot;public-read&quot;},&#39;</span><span class="o">.</span>
</span><span class='line'>            <span class="s1">&#39;[&quot;starts-with&quot;, &quot;$key&quot;, &quot;static/&quot;],&#39;</span><span class="o">.</span>
</span><span class='line'>            <span class="s1">&#39;[&quot;starts-with&quot;, &quot;$Content-Type&quot;, &quot;image/&quot;],&#39;</span><span class="o">.</span>
</span><span class='line'>            <span class="s1">&#39;[&quot;starts-with&quot;, &quot;$folder&quot;, &quot;static/&quot;],&#39;</span><span class="o">.</span>
</span><span class='line'>            <span class="s1">&#39;[&quot;starts-with&quot;, &quot;$filename&quot;, &quot;&quot;],&#39;</span><span class="o">.</span>
</span><span class='line'>            <span class="s1">&#39;{&quot;success_action_status&quot;: &quot;200&quot;},&#39;</span><span class="o">.</span>
</span><span class='line'>            <span class="s1">&#39;[&quot;content-length-range&quot;, 0, &#39;</span><span class="o">.</span><span class="p">(</span><span class="nx">int</span><span class="p">)</span> <span class="nv">$this</span><span class="o">-&gt;</span><span class="na">AWS</span><span class="p">[</span><span class="s1">&#39;size&#39;</span><span class="p">]</span><span class="o">.</span><span class="s1">&#39;]&#39;</span><span class="o">.</span>
</span><span class='line'>        <span class="s1">&#39;]&#39;</span><span class="o">.</span>
</span><span class='line'>    <span class="s1">&#39;}&#39;</span>
</span><span class='line'><span class="p">);</span>
</span><span class='line'><span class="nv">$signature</span> <span class="o">=</span> <span class="nb">base64_encode</span><span class="p">(</span><span class="nb">hash_hmac</span><span class="p">(</span>
</span><span class='line'>    <span class="s1">&#39;sha1&#39;</span><span class="p">,</span> <span class="nb">str_replace</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="s2">&quot;</span><span class="se">\n</span><span class="s2">&quot;</span><span class="p">,</span><span class="s2">&quot;</span><span class="se">\r</span><span class="s2">&quot;</span><span class="p">),</span> <span class="s1">&#39;&#39;</span><span class="p">,</span> <span class="nv">$policy</span><span class="p">),</span> <span class="nv">$aws_secret</span><span class="p">,</span> <span class="k">true</span>
</span><span class='line'><span class="p">));</span>
</span></code></pre></td></tr></table></div></figure>


<p>以上的東西請勿照抄！其中， <code>$key</code> 是 S3 檔案結構中上載的鍵值，簡單來說 <code>http://myuploader.s3.amazonaws.com/xxxx</code> 其中的 xxxx 就是 <code>$key</code> 值，它可以是資料夾加上檔案名稱，或是直接是檔案名稱。</p>

<p>然後我們比對一下前端的 JS 需要的部分，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="nx">formData</span>           <span class="o">:</span> <span class="p">{</span>
</span><span class='line'>                        <span class="s1">&#39;AWSAccessKeyId&#39;</span>            <span class="o">:</span> <span class="s1">&#39;amazon access key&#39;</span><span class="p">,</span>
</span><span class='line'>                        <span class="s1">&#39;key&#39;</span>                       <span class="o">:</span> <span class="s1">&#39;static/&#39;</span><span class="p">,</span>
</span><span class='line'>                        <span class="s1">&#39;acl&#39;</span>                       <span class="o">:</span> <span class="s1">&#39;public-read&#39;</span><span class="p">,</span>
</span><span class='line'>                        <span class="s1">&#39;policy&#39;</span>                    <span class="o">:</span> <span class="s1">&#39;&lt;?php echo $policy; ?&gt;&#39;</span><span class="p">,</span>
</span><span class='line'>                        <span class="s1">&#39;signature&#39;</span>                 <span class="o">:</span> <span class="s1">&#39;&lt;?php echo $signature; ?&gt;&#39;</span><span class="p">,</span>
</span><span class='line'>                        <span class="s1">&#39;folder&#39;</span>                    <span class="o">:</span> <span class="s1">&#39;static/&#39;</span><span class="p">,</span>
</span><span class='line'>                        <span class="s1">&#39;filename&#39;</span>                  <span class="o">:</span> <span class="p">(</span><span class="k">new</span> <span class="nb">Date</span><span class="p">()).</span><span class="nx">getTime</span><span class="p">(),</span>
</span><span class='line'>                        <span class="s1">&#39;success_action_status&#39;</span>     <span class="o">:</span> <span class="s1">&#39;200&#39;</span>
</span><span class='line'>                     <span class="p">},</span>
</span><span class='line'><span class="nx">fileObjName</span>        <span class="o">:</span> <span class="s1">&#39;file&#39;</span><span class="p">,</span>
</span></code></pre></td></tr></table></div></figure>


<p>以上是 <a href="http://www.uploadify.com/">Uploadify</a> 的 HTML5 版本的部分設定（我有付費購買 HTML5 版本的，如果沒有買的人請自行購買！然後，因為 Uploadify 原始碼中，組合 FormData 的順序，是依照 <code>formData</code> 設定的順序來做，這個方法 <strong>並不符合</strong> AWS S3 的規則（如果要上傳檔案，<code>file</code> 必須是表單的 <strong>最後一項</strong></p>

<p>所以我 Hack 掉了 Uploadify 的原始碼，自己包了一個來用，至於免費的 Flash 版本，要改成 S3 直接上傳網路上有一堆，請自行 Google！</p>

<h2>JavaScript 簡易實作程式碼</h2>

<p>我們用簡易的 <a href="https://developer.mozilla.org/en-US/docs/Web/API/FormData">FormData</a> 來說明，</p>

<p>PHP 運算 <code>policy</code> 與 <code>signature</code> 請參考上面的部分，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">__formData</span>  <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>                <span class="s1">&#39;AWSAccessKeyId&#39;</span>            <span class="o">:</span> <span class="s1">&#39;amazon access key&#39;</span><span class="p">,</span>
</span><span class='line'>                <span class="s1">&#39;key&#39;</span>                       <span class="o">:</span> <span class="s1">&#39;static/&#39;</span><span class="o">+</span><span class="p">(</span><span class="k">new</span> <span class="nb">Date</span><span class="p">()).</span><span class="nx">getTime</span><span class="p">()</span><span class="o">+</span><span class="s1">&#39;.jpg&#39;</span><span class="p">,</span>
</span><span class='line'>                <span class="s1">&#39;acl&#39;</span>                       <span class="o">:</span> <span class="s1">&#39;public-read&#39;</span><span class="p">,</span>
</span><span class='line'>                <span class="s1">&#39;policy&#39;</span>                    <span class="o">:</span> <span class="s1">&#39;&lt;?php echo $policy; ?&gt;&#39;</span><span class="p">,</span>
</span><span class='line'>                <span class="s1">&#39;signature&#39;</span>                 <span class="o">:</span> <span class="s1">&#39;&lt;?php echo $signature; ?&gt;&#39;</span><span class="p">,</span>
</span><span class='line'>                <span class="s1">&#39;content-type&#39;</span>              <span class="o">:</span> <span class="s1">&#39;image/jpeg&#39;</span><span class="p">,</span>
</span><span class='line'>                <span class="s1">&#39;folder&#39;</span>                    <span class="o">:</span> <span class="s1">&#39;static/&#39;</span><span class="p">,</span>
</span><span class='line'>                <span class="s1">&#39;filename&#39;</span>                  <span class="o">:</span> <span class="p">(</span><span class="k">new</span> <span class="nb">Date</span><span class="p">()).</span><span class="nx">getTime</span><span class="p">(),</span>
</span><span class='line'>                <span class="s1">&#39;success_action_status&#39;</span>     <span class="o">:</span> <span class="s1">&#39;200&#39;</span>
</span><span class='line'>             <span class="p">};</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">file</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s1">&#39;input[type=&quot;file&quot;]&#39;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">xhr</span> <span class="o">=</span> <span class="nx">file</span><span class="p">.</span><span class="nx">xhr</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">XMLHttpRequest</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">formData</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">FormData</span><span class="p">();</span>
</span><span class='line'>
</span><span class='line'><span class="k">for</span><span class="p">(</span> <span class="nx">x</span> <span class="k">in</span> <span class="nx">__formData</span> <span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">formData</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="nx">x</span><span class="p">,</span> <span class="nx">__formData</span><span class="p">[</span><span class="nx">x</span><span class="p">]);</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'>
</span><span class='line'><span class="cm">/* 檔案一定要在最後才加入 FormData，不然錯誤會噴到行政院！ */</span>
</span><span class='line'><span class="nx">formData</span><span class="p">.</span><span class="nx">append</span><span class="p">(</span><span class="s1">&#39;file&#39;</span><span class="p">,</span> <span class="nx">file</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">xhr</span><span class="p">.</span><span class="nx">open</span><span class="p">(</span><span class="s1">&#39;post&#39;</span><span class="p">,</span> <span class="s1">&#39;http://myuploader.s3.amazon.com&#39;</span><span class="p">,</span> <span class="kc">true</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nx">xhr</span><span class="p">.</span><span class="nx">addEventListener</span><span class="p">(</span><span class="s1">&#39;load&#39;</span><span class="p">,</span> <span class="kd">function</span><span class="p">(</span><span class="nx">e</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">readyState</span> <span class="o">==</span> <span class="mi">4</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">status</span> <span class="o">==</span> <span class="mi">200</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">if</span> <span class="p">(</span><span class="nx">file</span><span class="p">.</span><span class="nx">xhr</span><span class="p">.</span><span class="nx">responseText</span> <span class="o">!==</span> <span class="s1">&#39;Invalid file type.&#39;</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>                <span class="c1">// 到這裡全部完成</span>
</span><span class='line'>            <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>                <span class="c1">// 就是錯誤</span>
</span><span class='line'>            <span class="p">}</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">status</span> <span class="o">==</span> <span class="mi">404</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="c1">// 找不到太陽餅</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="k">this</span><span class="p">.</span><span class="nx">status</span> <span class="o">==</span> <span class="mi">403</span><span class="p">)</span> <span class="p">{</span>
</span><span class='line'>            <span class="c1">// 利大於弊</span>
</span><span class='line'>        <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span><span class='line'>            <span class="c1">// 謝謝指教</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="nx">xhr</span><span class="p">.</span><span class="nx">send</span><span class="p">(</span><span class="nx">formData</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>以上範例不保證實作得出來（誒</p>

<h3>S3 bucket CORS Configuration</h3>

<p>以下設定僅供參考，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="o">&lt;</span><span class="nx">CORSRule</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">AllowedOrigin</span><span class="o">&gt;*&lt;</span><span class="err">/AllowedOrigin&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">AllowedMethod</span><span class="o">&gt;</span><span class="nx">POST</span><span class="o">&lt;</span><span class="err">/AllowedMethod&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">AllowedMethod</span><span class="o">&gt;</span><span class="nx">PUT</span><span class="o">&lt;</span><span class="err">/AllowedMethod&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">MaxAgeSeconds</span><span class="o">&gt;</span><span class="mi">3000</span><span class="o">&lt;</span><span class="err">/MaxAgeSeconds&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">ExposeHeader</span><span class="o">&gt;</span><span class="nx">ETag</span><span class="o">&lt;</span><span class="err">/ExposeHeader&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">ExposeHeader</span><span class="o">&gt;</span><span class="nx">Location</span><span class="o">&lt;</span><span class="err">/ExposeHeader&gt;</span>
</span><span class='line'>    <span class="o">&lt;</span><span class="nx">AllowedHeader</span><span class="o">&gt;*&lt;</span><span class="err">/AllowedHeader&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="err">/CORSRule&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>裡面的 <code>&lt;ExposeHeader&gt;</code> 就是我剛剛提到的 <code>Access-Control-Expose-Headers</code> 這個部分，如果你想用 JavaScript 做什麼壞事的話，當然不保證安全就是了，因為 Header 這種東西，聽說也是可以偽造的（茶</p>

<h2>小結</h2>

<p>這個月 AWS 帳單又要爆了！</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[LOMO] New Petzval Art Lens]]></title>
    <link href="http://blog.hinablue.me/entry/lomography-new-petzval-lens/"/>
    <updated>2014-03-20T13:15:39+08:00</updated>
    <id>http://blog.hinablue.me/entry/lomography-new-petzval-lens</id>
    <content type="html"><![CDATA[<p>一開始是在 <a href="https://www.kickstarter.com/projects/lomography/the-lomography-petzval-portrait-lens">kickstarter</a> 注意到這個專案，後來 <a href="http://www.flyingv.cc/project/446">flyingV</a> 上面也出現了，所以就跑去贊助。</p>

<p>等了一年，終於來了！</p>

<!-- more -->


<h2>關於這顆鏡頭</h2>

<p>關於這顆鏡頭的來歷，可以去參考一下 <a href="http://en.wikipedia.org/wiki/Petzval_lens">Wiki</a>，或是看看募資平台上面的介紹（老實說比 Wiki 寫的還詳細，這次的募資製作商也拍了一部關於這顆鏡頭的短片，</p>

<iframe src="//player.vimeo.com/video/81386363?title=0&amp;byline=0&amp;portrait=0" width="500" height="281" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>


<p> <p><a href="http://vimeo.com/81386363">Lomography x Zenit New Petzval Lens: Now Available For Pre-Order!</a> from <a href="http://vimeo.com/lomography">Lomography</a> on <a href="https://vimeo.com">Vimeo</a>.</p></p>

<p>現在你可以在 <a href="http://shop.lomography.com/tw/lenses">Lomography</a> 的商店上面買到這顆鏡頭，當然，當初贊助的會有比較特別的服務，像是在鏡頭上刻字之類的。</p>

<h2>外觀</h2>

<p>首先，開頭是 LCA+ 20th special limited edition，這類似滿額禮，贊助金額超過某個門檻就會送你一台，不過我沒想到這個限量版這麼限量（貌似只有 1000 台，但是我看光在 kcikstarter 贊助的人就超過了說</p>

<p>正面！</p>

<p><a href="http://www.flickr.com/photos/hinablue/13281969604/"><img src="http://farm8.staticflickr.com/7076/13281969604_cc4377dc3a_z.jpg" alt="IMG_20140320_100150" /></a></p>

<p>背面！</p>

<p><a href="http://www.flickr.com/photos/hinablue/13281970144/"><img src="http://farm4.staticflickr.com/3717/13281970144_57e1993a52_z.jpg" alt="IMG_20140320_100157" /></a></p>

<p>限量是殘酷的！</p>

<p><a href="http://www.flickr.com/photos/hinablue/13281626425/"><img src="http://farm3.staticflickr.com/2857/13281626425_1f5860234b_z.jpg" alt="IMG_20140320_105450" /></a></p>

<p>接著就是重頭戲，Petzval Art Lens！</p>

<p><a href="http://www.flickr.com/photos/hinablue/13281973004/"><img src="http://farm3.staticflickr.com/2850/13281973004_56efb24e50_z.jpg" alt="IMG_20140320_100636" /></a></p>

<p>規格！生產號碼在最右邊。</p>

<p><a href="http://www.flickr.com/photos/hinablue/13281770173/"><img src="http://farm4.staticflickr.com/3671/13281770173_5d2a06438d_z.jpg" alt="IMG_20140320_100644" /></a></p>

<p>打開來裡面是一本手冊。</p>

<p><a href="http://www.flickr.com/photos/hinablue/13281770873/"><img src="http://farm3.staticflickr.com/2886/13281770873_7ba7c5609f_z.jpg" alt="IMG_20140320_100705" /></a></p>

<p>鏡頭本尊！是銅製鏡身，連鏡頭蓋都是銅製的，只有鏡尾接環蓋子是塑膠。</p>

<p><a href="http://www.flickr.com/photos/hinablue/13281974374/"><img src="http://farm8.staticflickr.com/7271/13281974374_cd1260d53f_z.jpg" alt="IMG_20140320_101053" /></a></p>

<p>插刀式光圈片，左邊第一片是全遮蔽，平常沒用的時候是插入這一片。不過，他專案裡面說會有四種特殊光圈插刀，可是我這次沒收到，不知道是為什麼？</p>

<p><a href="http://www.flickr.com/photos/hinablue/13281772983/"><img src="http://farm4.staticflickr.com/3804/13281772983_ff0368f33e_z.jpg" alt="IMG_20140320_101348" /></a></p>

<p>這是正面，因為他最大光圈是 f/2.2 所以這顆眼睛很大顆！</p>

<p><a href="http://www.flickr.com/photos/hinablue/13281976604/"><img src="http://farm8.staticflickr.com/7335/13281976604_b3f2311eda_z.jpg" alt="IMG_20140320_101409" /></a></p>

<p>接環，這是 Canon 接環，他的接環其實就是另外裝上去的（這樣也很合理，所以，其實他還是可以出其他接環的鏡頭，如果他願意量產的話。</p>

<p><a href="http://www.flickr.com/photos/hinablue/13281623355/"><img src="http://farm4.staticflickr.com/3766/13281623355_79496f21db_z.jpg" alt="IMG_20140320_101414" /></a></p>

<p>古銅色真的很像藝術品！</p>

<p><a href="http://www.flickr.com/photos/hinablue/13281978034/"><img src="http://farm8.staticflickr.com/7326/13281978034_d85e96200c_z.jpg" alt="IMG_20140320_101426" /></a></p>

<p>這是附件之一，它是一個真皮皮套，專門用來放鏡頭的。</p>

<p><a href="http://www.flickr.com/photos/hinablue/13281979704/"><img src="http://farm8.staticflickr.com/7230/13281979704_715d2e6768_z.jpg" alt="IMG_20140320_101955" /></a></p>

<p>接下來就是細部照片，這次全部的照片都是由小米 3 拍攝，無修改，直接上傳 flickr。</p>

<p><a href="http://www.flickr.com/photos/hinablue/13281778563/"><img src="http://farm8.staticflickr.com/7148/13281778563_930de342da_z.jpg" alt="IMG_20140320_130552" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/13281779683/"><img src="http://farm8.staticflickr.com/7214/13281779683_e75cb47f0b_z.jpg" alt="IMG_20140320_130647" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/13281630125/"><img src="http://farm8.staticflickr.com/7151/13281630125_4f1a7bd51c_z.jpg" alt="IMG_20140320_130724" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/13281987264/"><img src="http://farm8.staticflickr.com/7254/13281987264_9778e7c42b_z.jpg" alt="IMG_20140320_130814" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/13281785633/"><img src="http://farm4.staticflickr.com/3706/13281785633_8accc64ce7_z.jpg" alt="IMG_20140320_130839" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/13281786163/"><img src="http://farm4.staticflickr.com/3690/13281786163_5afed85650_z.jpg" alt="IMG_20140320_130856" /></a></p>

<p>外面這個其實是遮光罩，是用螺牙鎖在鏡身上面，客製化刻字也是刻在這上面的。</p>

<p><a href="http://www.flickr.com/photos/hinablue/13281787363/"><img src="http://farm8.staticflickr.com/7039/13281787363_63611d147f_z.jpg" alt="IMG_20140320_131021" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/13281990884/"><img src="http://farm8.staticflickr.com/7197/13281990884_e705cb6f50_z.jpg" alt="IMG_20140320_131041" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/13281637075/"><img src="http://farm4.staticflickr.com/3802/13281637075_13901ec05f_z.jpg" alt="IMG_20140320_131117" /></a></p>

<p>最後這是贊助版本，所以會有刻字服務，你可以刻上 50 個字上去。官方說，這些刻字都是請師父，每顆鏡頭一個一個刻上去的！真是超有心啊！</p>

<p><a href="http://www.flickr.com/photos/hinablue/13281637605/"><img src="http://farm8.staticflickr.com/7426/13281637605_f72224d656_z.jpg" alt="IMG_20140320_131129" /></a></p>

<h2>實拍</h2>

<p>我才剛拿到，改天再補吧（誒，只是說，看到有刻字感覺頗爽，一定要丟上 blog 來充一下版面的啊！</p>

<h1>Caline 我愛你啦！</h1>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[Web] Web Components 初探]]></title>
    <link href="http://blog.hinablue.me/entry/web-components-first-look/"/>
    <updated>2014-01-22T14:09:02+08:00</updated>
    <id>http://blog.hinablue.me/entry/web-components-first-look</id>
    <content type="html"><![CDATA[<p>其實這好像不是新聞，只是因為他還在 Working Draft 階段，目前的支援度也不高，所以資源相對少。然後，@Paul 寫了一個超強模組，詳見：<a href="https://www.facebook.com/notes/paul-li/module-%E9%96%8B%E7%99%BC-illutrans/10152050499127211">Module 開發 &ndash; illuTrans</a></p>

<p>所以好像也該來筆記一下。</p>

<!-- more -->


<h3>前言</h3>

<p>Google 當初在 Polymer 就是主打 Web Components 這個東西的應用。只是因為太新，所以目前能應用的層面還不算多。況且好像 AngularJS 太紅，所以感覺 Polymer 就有點乏人問津的感覺。</p>

<p>這邊有 Google IO 在去年的演講，有興趣的人可以先看看，</p>

<iframe width="640" height="360" src="//www.youtube-nocookie.com/embed/fqULJBBEVQE" frameborder="0" allowfullscreen></iframe>


<p>回題，今天要聊一下 Web Components 到底是在做什麼事情。參考資訊來自 W3C 的 <a href="http://www.w3.org/TR/components-intro/">Web Components</a> 介紹。</p>

<h3>Web Components?</h3>

<p>通常，我們製作一個網頁元件，就是把 HTML/CSS/JS 寫在你的 html 檔案裡面，而，Web Components 簡單來說，它能夠將你所製作的元件<strong>封裝</strong>起來，讓你的網頁元件可以被封裝成一包，然後利用自定義的標簽來使用你的元件。當然，由於目前瀏覽器支援程度尚未完全，所以，還是建議你搭配 Chrome 來看這些事情，不過，有些東西請必須打開，在 <code>chrome://flags</code> 當中，</p>

<ul>
<li>Experimental JavaScript</li>
<li>Experimental Web Platform Features</li>
<li>HTML Imports</li>
</ul>


<p>這樣，你就能先行體驗一下 Web Components 所帶來的魔術。</p>

<p>Web Components 包含了這些項目，</p>

<ul>
<li>Templates, 就是你可以定義一個樣板備用</li>
<li>Decorators, 裝飾樣式，其實主要的意思是，你可以使用 CSS 來表現你的樣板中的元素</li>
<li>Custom Elements, 可以使用自定義元件，自定義標籤或是屬性的擴充等等</li>
<li>Shadow DOM, 一種封裝過的 DOM，就是一種將界面元件封裝在自己的 DOM Tree 裡面的 DOM（好饒舌</li>
<li>Imports, 可以從外部載入打包過的 Web Components（上述的都可以（除了 CSS</li>
</ul>


<h3>Templates</h3>

<p>樣板顧名思義，就是把你的 Markup 用 <code>&lt;template&gt;</code> 包起來，舉例來說，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;template</span> <span class="na">id=</span><span class="s">&quot;myTemplate&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;slide&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;slogan&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;h1&gt;</span>Slider<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/div&gt;</span>
</span><span class='line'><span class="nt">&lt;/template&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>這個 <code>&lt;template&gt;</code> 有一個屬性 <code>content</code> 可用，當你要複製樣板內容時，可以使用這個 <code>content</code> 來進行操作，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">t</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">querySelector</span><span class="p">(</span><span class="s2">&quot;#myTemplate&quot;</span><span class="p">);</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">slide</span> <span class="o">=</span> <span class="nx">t</span><span class="p">.</span><span class="nx">content</span><span class="p">.</span><span class="nx">cloneNode</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
</span><span class='line'>
</span><span class='line'><span class="nb">document</span><span class="p">.</span><span class="nx">body</span><span class="p">.</span><span class="nx">appendChild</span><span class="p">(</span><span class="nx">slide</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<h3>Decorators</h3>

<p>主要就是使用 CSS 來控制你的元素，他必須要包含一個 <code>&lt;template&gt;</code> 元件，所以正規的寫法會是像這樣，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;decorator</span> <span class="na">id=</span><span class="s">&quot;myDecorator&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;template&gt;</span>
</span><span class='line'>        <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;slide&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>            <span class="nt">&lt;content&gt;&lt;/content&gt;</span>
</span><span class='line'>            <span class="nt">&lt;div</span> <span class="na">class=</span><span class="s">&quot;slogan&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>                <span class="nt">&lt;content</span> <span class="na">select=</span><span class="s">&quot;slogan&quot;</span><span class="nt">&gt;&lt;/content&gt;</span>
</span><span class='line'>            <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>        <span class="nt">&lt;/div&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/template&gt;</span>
</span><span class='line'><span class="nt">&lt;/decorator&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>你會發現其中有 <code>&lt;content&gt;</code> 標籤，這個標籤所代表的意義是，當你定義好相對應的 Decorators，它會將整個元件輸出成你所設定的樣子。而這個 <code>&lt;content&gt;</code> 就會取代你所設定的內容，舉個例子來說，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="nt">slider</span><span class="o">[</span><span class="nt">open</span><span class="o">]</span> <span class="p">{</span>
</span><span class='line'>    <span class="n">decorator</span><span class="o">:</span> <span class="sx">url(#myDecorator)</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>當然你必須要準備一些內容，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;slider</span> <span class="na">open</span><span class="nt">&gt;</span>
</span><span class='line'>    <span class="nt">&lt;ul&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li&gt;</span>First slide<span class="nt">&lt;/li&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li&gt;</span>Second slide<span class="nt">&lt;/li&gt;</span>
</span><span class='line'>        <span class="nt">&lt;li&gt;</span>Third slide<span class="nt">&lt;/li&gt;</span>
</span><span class='line'>    <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'>    <span class="nt">&lt;slogan&gt;</span>My Slider<span class="nt">&lt;/slogan&gt;</span>
</span><span class='line'><span class="nt">&lt;/slider&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>不過很抱歉，因為這個東西實在太新，瀏覽器目前實作不出來（我照著 W3C 的內容改也沒用，假如你是用 W3C 所給的例子，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;details</span> <span class="na">open</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;summary&gt;</span>Timepieces<span class="nt">&lt;/summary&gt;</span>
</span><span class='line'>  <span class="nt">&lt;ul&gt;</span>
</span><span class='line'>    <span class="nt">&lt;li&gt;</span>Sundial
</span><span class='line'>    <span class="nt">&lt;li&gt;</span>Cuckoo clock
</span><span class='line'>    <span class="nt">&lt;li&gt;</span>Wristwatch
</span><span class='line'>  <span class="nt">&lt;/ul&gt;</span>
</span><span class='line'><span class="nt">&lt;/details&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>你如果用 Chrome 開的話，瀏覽器自己會直接幫你實作出來，貌似跟 Web Components 無關（翻白眼！所以，這個部分我就不多著墨，等到官方有更多，或是瀏覽器真的能夠實作這個部分的時候，再來討論吧。</p>

<h3>Custom Elements</h3>

<p>跟 Decorators 頗類似，但是目前是 Web Components 的靈魂之一（另外一個是 Shadow DOM 待會會提。顧名思義就是，我可以自定義元件，然後在元件裡面做許多事情，例如 JS 或是 CSS 也都可以被寫在裡面。</p>

<h4>基本定義</h4>

<p>如何定義一個 <code>&lt;element&gt;</code> 呢？</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;element</span> <span class="na">name=</span><span class="s">&quot;my-button&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;/element&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>自定義元件可以使用擴充模式，加上屬性 <code>extends</code> 即可，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;element</span> <span class="na">extends=</span><span class="s">&quot;button&quot;</span> <span class="na">name=</span><span class="s">&quot;my-button&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;/element&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>這個 <code>extends</code> 頗有意思，在定義上來說，我們所謂的<strong>自定義元素</strong>相對於 HTML 標籤語義來說，應該都是屬於語義無差別元素 (HTMLUnknownElement)，而，當你使用 <code>extends</code> 的時候，就是告訴瀏覽器說，我這個自定義元素，他的語義是接近於某一個 HTML 元素的。</p>

<p>換句話說，上述的 <code>my-button</code> 這個自定義元素，我使用 <code>extends</code> 告訴你，我的這個元素與 <code>&lt;button&gt;</code> 是相似的。這個 <code>extends</code> 的用途大概就是這樣。如果你不使用 <code>extends</code> 的話，那麼瀏覽器就會直接以 <code>name</code> 賦予值來定義你這個元素當作是某一種語義，同樣的，也是屬於語義無差別元素。</p>

<h4>定義方法與屬性</h4>

<p>是，你沒有看錯，這樣的自定義元素可以被用於定義一種方法或是屬性，很類似把元素拿來當做 API 的載體，舉例來說，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;element</span> <span class="na">name=</span><span class="s">&quot;etag&quot;</span><span class="nt">&gt;</span>
</span><span class='line'>  <span class="nt">&lt;script&gt;</span>
</span><span class='line'>    <span class="p">({</span>
</span><span class='line'>        <span class="nx">debit</span><span class="o">:</span> <span class="kd">function</span><span class="p">()</span> <span class="p">{</span>
</span><span class='line'>            <span class="k">return</span> <span class="s1">&#39;always&#39;</span><span class="p">;</span>
</span><span class='line'>        <span class="p">}</span>
</span><span class='line'>    <span class="p">})</span>
</span><span class='line'>  <span class="nt">&lt;/script&gt;</span>
</span><span class='line'><span class="nt">&lt;/element&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>這樣，我們自定義的 <code>etag</code> 就會有一個方法，叫做 <code>debit</code> 的方法。<strike>推測遠通電收應該是都返回 always</strike></p>

<h4>生命週期的 Callbacks</h4>

<p>在整個自定義元素的生命週期中，有三種 Callbacks 可以使用，</p>

<ul>
<li><code>readyCallback</code></li>
<li><code>insertedCallback</code></li>
<li><code>removedCallback</code></li>
</ul>


<p>意思就是 Callbacks 上面的意思（揍飛</p>

<p>剛剛有說過，我們可以在自定義元素中使用方法跟屬性，同樣的，我們也可以在元素中定義這三種 Callbacks 要做什麼樣的事情。有鑒於大家都是強大的前端工程師，就不多做解釋了，反正就是 Javascript 而已嘛（誒</p>

<h4>在 HTML 中使用 Custom Elements</h4>

<p>有個條件是，你的自定義元素必須由該元素擴展而來。但是，不確定是不是<strong>必要</strong>條件（官方也沒講。</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="c">&lt;!-- 定義 Custom Elements --&gt;</span>
</span><span class='line'><span class="nt">&lt;element</span> <span class="na">extends=</span><span class="s">&quot;button&quot;</span> <span class="na">name=</span><span class="s">&quot;my-button&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;/element&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="c">&lt;!-- 使用 Custom Elements --&gt;</span>
</span><span class='line'><span class="nt">&lt;button</span> <span class="na">is=</span><span class="s">&quot;my-button&quot;</span><span class="nt">&gt;</span>
</span><span class='line'><span class="nt">&lt;/button&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h4>在 Script 中使用 Custom Elements</h4>

<p>只要利用 <code>document.register</code> 就可以把自定義元素綁在你的 Javascript 上面。我想大家的 Javascript 都比我強，所以就不多作解釋。</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">myButton</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">register</span><span class="p">(</span><span class="s1">&#39;button&#39;</span><span class="p">,</span> <span class="s1">&#39;my-button&#39;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>    <span class="nx">prototype</span><span class="o">:</span> <span class="nb">Object</span><span class="p">.</span><span class="nx">create</span><span class="p">(</span><span class="nx">HTMLButtonElement</span><span class="p">.</span><span class="nx">prototype</span><span class="p">,</span> <span class="p">{})</span>
</span><span class='line'><span class="p">});</span>
</span><span class='line'>
</span><span class='line'><span class="kd">var</span> <span class="nx">b</span> <span class="o">=</span> <span class="k">new</span> <span class="nx">myButton</span><span class="p">();</span>
</span></code></pre></td></tr></table></div></figure>


<p>自定義元素的定義也可以透過 <code>document.createElement</code> 來做到，以下直接給上 W3C <strike>飯粒</strike>範例（不解釋</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='javascript'><span class='line'><span class="kd">var</span> <span class="nx">b</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">&#39;button&#39;</span><span class="p">,</span> <span class="s1">&#39;fancy-button&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">alert</span><span class="p">(</span><span class="nx">b</span><span class="p">.</span><span class="nx">outerHTML</span><span class="p">);</span> <span class="c1">// will display &#39;&lt;button is=&quot;fancy-button&quot;&gt;&lt;/button&gt;&#39;</span>
</span><span class='line'><span class="kd">var</span> <span class="nx">c</span> <span class="o">=</span> <span class="nb">document</span><span class="p">.</span><span class="nx">createElement</span><span class="p">(</span><span class="s1">&#39;tick-tock-clock&#39;</span><span class="p">);</span>
</span><span class='line'><span class="nx">alert</span><span class="p">(</span><span class="nx">c</span><span class="p">.</span><span class="nx">outerHTML</span><span class="p">);</span> <span class="c1">// will display &#39;&lt;tick-tock-clock&gt;&lt;/tick-tock-clock&gt;&#39;</span>
</span></code></pre></td></tr></table></div></figure>


<h4>更新元素</h4>

<p>可以透過 CSS 的擬似類別 <code>:unresolved</code> 來更新自定義元素的內容。或許你會問這三尛？嗯，這是為了 Web Components 所特別衍生出來的一種擬似類別，在 CSS 正規文件上目前是看不到的。類似的東西還有前陣子剛出現的 Cat &amp; Hat（不解釋</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;style&gt;</span>
</span><span class='line'><span class="nt">tick-tock-clock</span><span class="nd">:unresolved</span> <span class="p">{</span>
</span><span class='line'>  <span class="k">content</span><span class="o">:</span> <span class="s1">&#39;??:??&#39;</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="nt">&lt;/style&gt;</span>
</span><span class='line'><span class="nt">&lt;tick</span><span class="na">-tock-clock</span><span class="nt">&gt;</span><span class="err">&lt;</span>/tick-tock-clock&gt; <span class="c">&lt;!-- will show ??:?? --&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<h4>擴展自定義元素</h4>

<p>就是剛剛的 <code>extends</code> 只是我們現在拿來擴展自定義元素，這麼做有好處嗎？有啊，請自行參透。</p>

<h3>Shadow DOM</h3>

<p>另外一個重頭戲，這個概念應該是從 Chrome 來的，然後就這樣紅了起來。<strike>或許是 Google 的另外一種邪惡事跡？</strike>他的概念就是，在一個元素底下，包含了一整個 <code>#document</code> 完整的 DOM Tree，而這個 DOM 就把他稱作 Shadow DOM。</p>

<p>這個 Shadow DOM 搭配 Template, Custom Elements 可以做相當多<strike>邪惡</strike>事情，不過，因為這種操作在 DevTools 並不容易觀察出來，所以在開發上會有一點難度（或是挫折&hellip;</p>

<p>Shadow DOM 有許多種模式，不過這如果要講起來可能又是好幾篇的事情，所以這裡就先不解釋這麼多了。況且目前的文件，也還是屬於 Working Draft 的階段，有興趣的人可以自己去看看。</p>

<p><a href="http://w3c.github.io/webcomponents/spec/shadow/">Shadow DOM</a></p>

<h4>單一插入點</h4>

<p>其實，你可以利用 Chrome 的 DevTools 去看一些 <code>&lt;input&gt;</code> 元素，他的狀態就類似這樣。如果以自定義元素來說，就是擁有一個或多個 <code>content</code> 這樣的元件，Shadow DOM 就是從這樣的元素來插入。</p>

<h4>重新繪製</h4>

<p>我比較喜歡原文直接翻譯，重投影 (Reprojection)<strike>單純是因為我很愛投影這兩個字</strike>，意思就是呢，我可以利用樣板來重新產生我的原件內容，舉個例子來說，</p>

<p><img src="http://blog.hinablue.me/images/shadow_dom_example.png" alt="Shadow DOM Reprojection" /></p>

<p>請仔細看圖，你會發現左邊，跟右邊的 DevTools，所展示出的 <code>.breaking</code> 的位置不太一樣。這就是重新繪製元素的作用，它可以利用現有的樣板，將你原有存在於 HTML 的內容重新編排過。</p>

<h4>備用內容</h4>

<p>原文 Fallback Content，意思是，當你的插入點沒有任何資料的時候，可以拿這個 <code>content</code> 來取代。<strike>並不是說他可以相容 IE 好嗎！</strike></p>

<h4>Multiple Shadow Subtrees</h4>

<p>意思就是你可以一直 Shadow DOM 下去，<strike>如果你覺得你不會被自己搞死的時候</strike>。當你要使用多層的 Shadow DOM 的時候，有些事情是必須要注意的，</p>

<ul>
<li>Shadow DOM 的宿主 (host) 只會有一個</li>
<li>每一個插入點都有順序</li>
<li>從宿主衍生出來的 Shadow DOM Tree 其根 (root) 無法被刪除，或者說，你不應該嘗試去任意刪除根</li>
<li>增加與刪除都有其順序（所以剛剛說不能任意刪除</li>
</ul>


<p>至於他的工作方式，大抵上可以這樣解釋，</p>

<ul>
<li>找到元素第一個 Shadow DOM，並且找到插入點（insertion points，<code>&lt;content&gt;</code></li>
<li>然後再往下找子元素，看是否有 <code>&lt;shadow&gt;</code> 子元素</li>
<li>然後一直循環的去找子元素與 <code>&lt;shadow&gt;</code> 子元素，如果都沒有了，就回到 Shadow DOM Tree 最上層準備渲染</li>
</ul>


<h4>CSS and Shadow DOM</h4>

<p>這不太像是一般的 CSS Selector，所以你要對於 Shadow DOM 製作 CSS 樣式的時候，需要用比較特殊的選擇器來套用。例如，</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='css'><span class='line'><span class="nf">#news</span><span class="o">:</span><span class="nd">:x-ticker</span> <span class="p">{</span>
</span><span class='line'>  <span class="c">/* Your seyle here. */</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>然後，他也能使用 <code>@host</code> 與 <code>:scope</code> 這樣的設定來做一些比較特別的應用。主要還是依據整個 Shadow DOM 的結構來跑。另一個比較特殊的是，它可以使用 <code>var-</code> 前輟，來讓 CSS 可以當成變數使用。</p>

<h4>Events in Shadow DOM</h4>

<p>大多數的事件都可以使用在 Shadow DOM 裡面，不過要特別留意的是一些元素上會發生的事情，例如 <code>mouseover</code> 這種，撰寫的時候要特別小心，不然你可能會拿到元素移動到自己身上的這種弔詭的事件響應。</p>

<p>就是元素本身監聽 <code>mouseover</code>，然後 Shadow DOM 也有元素監聽 <code>mouseover</code> 的時候。</p>

<h3>Imports</h3>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="nt">&lt;link</span> <span class="na">rem=</span><span class="s">&quot;import&quot;</span> <span class="na">href=</span><span class="s">&quot;templates.html&quot;</span><span class="nt">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>不解釋！</p>

<h3>小結</h3>

<p>其實 <a href="http://www.polymer-project.org/">Polymer</a> 還是不錯的！真的！</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[閒聊] 從蔥花事件看 CSS/JS 與群聚效應]]></title>
    <link href="http://blog.hinablue.me/entry/negi-event-talk-about-css-js-and-cluster-effect/"/>
    <updated>2014-01-15T11:55:11+08:00</updated>
    <id>http://blog.hinablue.me/entry/negi-event-talk-about-css-js-and-cluster-effect</id>
    <content type="html"><![CDATA[<p>我不確定群聚效應的英文有沒有寫錯，維基百科說是 <a href="http://zh.wikipedia.org/wiki/%E7%BE%A4%E8%81%9A%E6%95%88%E6%87%89">Critical mass</a>，不過我覺得 Cluster effect 好像比較接近？</p>

<p>算了，反正我英文不好（無責</p>

<!-- more -->


<h3>蔥花事件</h3>

<p>這個有在聽相聲的人或許會知道，在相聲瓦舍有一段台灣吃法的橋段，就是灑滿蔥花。後來的事情在<a href="http://www.plurk.com/p/jlvxh2">這個噗浪</a>上面有比較完整說明。然後，也因為這件事情，就有人提到說在河道上撒蔥花，就演變成了這次的蔥花事件（<strike>還上新聞，我們的媒體是怎樣？</strike></p>

<p>然後我的網站流量就這樣被往上推，</p>

<p><img src="http://blog.hinablue.me/images/negi-analytics.png" alt="Google Analytics" /></p>

<p><strong>畢竟平常沒什麼人在看我的部落格，所以你可以看到旁邊的線低得可憐。</strong></p>

<h3>群聚效應</h3>

<p>起初只是好玩，詳細可以看<a href="http://www.plurk.com/p/jlpj9d">這一則噗浪</a></p>

<p style="font-size: 3em;">TL;DR</p>


<p>看圖，</p>

<p><img src="http://blog.hinablue.me/images/negi-plurk.png" alt="Negi Plurk" /></p>

<p>截至今日為止，<strong>轉噗 2623</strong>，可見這蔥花撒的多好。原本我以為這只會在同人圈裡面擴散，沒想到竟然爆炸成這樣。不過回頭想想，我也不是那個圈子裡面的人，我只是瞎起鬨而已。所以，不得不說這種感染力真的蠻強大的，換個角度想，或許這只是一種在現在這樣的生活中，找到樂趣或是舒壓的一種方式。</p>

<p><em>所以我說，撒個蔥花就能上新聞媒體，我們還真的蠻有病的。</em></p>

<p>不過這個<em>群</em>裡面，我發現了一些有趣的事情，</p>

<ul>
<li>朝聖者</li>
<li>需求者</li>
<li>製造者</li>
</ul>


<p>我應該算是<strike>有病</strike>的製造者，這些人其實不少，所謂大隱隱於市或許就是這樣吧（<strike>這樣亂用典好嗎</strike>。需求者就更多了，跟朝聖者不同的是，他們會對散播出來的東西有所訴求，然後有些製造者就會去滿足這樣的訴求。朝聖就單純來朝聖的 XD</p>

<p>由於我做了一個 Pure Javascript 版本，所以後來就不斷的被拿出去衍生（因為 HTTPS 也可以跑的緣故 www ）所以其實，他是一個網站特效，只是，換成蔥花或是其他東西之後，就變成<strong>網站特笑</strong>了（看得懂前面 www 的意思的人，應該也是某圈內人 XD</p>

<h3>CSS/Javascript</h3>

<p>技術面的事情，其中也不乏一些高手高高手。像我在製作畫面時，也有人針對了 rAF 給了建議，甚至是提供自己的 render 寫法來協助。撇除這個事件本身，技術上的交流我覺得是好的！這對我來說是<strong>有趣</strong>的一件事情，畢竟技術面的東西很枯燥，人與人之間能找到一些可以切磋的點，其實真的可以讓整個事情可以快速的演變，或是精進。</p>

<p>這次的東西其實也只是畫面處理而已，不過針對 rAF 的部分，還是學到了不少可以加速的方式（甚至更變態點可以用 worker 來去做這樣。然後，因為有製作 CSS 3D 的部分，所以也妥善利用 <code>perspective</code> 的設定，來做景深透視的部分。原本，我是直接使用 <a href="http://threejs.org/">three.js</a> 去做 3D 畫面（畢竟比較快，不過，我著實不熟悉那個東西，所以就回到前端去思考 CSS 3D 的可能性。</p>

<p>最後還是靠 <code>perspective</code> 與 <code>transfrom</code> 搞定所有的事情，當然，效能不能跟 <code>Canvas</code> 或是 <code>WebGL</code> 相提並論就是（廢話</p>

<h3>小結</h3>

<p><strike>蔥花過量，有礙健康！</strike></p>

<p>凡事適量就好。</p>

<p>這是我後來改過的<a href="http://www.hinablue.me/negicss3d.html">蔥花 CSS 3D</a>，原始碼有興趣的人可以打開看看。至於裡面其他的東西，<strike>我不承認那是我做的（抹臉</strike></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[[2013] 泰國自由行]]></title>
    <link href="http://blog.hinablue.me/entry/2013-thailand-backpack-travel/"/>
    <updated>2014-01-06T22:24:36+08:00</updated>
    <id>http://blog.hinablue.me/entry/2013-thailand-backpack-travel</id>
    <content type="html"><![CDATA[<p>去年去泰國的照片一直忘記貼上來，既然都已經 2014 了，所以現在補一下應該沒關係（吧</p>

<p>是說，我一直遇到 <a href="http://www.agoda.com/">Agoda</a> 的問題到底是哪招 XD</p>

<!-- more -->


<p>這次住的飯店一樣是在 <a href="http://www.agoda.com/">Agoda</a> 上面訂的。但是最後一天，飯店卻跟我說 <a href="http://www.agoda.com/">Agoda</a> 少訂了一天加床，所以要我補一天加床的費用。後來，我在前往機場的路上馬上 email 聯繫 <a href="http://www.agoda.com/">Agoda</a>，我不得不說，這是個奇妙的旅程！</p>

<p><img src="http://blog.hinablue.me/images/agoda.png" alt="Agoda email" /></p>

<p>如果想要看這次的行程，可以直接捲到最後面去看（中間圖多慎入<strike>（你現在才講是哪招</strike>，然後這裡是 <a href="https://plus.google.com/photos/104812280860478253996/albums/5965791798272019281?authkey=CLWc9-Ti0cPVrgE">Picasa 的相簿</a>，就不多貼出來了（有行程的相片在這裡面，flickr 上面沒有</p>

<p>好啦，廢話不多說，這是我們住的飯店，他有免費的嘟嘟車載我們去捷運站。司機其實是飯店的服務人員，人相當好，屬於人來瘋型的！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10550543756/"><img src="http://farm6.staticflickr.com/5550/10550543756_8a0bf9ebd2_z.jpg" alt="IMG_2473" /></a></p>

<p>捷運站等車中！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10550547496/"><img src="http://farm4.staticflickr.com/3792/10550547496_d0224f6585_z.jpg" alt="IMG_2475" /></a></p>

<p>路邊攤的烤雞腿！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10550784963/"><img src="http://farm3.staticflickr.com/2806/10550784963_05c5208b18_z.jpg" alt="IMG_2478" /></a></p>

<p>第一站去了百貨公司裡面吃飯，烤雞好吃，其他就普普（哈哈</p>

<p><a href="http://www.flickr.com/photos/hinablue/10550786753/"><img src="http://farm6.staticflickr.com/5479/10550786753_b952518821_z.jpg" alt="IMG_2519" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550551626/"><img src="http://farm4.staticflickr.com/3758/10550551626_48b5b03a58_z.jpg" alt="IMG_2520" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550536485/"><img src="http://farm4.staticflickr.com/3758/10550536485_aaaa1a7beb_z.jpg" alt="IMG_2521" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550790403/"><img src="http://farm4.staticflickr.com/3753/10550790403_735b59b257_z.jpg" alt="IMG_2522" /></a></p>

<p>這是第二天搭捷運，然後轉計程車去小歐洲（The Circle，但是！因為問計程車司機跟他說 The Circle 沒半個知道，後來我們就去小吃攤販問他，然後她幫我們寫泰文給司機看，我們才到得了 XDD</p>

<p><a href="http://www.flickr.com/photos/hinablue/10550791143/"><img src="http://farm6.staticflickr.com/5537/10550791143_938eeeb032_z.jpg" alt="IMG_2523" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550792333/"><img src="http://farm8.staticflickr.com/7329/10550792333_cd4ef61b3c_z.jpg" alt="IMG_2524" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550793113/"><img src="http://farm8.staticflickr.com/7460/10550793113_c9010a17c7_z.jpg" alt="IMG_2526" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550557406/"><img src="http://farm8.staticflickr.com/7341/10550557406_4945e369cb_z.jpg" alt="IMG_2529" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550541965/"><img src="http://farm8.staticflickr.com/7420/10550541965_3518cda39f_z.jpg" alt="IMG_2530" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550542785/"><img src="http://farm8.staticflickr.com/7366/10550542785_e8645cb7d3_z.jpg" alt="IMG_2532" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550799103/"><img src="http://farm8.staticflickr.com/7343/10550799103_c71085ab3c_z.jpg" alt="IMG_2536" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550566356/"><img src="http://farm3.staticflickr.com/2809/10550566356_2ea92be814_z.jpg" alt="IMG_2543" /></a></p>

<p>某一天晚上去水上市集，就是中央碼頭有免費接駁船的那個。</p>

<p><a href="http://www.flickr.com/photos/hinablue/10550550355/"><img src="http://farm8.staticflickr.com/7382/10550550355_9639e220ab_z.jpg" alt="IMG_2546" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550609554/"><img src="http://farm6.staticflickr.com/5499/10550609554_510bf25bb0_z.jpg" alt="IMG_2547" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550610694/"><img src="http://farm4.staticflickr.com/3766/10550610694_02328e63c2_z.jpg" alt="IMG_2548" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550807143/"><img src="http://farm6.staticflickr.com/5525/10550807143_39effd78f1_z.jpg" alt="IMG_2556" /></a></p>

<p>飯店自拍中（哈哈哈</p>

<p><a href="http://www.flickr.com/photos/hinablue/10550571616/"><img src="http://farm8.staticflickr.com/7333/10550571616_4f2fda802f_z.jpg" alt="IMG_2558" /></a></p>

<p>這是在百貨公司遇到 LINE 泰國行銷廣告，打卡送氣球。我們總共拿了熊大，兔兔，饅頭人跟那隻小鳥。但是，當天要搭捷運回飯店的時候，氣球卻被沒收了（因為捷運禁止帶氣球（可惡！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549459165/"><img src="http://farm6.staticflickr.com/5495/10549459165_6756d17c37_z.jpg" alt="IMG_2560" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549478005/"><img src="http://farm6.staticflickr.com/5545/10549478005_5b265257a6_z.jpg" alt="IMG_2567" /></a></p>

<p>水族館（我就不說是在哪個百貨公司了</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549484235/"><img src="http://farm6.staticflickr.com/5550/10549484235_4b5ee95770_z.jpg" alt="IMG_2569" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549732563/"><img src="http://farm3.staticflickr.com/2888/10549732563_5d5954183e_z.jpg" alt="IMG_2571" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549505725/"><img src="http://farm6.staticflickr.com/5529/10549505725_857db458de_z.jpg" alt="IMG_2576" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549515706/"><img src="http://farm6.staticflickr.com/5496/10549515706_70acf34ecb_z.jpg" alt="IMG_2577" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549524236/"><img src="http://farm8.staticflickr.com/7417/10549524236_597a89cf53_z.jpg" alt="IMG_2582" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549527155/"><img src="http://farm6.staticflickr.com/5535/10549527155_83f81f2d15_z.jpg" alt="IMG_2585" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549530795/"><img src="http://farm3.staticflickr.com/2861/10549530795_27cd780dfa_z.jpg" alt="IMG_2588" /></a></p>

<p>那隻企鵝人偶一直摸我肚子是哪招啦！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549589234/"><img src="http://farm6.staticflickr.com/5492/10549589234_7129ea58f6_z.jpg" alt="IMG_2590" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549546666/"><img src="http://farm3.staticflickr.com/2833/10549546666_29d87a676b_z.jpg" alt="IMG_2595" /></a></p>

<p>這個海馬超漂亮的！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549558735/"><img src="http://farm8.staticflickr.com/7424/10549558735_011d6b6f6e_z.jpg" alt="IMG_2606" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549627744/"><img src="http://farm4.staticflickr.com/3698/10549627744_247eb346f8_z.jpg" alt="IMG_2631" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549833603/"><img src="http://farm6.staticflickr.com/5538/10549833603_949523797b_z.jpg" alt="IMG_2640" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549643444/"><img src="http://farm8.staticflickr.com/7421/10549643444_041d99f967_z.jpg" alt="IMG_2646" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549856853/"><img src="http://farm6.staticflickr.com/5483/10549856853_f726074d12_z.jpg" alt="IMG_2656" /></a></p>

<p>水族館結束後，逛百貨公司去買了一隻很可愛的冰棒（但是很甜！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549626316/"><img src="http://farm4.staticflickr.com/3829/10549626316_0c030331a1_z.jpg" alt="IMG_2658" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549635416/"><img src="http://farm4.staticflickr.com/3778/10549635416_2019ec77ff_z.jpg" alt="IMG_2661" /></a></p>

<p>等其他同伴集合吃飯的時候，跑去吃 TWININGS 下午茶！我超愛 TWININGS 的說！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549643666/"><img src="http://farm6.staticflickr.com/5480/10549643666_793c6efd7a_z.jpg" alt="IMG_2663" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549644665/"><img src="http://farm3.staticflickr.com/2840/10549644665_a08229c387_z.jpg" alt="IMG_2665" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549648315/"><img src="http://farm6.staticflickr.com/5522/10549648315_85a3c005fd_z.jpg" alt="IMG_2666" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549718204/"><img src="http://farm4.staticflickr.com/3833/10549718204_66b6599714_z.jpg" alt="IMG_2670" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549915913/"><img src="http://farm4.staticflickr.com/3669/10549915913_5f4c8f127f_z.jpg" alt="IMG_2671" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549919273/"><img src="http://farm3.staticflickr.com/2819/10549919273_0a1286800a_z.jpg" alt="IMG_2672" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549923663/"><img src="http://farm6.staticflickr.com/5494/10549923663_ff160ba97d_z.jpg" alt="IMG_2673" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549680065/"><img src="http://farm4.staticflickr.com/3798/10549680065_94a5c4f134_z.jpg" alt="IMG_2676" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549692206/"><img src="http://farm6.staticflickr.com/5482/10549692206_1208a65996_z.jpg" alt="IMG_2677" /></a></p>

<p>帥氣度 200%（誒</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549939233/"><img src="http://farm4.staticflickr.com/3715/10549939233_8cb4e390cc_z.jpg" alt="IMG_2680" /></a></p>

<p>某一天要搭公車去某個水上市場（到底是哪個 XD</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549961523/"><img src="http://farm6.staticflickr.com/5531/10549961523_216bbff400_z.jpg" alt="IMG_2697" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549722205/"><img src="http://farm4.staticflickr.com/3740/10549722205_874a52d6a6_z.jpg" alt="IMG_2702" /></a></p>

<p>車上有售票小姐，她超害羞的，拍了好幾張只有這一張是正面 XD</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549780744/"><img src="http://farm6.staticflickr.com/5473/10549780744_908ce708f2_z.jpg" alt="IMG_2704" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549738106/"><img src="http://farm8.staticflickr.com/7385/10549738106_f6f4a94927_z.jpg" alt="IMG_2707" /></a></p>

<p>大林江水上市場外面的傳統市場！人到國外，傳統市場還是要逛的啊！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549747836/"><img src="http://farm6.staticflickr.com/5492/10549747836_39ddb4e367_z.jpg" alt="IMG_2712" /></a></p>

<p>我有買這隻回家（哈哈哈</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549757196/"><img src="http://farm3.staticflickr.com/2878/10549757196_afdb023b19_z.jpg" alt="IMG_2714" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550010173/"><img src="http://farm6.staticflickr.com/5492/10550010173_b18f69f15c_z.jpg" alt="IMG_2717" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549776775/"><img src="http://farm4.staticflickr.com/3742/10549776775_4ef9353a0b_z.jpg" alt="IMG_2720" /></a></p>

<p>水上市場的特色，就是在船上賣吃的（至於水從哪裡來，就不要問了&hellip;</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549781795/"><img src="http://farm6.staticflickr.com/5548/10549781795_5be1ef707c_z.jpg" alt="IMG_2721" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549840024/"><img src="http://farm6.staticflickr.com/5488/10549840024_f0191cb534_z.jpg" alt="IMG_2722" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550040123/"><img src="http://farm3.staticflickr.com/2870/10550040123_cd91ca16e8_z.jpg" alt="IMG_2727" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550048653/"><img src="http://farm3.staticflickr.com/2812/10550048653_e19b73e0b1_z.jpg" alt="IMG_2730" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549814985/"><img src="http://farm4.staticflickr.com/3771/10549814985_4d017d11ed_z.jpg" alt="IMG_2738" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549828556/"><img src="http://farm3.staticflickr.com/2872/10549828556_bbf06ece82_z.jpg" alt="IMG_2739" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550074843/"><img src="http://farm4.staticflickr.com/3697/10550074843_cbd5e3c67a_z.jpg" alt="IMG_2741" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549844885/"><img src="http://farm6.staticflickr.com/5488/10549844885_6c3ed25b17_z.jpg" alt="IMG_2751" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549861066/"><img src="http://farm8.staticflickr.com/7392/10549861066_4160018f86_z.jpg" alt="IMG_2754" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549852535/"><img src="http://farm4.staticflickr.com/3801/10549852535_cb6fa8f555_z.jpg" alt="IMG_2760" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549873846/"><img src="http://farm8.staticflickr.com/7435/10549873846_cc82f71c30_z.jpg" alt="IMG_2763" /></a></p>

<p>這是水上市場旁邊的小吃攤！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10550114923/"><img src="http://farm6.staticflickr.com/5495/10550114923_1e66339ef9_z.jpg" alt="IMG_2766" /></a></p>

<p>螃蟹啊！！！！！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549873445/"><img src="http://farm4.staticflickr.com/3665/10549873445_f8ca0de68d_z.jpg" alt="IMG_2774" /></a></p>

<p>大頭蝦啊！！！！！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10550125483/"><img src="http://farm6.staticflickr.com/5530/10550125483_8dbd266cf9_z.jpg" alt="IMG_2775" /></a></p>

<p>鹽燒魚啊！！！！！！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10550130173/"><img src="http://farm4.staticflickr.com/3730/10550130173_bdf2ba2bc2_z.jpg" alt="IMG_2776" /></a></p>

<p>孔雀蛤啊！！！！！！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549884175/"><img src="http://farm3.staticflickr.com/2811/10549884175_9a6e955a17_z.jpg" alt="IMG_2777" /></a></p>

<p>考汪宮，來給猴子看！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549951514/"><img src="http://farm3.staticflickr.com/2846/10549951514_22e65fb523_z.jpg" alt="IMG_2786" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549956894/"><img src="http://farm6.staticflickr.com/5490/10549956894_fcd0e1773a_z.jpg" alt="IMG_2789" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549904915/"><img src="http://farm4.staticflickr.com/3795/10549904915_a2b8b3f579_z.jpg" alt="IMG_2790" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550158153/"><img src="http://farm8.staticflickr.com/7457/10550158153_0953245e9a_z.jpg" alt="IMG_2795" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550164053/"><img src="http://farm8.staticflickr.com/7381/10550164053_8cd0528d97_z.jpg" alt="IMG_2797" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549929426/"><img src="http://farm4.staticflickr.com/3690/10549929426_55d654ba1b_z.jpg" alt="IMG_2798" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549922905/"><img src="http://farm4.staticflickr.com/3809/10549922905_954aa331f6_z.jpg" alt="IMG_2799" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549981194/"><img src="http://farm6.staticflickr.com/5549/10549981194_dda8617f7b_z.jpg" alt="IMG_2801" /></a></p>

<p>聖托里尼，人超多的！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10549989724/"><img src="http://farm3.staticflickr.com/2824/10549989724_a15f461ae2_z.jpg" alt="IMG_2809" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549958066/"><img src="http://farm6.staticflickr.com/5495/10549958066_7d6c47ccd3_z.jpg" alt="IMG_2812" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549961496/"><img src="http://farm6.staticflickr.com/5475/10549961496_ec15c88d6d_z.jpg" alt="IMG_2813" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549966366/"><img src="http://farm6.staticflickr.com/5489/10549966366_773f5194b3_z.jpg" alt="IMG_2814" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549974486/"><img src="http://farm4.staticflickr.com/3751/10549974486_72ac24141d_z.jpg" alt="IMG_2816" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549973395/"><img src="http://farm8.staticflickr.com/7401/10549973395_052ca9d541_z.jpg" alt="IMG_2819" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549989115/"><img src="http://farm8.staticflickr.com/7419/10549989115_1d31fef4fc_z.jpg" alt="IMG_2824" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550065994/"><img src="http://farm8.staticflickr.com/7298/10550065994_9786f0bb56_z.jpg" alt="IMG_2832" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550014615/"><img src="http://farm3.staticflickr.com/2872/10550014615_bdda66160f_z.jpg" alt="IMG_2833" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550268323/"><img src="http://farm8.staticflickr.com/7337/10550268323_669d984ef0_z.jpg" alt="IMG_2834" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550021405/"><img src="http://farm3.staticflickr.com/2857/10550021405_c2237abe55_z.jpg" alt="IMG_2835" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550085124/"><img src="http://farm4.staticflickr.com/3782/10550085124_b4fe1fd23e_z.jpg" alt="IMG_2837" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550284333/"><img src="http://farm6.staticflickr.com/5504/10550284333_9a44b230f9_z.jpg" alt="IMG_2838" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550096654/"><img src="http://farm6.staticflickr.com/5498/10550096654_3a902c8b73_z.jpg" alt="IMG_2840" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550055956/"><img src="http://farm3.staticflickr.com/2816/10550055956_c5cf163906_z.jpg" alt="IMG_2841" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550114274/"><img src="http://farm8.staticflickr.com/7315/10550114274_20a5d3567b_z.jpg" alt="IMG_2846" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550065235/"><img src="http://farm4.staticflickr.com/3671/10550065235_d3920dcca3_z.jpg" alt="IMG_2851" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550324903/"><img src="http://farm6.staticflickr.com/5508/10550324903_d42ebf91d4_z.jpg" alt="IMG_2859" /></a></p>

<p>愛與希望之宮！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10550134304/"><img src="http://farm3.staticflickr.com/2862/10550134304_23c93de9e7_z.jpg" alt="IMG_2860" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550099576/"><img src="http://farm4.staticflickr.com/3768/10550099576_c8f90c2d91_z.jpg" alt="IMG_2862" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550100975/"><img src="http://farm4.staticflickr.com/3769/10550100975_565697cf8d_z.jpg" alt="IMG_2868" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550109515/"><img src="http://farm6.staticflickr.com/5487/10550109515_ac5085f6f4_z.jpg" alt="IMG_2872" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550114205/"><img src="http://farm4.staticflickr.com/3755/10550114205_8864b8a1a1_z.jpg" alt="IMG_2875" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550190744/"><img src="http://farm8.staticflickr.com/7445/10550190744_2a0be68cc0_z.jpg" alt="IMG_2889" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550389973/"><img src="http://farm3.staticflickr.com/2846/10550389973_010c765183_z.jpg" alt="IMG_2894" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550154636/"><img src="http://farm3.staticflickr.com/2864/10550154636_13ee05a392_z.jpg" alt="IMG_2896" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550402403/"><img src="http://farm8.staticflickr.com/7327/10550402403_177f82dd66_z.jpg" alt="IMG_2902" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550405003/"><img src="http://farm6.staticflickr.com/5489/10550405003_4d5a852957_z.jpg" alt="IMG_2903" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550409163/"><img src="http://farm8.staticflickr.com/7376/10550409163_34cb1ac757_z.jpg" alt="IMG_2904" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550216444/"><img src="http://farm6.staticflickr.com/5507/10550216444_3aa3ba697f_z.jpg" alt="IMG_2907" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550221744/"><img src="http://farm4.staticflickr.com/3829/10550221744_5f6722c235_z.jpg" alt="IMG_2908" /></a></p>

<p>華新車站！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10550177485/"><img src="http://farm3.staticflickr.com/2817/10550177485_0a6af28d87_z.jpg" alt="IMG_2911" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550187265/"><img src="http://farm8.staticflickr.com/7323/10550187265_eb10b5b874_z.jpg" alt="IMG_2913" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550200475/"><img src="http://farm4.staticflickr.com/3744/10550200475_18cc5b9f7f_z.jpg" alt="IMG_2916" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550216596/"><img src="http://farm8.staticflickr.com/7443/10550216596_3a8a44055a_z.jpg" alt="IMG_2917" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550209345/"><img src="http://farm6.staticflickr.com/5530/10550209345_d9d024b291_z.jpg" alt="IMG_2918" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550462523/"><img src="http://farm4.staticflickr.com/3720/10550462523_7a3597dc5f_z.jpg" alt="IMG_2919" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550233286/"><img src="http://farm4.staticflickr.com/3784/10550233286_4dd88efa6a_z.jpg" alt="IMG_2921" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550279524/"><img src="http://farm8.staticflickr.com/7367/10550279524_d1f64edf27_z.jpg" alt="IMG_2922" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10549516894/"><img src="http://farm8.staticflickr.com/7400/10549516894_23bed10b36_z.jpg" alt="IMG_2924" /></a></p>

<p>從華新回程的時候去的一個創意市集！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10550483643/"><img src="http://farm6.staticflickr.com/5481/10550483643_d52865c58d_z.jpg" alt="IMG_2925" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550486563/"><img src="http://farm4.staticflickr.com/3691/10550486563_6cb8ae70f5_z.jpg" alt="IMG_2928" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550495343/"><img src="http://farm6.staticflickr.com/5523/10550495343_fc786e1ae2_z.jpg" alt="IMG_2930" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550251535/"><img src="http://farm8.staticflickr.com/7408/10550251535_ab31aa5759_z.jpg" alt="IMG_2932" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550311144/"><img src="http://farm6.staticflickr.com/5477/10550311144_b228a283b0_z.jpg" alt="IMG_2933" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550322314/"><img src="http://farm3.staticflickr.com/2872/10550322314_82f99f2bd6_z.jpg" alt="IMG_2937" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550529253/"><img src="http://farm3.staticflickr.com/2859/10550529253_6cceb8276a_z.jpg" alt="IMG_2939" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550343024/"><img src="http://farm8.staticflickr.com/7354/10550343024_730bfa1318_z.jpg" alt="IMG_2941" /></a></p>

<p><a href="http://www.flickr.com/photos/hinablue/10550298735/"><img src="http://farm8.staticflickr.com/7445/10550298735_6b347531cb_z.jpg" alt="IMG_2943" /></a></p>

<p>最後，我們在當地認識的導遊帶我們去吃好料！</p>

<p><a href="http://www.flickr.com/photos/hinablue/10550327966/"><img src="http://farm4.staticflickr.com/3784/10550327966_dfd29e1d47_z.jpg" alt="IMG_2948" /></a></p>

<h3>行程簡介</h3>

<p>我們這次出發是從香港轉機再飛曼谷，原因無他，因為機票實在太難買（因為我們是中秋連假去的（你知道的，所以，我們這次是搭港龍航空來回，我只能說，港龍的飛機餐好難吃啊 Orz&hellip; 不知道是不合胃口還是怎樣，我覺得不好吃啊啊啊啊啊（但是我朋友說很好吃？！是我舌頭壞掉嗎 T_T</p>

<p>回程就更妙了，因為當天剛好有颱風經過香港，所以港龍航空早上香港轉機的班機全面停飛（驚悚！害我們差點就在泰國多留兩天（可惜！最後是大概接近 12 點才可以 check-in，我們的班機是 12:40，然後登機門在 G gate，有去過蘇凡納布機場的就知道 G gate 有多遠（天殺的超遠！</p>

<h4>Day 1</h4>

<ul>
<li> Chit Lom 站換錢</li>
<li> 海南雞飯，水門市場</li>
<li> Terminal 21 晚餐吃 Nara</li>
</ul>


<h4>Day 2</h4>

<ul>
<li> 禪 SPA</li>
<li> 搭捷運轉計程車去小歐洲 The Circle</li>
<li> 另一批人馬去臥佛寺按摩，我跟女友則是去逛水族館</li>
<li> ASIATIQUE THE RIVERFRONT 碼頭夜市</li>
</ul>


<h4>Day 3</h4>

<ul>
<li> Terminal 21 逛百貨公司逛斷腿</li>
<li> 逛暹羅商圈</li>
</ul>


<h4>Day 4</h4>

<ul>
<li> 大林江水上市場</li>
<li> 洽圖洽</li>
</ul>


<h4>Day 5</h4>

<ul>
<li> 考汪宮</li>
<li> Premium Outlet + 午餐</li>
<li> Santorini Park</li>
<li> 愛與希望之宮</li>
<li> 華欣火車站</li>
<li> CICADA 創意夜市</li>
<li> Chao Lay 海邊餐廳用餐</li>
</ul>


<p>大概就是這樣，我<a href="http://blog.hinablue.me/categories/thailand/">去年的自由行</a>也可以參考一下，圖多慎入噢（啾咪</p>
]]></content>
  </entry>
  
</feed>
