国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JavaScript 編程精解 中文第三版 十九、項目:像素藝術編輯器

Meils / 3565人閱讀

摘要:相反,當響應指針事件時,它會調用創建它的代碼提供的回調函數,該函數將處理應用的特定部分。回調函數可能會返回另一個回調函數,以便在按下按鈕并且將指針移動到另一個像素時得到通知。它們為組件構造器的數組而提供。

來源:ApacheCN『JavaScript 編程精解 中文第三版』翻譯項目

原文:Project: A Pixel Art Editor

譯者:飛龍

協議:CC BY-NC-SA 4.0

自豪地采用谷歌翻譯

我看著眼前的許多顏色。 我看著我的空白畫布。 然后,我嘗試使用顏色,就像形成詩歌的詞語,就像塑造音樂的音符。

Joan Miro

前面幾章的內容為你提供了構建基本的 Web 應用所需的所有元素。 在本章中,我們將實現一個。

我們的應用將是像素繪圖程序,你可以通過操縱放大視圖(正方形彩色網格),來逐像素修改圖像。 你可以使用它來打開圖像文件,用鼠標或其他指針設備在它們上面涂畫并保存。 這是它的樣子:

在電腦上繪畫很棒。 你不需要擔心材料,技能或天賦。 你只需要開始涂畫。

組件

應用的界面在頂部顯示大的元素,在它下面有許多表單字段。 用戶通過從字段。 當前選擇的工具決定了,當用戶使用指針設備與圖片交互時,發生的事情。 它們作為一個對象而提供,該對象將出現在下拉字段中的名稱,映射到實現這些工具的函數。 這個函數接受圖片位置,當前應用狀態和dispatch函數作為參數。 它們可能會返回一個移動處理器,當指針移動到另一個像素時,使用新位置和當前狀態調用該函數。

class PixelEditor {
  constructor(state, config) {
    let {tools, controls, dispatch} = config;
    this.state = state;

    this.canvas = new PictureCanvas(state.picture, pos => {
      let tool = tools[this.state.tool];
      let onMove = tool(pos, this.state, dispatch);
      if (onMove) return pos => onMove(pos, this.state);
    });
    this.controls = controls.map(
      Control => new Control(state, config));
    this.dom = elt("div", {}, this.canvas.dom, elt("br"),
                   ...this.controls.reduce(
                     (a, c) => a.concat(" ", c.dom), []));
  }
  setState(state) {
    this.state = state;
    this.canvas.setState(state.picture);
    for (let ctrl of this.controls) ctrl.setState(state);
  }
}

指定給PictureCanvas的指針處理器,使用適當的參數調用當前選定的工具,如果返回了移動處理器,使其也接收狀態。

所有控件在this.controls中構造并存儲,以便在應用狀態更改時更新它們。 reduce的調用會在控件的 DOM 元素之間引入空格。 這樣他們看起來并不那么密集。

第一個控件是工具選擇菜單。 它創建