成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

圖形編輯器開發(fā):屬性顯示與格式轉(zhuǎn)換

開發(fā) 前端
圖形編輯器中的數(shù)據(jù),通過 UI 層進行展示時,可能不會直接將數(shù)據(jù)源的原始值展示出來,而是會額外進行單位的轉(zhuǎn)換,變成另一種格式。

大家好,我是前端西瓜哥。

今天簡單講講圖形編輯器的顯示屬性值時,會遇到的格式轉(zhuǎn)換問題。

編輯器 github 地址:

https://github.com/F-star/suika

線上體驗:

https://blog.fstars.wang/app/suika/

單位轉(zhuǎn)換

圖形編輯器中的數(shù)據(jù),通過 UI 層進行展示時,可能不會直接將數(shù)據(jù)源的原始值展示出來,而是會額外進行單位的轉(zhuǎn)換,變成另一種格式。

這里以簡單而常見的弧度為例。

圖形的旋轉(zhuǎn)在數(shù)據(jù)源中,會用弧度(radian)表示。因為弧度更適合進行數(shù)學(xué)計算,且很多 API 比如 Math.sin(x) 都需要你提供弧度。

但在面向用戶的 UI 層,我們通常會提供角度(degree),因為日常生活中人們更常使用,它更直觀。

但數(shù)據(jù)中我們還是要保存弧度的。

轉(zhuǎn)換算法

我們需要明確的點是:

  • 數(shù)據(jù)源要用唯一格式,這樣可以確保運算邏輯的一致性。比如旋轉(zhuǎn)不建議即可以保存弧度,也可以保存角度。另外,盡量選擇精度高的。
  • 如果有顯示另一種格式的需求,你需要實現(xiàn)源格式轉(zhuǎn)其他格式算法。比如弧度轉(zhuǎn)角度顯示到用戶界面上;
  • 如果有修改其他格式然后修改源數(shù)據(jù)的需求,你需要實現(xiàn)其他格式轉(zhuǎn)源數(shù)據(jù)的算法。
/**
 * 弧度轉(zhuǎn)角度
 */
export function radian2Degree(radian: number) {
  return (radian * 180) / Math.PI;
}

/**
 * 角度轉(zhuǎn)弧度
 */
export function degree2Radian(degree: number) {
  return (degree * Math.PI) / 180;
}

需要注意,格式的轉(zhuǎn)換通常會丟失一些精度的。

這里弧度和角度的轉(zhuǎn)換就是一個例子。

圓周率是一個無限不循環(huán)小數(shù),計算的時候,會對其丟掉一些精度再參與計算,最后的結(jié)果自然也丟失了精度。

這里給一下 UI 層實現(xiàn)思路,以 React 組件為例,核心實現(xiàn)大致如下:

const [radian, setRadian] = useState(0);

useEffect(() => {
  rect.onRotationChange((val) => {
    // 從編輯器內(nèi)核同步過來的狀態(tài)
    setRadian(val);
  })
});

<NumberInput
  label="旋轉(zhuǎn)"
  value={remainDecimal(radian2Degree(radian))}
  onBlur={(e) => {
    const degree =  e.target.value;
    const radian = normalizeRadian(degree2Radian(degree));
    rect.setRotation(radian);
  }}
/>

題外話,UI 層會直接更新編輯器中的狀態(tài),成功更新后通過事件訂閱通知回 UI 層,同步狀態(tài)。

弧度還是比較簡單的場景。

像是復(fù)雜一點的屬性,比如顏色值,通常要實現(xiàn)一個比較完善的拾色器,要支持多種格式,如RGBA、HSL、CMYK 等等,要實現(xiàn)的方法就更復(fù)雜也更多。

降低顯示精度

UI 層不會顯示全精度,意義不大。

比如 x 坐標(biāo)的真實值是 52.24621202458749,但用戶是不希望看到這么長的值的,他只是想知道這個點大概在什么位置。

所以我們最好做一個四舍五入,比如保留有限的有效位顯示為 52.25。

需要注意的是,修改屬性值時不用做降低精度再轉(zhuǎn)為源格式,我們的數(shù)據(jù)源精度越高越好。

只在顯示時做降低精度。

檢驗和補正

因為涉及到用戶修改屬性值,所以我們需要對用戶的輸入值進行處理,嘗試得到一個合法值去修改屬性。

簡單的做法是 嚴格校驗,比如對于數(shù)字類型,出現(xiàn)非數(shù)字字符,就直接認為非法值。

稍微好一點的是從字符串中提取符合格式的部分。

更人性化的是猜測用戶想干嘛,做補全。比如對于 hex 格式的顏色值,用戶只輸入一個 3,我們給他補全為 33333。

最后

畫一張圖總結(jié)一下。

展示層可能和數(shù)據(jù)源的格式不同,顯示時要做格式轉(zhuǎn)換,然后降低精度,比如對于數(shù)字通常保留 1 到 5 個小數(shù)位就夠了。

修改非源格式要做校驗和補正,然后轉(zhuǎn)回數(shù)據(jù)源格式保存起來。保存成功后再把新值傳遞到 UI 層。

責(zé)任編輯:姜華 來源: 前端西瓜哥
相關(guān)推薦

2023-10-19 10:12:34

圖形編輯器開發(fā)縮放圖形

2023-09-07 08:24:35

圖形編輯器開發(fā)繪制圖形工具

2023-08-31 11:32:57

圖形編輯器contain

2023-09-26 07:39:21

2024-01-08 08:30:05

光標(biāo)圖形編輯器開發(fā)游標(biāo)

2023-09-11 09:02:31

圖形編輯器模塊間的通信

2023-08-28 08:10:50

Hex圖形編輯器

2023-10-08 08:11:40

圖形編輯器快捷鍵操作

2024-01-03 08:43:17

圖形編輯器旋轉(zhuǎn)控制點縮放控制點

2023-07-07 13:56:01

圖形編輯器畫布縮放

2025-02-05 12:01:35

屬性編輯器Web

2023-07-31 08:46:07

圖形編輯器圖形自動對齊

2023-02-06 16:59:57

Canvas編輯器

2023-04-07 08:02:30

圖形編輯器對齊功能

2023-01-18 08:30:40

圖形編輯器元素

2023-02-01 09:21:59

圖形編輯器標(biāo)尺

2023-06-12 08:22:56

圖形編輯器工具

2023-04-10 08:45:44

圖形編輯器排列移動功能

2023-05-09 08:15:32

圖形編輯器撤銷重做功能

2023-02-09 07:02:30

圖形編輯器修改圖形
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 亚洲精品九九 | 成人免费在线观看视频 | 欧美日韩专区 | 久久国产婷婷国产香蕉 | 一级黄色毛片免费 | 日韩欧美国产一区二区 | 久久久久久亚洲精品 | 亚洲性人人天天夜夜摸 | 国产午夜精品一区二区三区四区 | 精品在线一区二区三区 | av天天干| 国产日韩欧美一区二区 | 国产精品久久国产精品99 gif | 国产羞羞视频在线观看 | 日产精品久久久一区二区福利 | 成人永久免费视频 | 免费观看黄 | 九九久久精品 | 久久99精品久久久久久国产越南 | 久久99深爱久久99精品 | 天天色图 | 超碰男人天堂 | 精品美女久久久 | 国产欧美精品一区二区 | 男女国产网站 | 黄色大片免费网站 | 国产精品日日摸夜夜添夜夜av | 国产一区二区电影 | 狠狠躁躁夜夜躁波多野结依 | 午夜精品久久久久久久星辰影院 | 国产精品久久久久久久久久久久冷 | 亚洲区中文字幕 | av一级毛片 | 毛片视频网站 | 在线国产一区 | 亚洲一区二区国产 | 亚洲 中文 欧美 日韩 在线观看 | 欧美精品第一区 | 中文字幕在线视频免费视频 | 欧美成人精品 | 草草视频在线观看 |