亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > JavaScript > 正文

今天,小程序正式支持 SVG

2019-11-19 11:44:32
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

今天,小程序正式支持 SVG

寫在前面

經(jīng)過(guò)騰訊 Omi 團(tuán)隊(duì)的努力,今天你可以在小程序中使用 Cax 引擎高性能渲染 SVG!

SVG 是可縮放矢量圖形(Scalable Vector Graphics),基于可擴(kuò)展標(biāo)記語(yǔ)言,用于描述二維矢量圖形的一種圖形格式。它由萬(wàn)維網(wǎng)聯(lián)盟制定,是一個(gè)開(kāi)放標(biāo)準(zhǔn)。SVG 的優(yōu)勢(shì)有很多:

  1. SVG 使用 XML 格式定義圖形,可通過(guò)文本編輯器來(lái)創(chuàng)建和修改
  2. SVG 圖像可被搜索、索引、腳本化或壓縮
  3. SVG 是可伸縮的,且放大圖片質(zhì)量不下降
  4. SVG 圖像可在任何的分辨率下被高質(zhì)量地打印
  5. SVG 可被非常多的工具讀取和修改(比如記事本)
  6. SVG 與 JPEG 和 GIF 圖像比起來(lái),尺寸更小,且可壓縮性、可編程星更強(qiáng)
  7. SVG 完全支持 DOM 編程,具有交互性和動(dòng)態(tài)性

而支持上面這些優(yōu)秀特性的前提是 - 需要支持 SVG 標(biāo)簽。比如在小程序中直接寫:

<svg width="300" height="150"> <rect bindtap="tapHandler" height="100" width="100" style="stroke:#ff0000; fill: #0000ff"> </rect></svg>

上面定義了 SVG 的結(jié)構(gòu)、樣式和點(diǎn)擊行為。但是小程序目前不支持 SVG 標(biāo)簽,僅僅支持加載 SVG 之后 作為 background-image 進(jìn)行展示,如 background-image: url("data:image/svg+xml.......),或者 base64 后作為 background-image 的 url。

那么怎么辦呢?有沒(méi)有辦法讓小程序支持 SVG? 答案是有的!需要下面這些東西(站在巨人的肩膀上):

  1. JSX,史上最強(qiáng) UI 表達(dá)式,支持書(shū)寫 XML-Hyperscript 互轉(zhuǎn)的 JS 語(yǔ)言
  2. 小程序內(nèi)置 Canvas 渲染器
  3. Cax 最新渲染引擎
  4. HTM,Hyperscript Tagged Markup,可能是 JSX 的替代品或者另一種選擇,使用ES標(biāo)準(zhǔn)的模板語(yǔ)法實(shí)現(xiàn)的 Hyperscript 運(yùn)行時(shí)/編譯時(shí)生成,preact 作者(也是google工程師)打造

這里稍微解釋下 Hyperscript:

比如 JSX 中的

<div> Hello {this.props.name}</div>

或者 js 中的 htm:

html`<div> Hello {this.props.name}</div>`

最后都會(huì)被編譯成:

h( "div", null, "Hello ", this.props.name);

嵌套的 div 也會(huì)變編譯成 h 嵌套 h,比如

<div> <div>abc</div></div>

編譯后:

h( "div", null, h( "div", null, "abc" ))

而 h 函數(shù)的定義也是相當(dāng)簡(jiǎn)潔:

function h(type, props, ...children) { return { type, props, children }}

通過(guò) h 的執(zhí)行可以 js 中拿到結(jié)構(gòu)化的數(shù)據(jù),也就是所謂的虛擬 dom。需要注意的是 htm 有輕微的運(yùn)行時(shí)開(kāi)銷,jsx 沒(méi)有。

一句話總結(jié):

使用小程序內(nèi)置的 Canvas 渲染器, 在 Cax 中實(shí)現(xiàn) SVG 標(biāo)準(zhǔn)的子集,使用 JSX 或者 HTM 描述 SVG 結(jié)構(gòu)行為表現(xiàn)

直接看在小程序種使用案例:

import { html, renderSVG } from '../../cax/cax'Page({ onLoad: function () { renderSVG(html`<svg width="300" height="220"> <rect bindtap="tapHandler" height="110" width="110" style="stroke:#ff0000; fill: #ccccff" transform="translate(100 50) rotate(45 50 50)"> </rect></svg>`, 'svg-a', this) }, tapHandler: function () { console.log('你點(diǎn)擊了 rect') }})

其中的 svg-a 對(duì)應(yīng)著 wxml 里 cax-element 的 id:

<view class="container"> <cax-element id="svg-c"></cax-element></view>

聲明組件依賴

{ "usingComponents": { "cax-element":"../../cax/index" }}

小程序中顯示效果:

可以使用 width,height,bounds-x 和 bounds-y 設(shè)置綁定事件的范圍,比如:

<path width="100" height="100" bounds-x="50" bounds-y="50" />

 需要注意的是,元素的事件觸發(fā)的包圍盒受自身或者父節(jié)點(diǎn)的 transform 影響,所以不是絕對(duì)坐標(biāo)的 rect 觸發(fā)區(qū)域。

再來(lái)一個(gè)復(fù)雜的例子,用 SVG 繪制 Omi 的 logo:

renderSVG(html`<svg width="300" height="220"> <g transform="translate(50,10) scale(0.2 0.2)"> <circle fill="#07C160" cx="512" cy="512" r="512"/> <polygon fill="white" points="159.97,807.8 338.71,532.42 509.9,829.62 519.41,829.62 678.85,536.47 864.03,807.8 739.83,194.38 729.2,194.38 517.73,581.23 293.54,194.38 283.33,194.38 "/> <circle fill="white" cx="839.36" cy="242.47" r="50"/> </g></svg>`, 'svg-a', this)

小程序種顯示效果:

在 omip 和 mps 當(dāng)中使用 cax 渲染 svg,你可以不用使用 htm。比如在 omip 中實(shí)現(xiàn)上面兩個(gè)例子:

 renderSVG(<svg width="300" height="220"> <rect bindtap="tapHandler" height="110" width="110" style="stroke:#ff0000; fill: #ccccff" transform="translate(100 50) rotate(45 50 50)"> </rect></svg>, 'svg-a', this.$scope)
renderSVG(<svg width="300" height="220"> <g transform="translate(50,10) scale(0.2 0.2)"> <circle fill="#07C160" cx="512" cy="512" r="512"/> <polygon fill="white" points="159.97,807.8 338.71,532.42 509.9,829.62 519.41,829.62 678.85,536.47 864.03,807.8 739.83,194.38 729.2,194.38 517.73,581.23 293.54,194.38 283.33,194.38 "/> <circle fill="white" cx="839.36" cy="242.47" r="50"/> </g></svg>, 'svg-a', this.$scope)

 需要注意的是在 omip 中傳遞的最后一個(gè)參數(shù)不是 this,而是 this.$scope。

在 mps 中,更加徹底,你可以單獨(dú)創(chuàng)建 svg 文件,通過(guò) import 導(dǎo)入。

//注意這里不能寫 test.svg,因?yàn)?mps 會(huì)把 test.svg 編譯成 test.js import testSVG from '../../svg/test'import { renderSVG } from '../../cax/cax'Page({ tapHandler: function(){ this.pause = !this.pause }, onLoad: function () { renderSVG(testSVG, 'svg-a', this) }})

比如 test.svg :

<svg width="300" height="300"> <rect bindtap="tapHandler" x="0" y="0" height="110" width="110"   style="stroke:#ff0000; fill: #0000ff" /></svg>

會(huì)被 mps 編譯成:

const h = (type, props, ...children) => ({ type, props, children });export default h( "svg", { width: "300", height: "300" }, h("rect", { bindtap: "tapHandler", x: "0", y: "0", height: "110", width: "110", style: "stroke:#ff0000; fill: #0000ff" }));。

所以總結(jié)一下:

  1. 你可以在 mps 中直接使用 import 的 SVG 文件的方式使用 SVG
  2. 你可以直接在 omip 中使用 JSX 的使用 SVG
  3. 你可以直接在原生小程序當(dāng)中使用 htm 的方式使用 SVG

這就完了?遠(yuǎn)沒(méi)有,看 cax 在小程序中的這個(gè)例子:

詳細(xì)代碼:

renderSVG(html`<svg width="300" height="200"> <path d="M 256,213 C 245,181 206,187 234,262 147,181 169,71.2 233,18 220,56 235,81 283,88 285,78.7 286,69.3 288,60 289,61.3 290,62.7 291,64 291,64 297,63 300,63 303,63 309,64 309,64 310,62.7 311,61.3 312,60 314,69.3 315,78.7 317,88 365,82 380,56 367,18 431,71 453,181 366,262 394,187 356,181 344,213 328,185 309,184 300,284 291,184 272,185 256,213 Z" style="stroke:#ff0000; fill: black"> <animate dur="32s" repeatCount="indefinite" attributeName="d" values="......太長(zhǎng),這里省略 paths........" /> </path></svg>`, 'svg-c', this)

再試試著名的 SVG 老虎:

path 太長(zhǎng),就不貼代碼了,可以點(diǎn)擊這里查看

就這么多?未完待續(xù)...,后續(xù)補(bǔ)充:

pasiton 標(biāo)簽

import { html, renderSVG } from '../../cax/cax'Page({ onLoad: function () { const svg = renderSVG(html`<svg width="200" height="200"> <pasition duration="200" bindtap=${this.changePath} width="100" height="100" from="M28.228,23.986L47.092,5.122c1.172-1.171,1.172-3.071,0-4.242c-1.172-1.172-3.07-1.172-4.242,0L23.986,19.744L5.121,0.88		c-1.172-1.172-3.07-1.172-4.242,0c-1.172,1.171-1.172,3.071,0,4.242l18.865,18.864L0.879,42.85c-1.172,1.171-1.172,3.071,0,4.242		C1.465,47.677,2.233,47.97,3,47.97s1.535-0.293,2.121-0.879l18.865-18.864L42.85,47.091c0.586,0.586,1.354,0.879,2.121,0.879		s1.535-0.293,2.121-0.879c1.172-1.171,1.172-3.071,0-4.242L28.228,23.986z" to="M49.1 23.5H2.1C0.9 23.5 0 24.5 0 25.6s0.9 2.1 2.1 2.1h47c1.1 0 2.1-0.9 2.1-2.1C51.2 24.5 50.3 23.5 49.1 23.5zM49.1 7.8H2.1C0.9 7.8 0 8.8 0 9.9c0 1.1 0.9 2.1 2.1 2.1h47c1.1 0 2.1-0.9 2.1-2.1C51.2 8.8 50.3 7.8 49.1 7.8zM49.1 39.2H2.1C0.9 39.2 0 40.1 0 41.3s0.9 2.1 2.1 2.1h47c1.1 0 2.1-0.9 2.1-2.1S50.3 39.2 49.1 39.2z" from-stroke="red" to-stroke="green" from-fill="blue" to-fill="red" stroke-width="2" /></svg>`, 'svg-c', this) this.pasitionElement = svg.children[0] }, changePath: function () { this.pasitionElement.toggle() }})

pasiton 提供了兩個(gè) path 和 顏色 相互切換的能力,最常見(jiàn)的場(chǎng)景比如 menu 按鈕和 close 按鈕點(diǎn)擊后 path 的變形。

舉個(gè)例子,看顏色和 path 同時(shí)變化:

線性運(yùn)動(dòng)

這里舉一個(gè)在 mps 中使用 SVG 的案例:

import { renderSVG, To } from '../../cax/cax'Page({ tapHandler: function(){ this.pause = !this.pause }, onLoad: function () { const svg = renderSVG(html` <svg width="300" height="300">  <rect bindtap="tapHandler" x="0" y="0" height="110" width="110"   style="stroke:#ff0000; fill: #0000ff" /> </svg>` , 'svg-a', this) const rect = svg.children[0] rect.originX = rect.width/2 rect.originY = rect.height/2 rect.x = svg.stage.width/2 rect.y = svg.stage.height/2 this.pause = false this.interval = setInterval(()=>{  if(!this.pause){  rect.rotation++  svg.stage.update()  } },15)})

效果如下:

組合運(yùn)動(dòng)

import { renderSVG, To } from '../../cax/cax'Page({ onLoad: function () {  const svg = renderSVG(html`  <svg width="300" height="300">   <rect bindtap="tapHandler" x="0" y="0" height="110" width="110"      style="stroke:#ff0000; fill: #0000ff" />  </svg>`  ,'svg-a', this)  const rect = svg.children[0]  rect.originX = rect.width/2  rect.originY = rect.height  rect.x = svg.stage.width/2  rect.y = svg.stage.height/2  var sineInOut = To.easing.sinusoidalInOut  To.get(rect)    .to().scaleY(0.8, 450, sineInOut).skewX(20, 900, sineInOut)    .wait(900)    .cycle().start()  To.get(rect)    .wait(450)    .to().scaleY(1, 450, sineInOut)    .wait(900)    .cycle().start()  To.get(rect)    .wait(900)    .to().scaleY(0.8, 450, sineInOut).skewX(-20, 900, sineInOut)    .cycle()    .start()  To.get(rect)    .wait(1350)    .to().scaleY(1, 450, sineInOut)    .cycle()    .start()   setInterval(() => {     rect.stage.update()   }, 16) }})

效果如下:

其他

vscode 安裝 lit-html 插件使 htm 的 html內(nèi)容 高亮

還希望小程序 SVG 提供什么功能可以開(kāi) issues告訴我們,評(píng)估后通過(guò),我們?nèi)?shí)現(xiàn)!

Cax SVG Github

參考文檔

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
男人添女人下部高潮视频在线观看| 美女视频亚洲色图| 久久久亚洲影院你懂的| 免费看男男www网站入口在线| 妺妺窝人体色777777| 亚洲一区二区在线免费看| 色爱区成人综合网| 天堂中文资源在线观看| 激情欧美日韩一区二区| 黄色片在线免费观看| 精品久久亚洲一级α| 精品亚洲一区二区三区四区五区| 天天干天天做天天操| 国产三级做爰高清在线| 国产精品久久久久久久久婷婷| 屁屁影院国产第一页| 奇米色一区二区| 91九色丨porny丨极品女神| 青青草影院在线观看| 久久国产欧美| 北条麻妃99精品青青久久| 永久免费无码av网站在线观看| 2014国产精品| 91www成人久久| 色哟哟精品丝袜一区二区| 成熟丰满熟妇高潮xxxxx视频| 亚洲日本欧美日韩高观看| 丝袜在线视频| 热久久这里只有精品| 91精品精品| 欧美亚洲一区在线| 黄色网址三级| 精品国产一区二区三区av性色| 好看的日韩精品视频在线| 国产精品一区二区三区免费| 2024国产精品视频| 国产97色在线|日韩| 亚洲欧美精品suv| 日韩一区二区在线免费| 永久免费精品视频网站| 久草在线看片| 亚洲网站在线观看| 色www亚洲国产阿娇yao| 五月婷婷色综合| 一区二区三区四区五区在线| 大胸美女被爆操| 日韩小视频在线观看专区| 国产成人午夜高潮毛片| 欧美黑人疯狂性受xxxxx野外| 天天做天天爱天天高潮| 成年人晚上看的视频| 国内精品**久久毛片app| 影音先锋在线国产| 极品粉嫩小仙女高潮喷水久久| 韩国三级av在线免费观看| 一区二区三区欧洲区| 久久免费高清视频| 国产无遮挡又黄又爽免费网站| 亚洲桃色在线一区| 91麻豆精品国产91久久久平台| 亚洲午夜一级| 免费看欧美黑人毛片| 欧美视频在线观看视频| 国产伦精品一区二区三区免费| 高清一级毛片视频| xxxx18hd亚洲hd捆绑| caoporn国产一区二区| 日韩av片专区| 国产视频综合在线| 国产免费视频在线| 亚洲精品一区二区精华| 天堂资源在线亚洲资源| 日韩片欧美片| 精品嫩模一区二区三区| 国产精品一区牛牛影视| 国产在线视视频有精品| 成人免费小视频| 一区二区三区不卡在线观看| 日本综合精品一区| 美女福利视频导航| 久久久亚洲av波多野结衣| 亚洲综合国产激情另类一区| 国产成+人+综合+亚洲欧洲| 可以在线看的av| 欧美激情一二区| av综合在线观看| 天堂а√在线中文在线鲁大师| 天堂av资源在线| 亚洲日本在线视频观看| 久久免费99精品久久久久久| 中文一区一区三区免费| 红桃一区二区三区| 综合另类专区| 水野朝阳av一区二区三区| 一区二区三区精品在线观看| 蜜桃av免费在线观看| 亚洲欧洲精品一区| 啊啊啊啊啊好爽| 国产cdts系列另类在线观看| 久久成人亚洲精品| 国产情侣av在线| h小视频在线观看网| 亚洲成年网站在线观看| 麻豆免费网站| 日本老熟妇毛茸茸| 欧美性猛片xxxx免费看久爱| 国内精品**久久毛片app| 亚洲线精品一区二区三区八戒| 亚洲色图.com| 亚洲午夜在线| 精品国产乱码久久久久久浪潮| 一本岛在免费一二三区| 日韩影院精彩在线| 亚洲综合资源| 久久久久影视| 亚洲小说区图片区| 在线视频中文亚洲| 日韩电影免费观看在线观看| 久久精品在线免费观看| 99精品全国免费观看| 亚洲欧美偷拍三级| 免费xxxxx网站中文字幕| 国产主播福利| ed2k情侣啪啪91av| 影音先锋中文字幕第一页| 亚洲美女少妇撒尿| 91精品婷婷国产综合久久竹菊| 久久免费精彩视频| 中文字幕中文字幕一区二区| 欧美激情精品久久久久久小说| 久久se精品一区精品二区| 欧美午夜一区| 91精品国产综合久久香蕉麻豆| 亚洲福利合集| 日本一区二区三区四区| av毛片在线| 鲁一鲁一鲁一鲁一澡| 日韩视频免费观看高清完整版在线观看| 日韩中文字幕视频网| 久草这里只有精品视频| 蜜桃精品一区二区| 福利片在线看| 日本不卡一区在线| 在线观看视频一区二区欧美日韩| 国产精品成人自拍| 国产成+人+综合+亚洲欧洲| 动漫美女被爆操久久久| 欧美电影免费| 中文字幕亚洲图片| 中文字幕一区日韩电影| 波多野结衣啪啪| 午夜精品久久久久久久蜜桃| 伊人亚洲综合网| 欧美日韩精品久久| 欧美综合二区| 久久久一本二本三本| 祥仔av免费一区二区三区四区| 五月婷婷激情五月| 色综合久久88色综合天天提莫| 日本综合久久| 成人国产精品免费视频| 一区二区三区精品久久久| 中文字幕第17页| 在这里有精品| 国产激情一区二区三区四区| 国产精品久久久久av| 国产又粗又长又大视频| 在线观看日韩精品视频| 亚洲欧美日韩动漫| 视频一区国产| 性一交一乱一色一视频麻豆| 宅男深夜视频| www.色播.com| 午夜国产精品一区| 麻豆福利在线观看| 国产精品小说在线| 亚洲精品一区二区三区区别| 国产91在线看| 亚洲小说欧美另类激情| 欧洲免费在线视频| 日韩片电影在线免费观看| 91美女在线视频| 久久狠狠高潮亚洲精品| 国产精品高清无码| 日韩在线视频中文字幕| 91网址在线观看| 欧美一区二视频在线免费观看| 久久久免费看片| 日韩综合第一页| 亚洲精品555| 中文字幕一区二区视频| 欧美精品一区二区三区视频| 洋洋av久久久久久久一区| www污网站在线观看| 久久精品免费| 国产精品男女视频| 午夜精品视频在线| 9久草视频在线视频精品| 国产欧美精品一区二区三区-老狼| 国产小视频免费| 成人精品影视| 日本黄色片免费观看| 老司机深夜福利在线观看| 日韩精品一区二区久久| 色狠狠久久av五月综合|| www.日韩在线观看| 亚洲天堂av老司机| jizzjizzjizzjizzjizzjizzjizz| 91在线丨porny丨国产| 警花观音坐莲激情销魂小说| 精品日韩免费| 依依综合在线| 欧美色婷婷天堂网站| 五月婷婷一区二区三区| 美国成人xxx| 国产成人av一区二区三区不卡| 亚洲国产成人影院播放| 日本妇乱大交xxxxx| 日韩美女中文字幕| 西瓜成人精品人成网站| 亚洲欧美日本另类| 英国三级经典在线观看| 先锋成人影音| 福利小视频网站| 精品一区二区三区四区五区| 97在线公开视频| 国内久久婷婷综合| 国产欧美久久久久久久久| 久久99亚洲网美利坚合众国| 亚洲四虎影院| 国产精品一区二区你懂的| 精品国产一区二区三区久久狼5月| 综合国产在线观看| 亚洲欧美日韩中文在线| 成久久久网站| 精品一区二区在线看| 久久综合久久99| 91在线视频精品| 另类av导航| www.美色吧.com| 国产精品三级在线观看无码| 羞羞漫画网18久久app| 亚洲中文一区二区三区| 成人免费高清在线播放| 中国毛片在线观看| 亚洲人成电影网站色…| 欧美性潮喷xxxxx免费视频看| 成人动漫一区二区| 中文在线最新版天堂8| 亚洲第一成年免费网站| 1024在线播放| 一本到三区不卡视频| 久久久久福利视频| 国产精品麻豆欧美日韩ww| 91亚洲欧美激情| 激情另类小说区图片区视频区| 国产精品一二三产区| 欧美亚视频在线中文字幕免费| 青草视频在线播放| 最新版天堂中文在线官网| 欧美美女网站色| 黄色小视频免费| 夜色资源站国产www在线视频| 欧美大片网站| 成人av网在线| 国产成人久久777777| 国产aⅴ夜夜欢一区二区三区| 欧美草逼视频| 国产成人高清激情视频在线观看| 草草影院第一页| 欧美极品在线| 日韩欧美亚洲精品| 日韩在线第三页| 久久久久久久久成人| 色综合色综合网色综合| 国产精品美女久久久久久久| 91在线精品视频| 欧美丝袜自拍制服另类| 久久精品99国产精品日本| 91成人免费| 91亚洲精品视频在线观看| 日韩欧美亚洲国产精品字幕久久久| 国产 欧美 日韩 在线| 亚洲欧美乱综合图片区小说区| 国产精品永久免费| 九九综合九九| brazzers在线观看| 成人免费网站视频| 狠狠操视频网站| 99视频免费播放| 一路向西2在线观看| 91极品尤物在线播放国产| 九九九热精品免费视频观看网站| 最新二区三区av| 成人中文字幕在线| 高清一区二区中文字幕| 97精品国产露脸对白| 国产高清视频一区三区| 一区二区激情| 在线影院国内精品| 国精产品一区一区三区mba桃花| 五月婷婷综合在线| 91精品国产乱码久久| 亚洲成人在线观看视频| 国产日韩欧美在线观看视频| 日韩中文字幕亚洲一区二区va在线| av毛片在线免费看| 日韩69视频在线观看| 国产日韩欧美二区| 日韩在线观看精品| 精品国产午夜肉伦伦影院| 国产校园另类小说区| 亚洲精品在线播放| 1024精品一区二区三区| 欧美性猛交ⅹxxx乱大交免费| 欧美熟妇另类久久久久久多毛| 黄瓜视频成人app免费| www.天天操.com| 成人mm视频在线观看| 操bbb操bbb| 杨幂一区二区三区免费看视频| 久久久国产一区| 日韩一二三区在线观看| 图片婷婷一区| 69堂精品视频在线播放| 日本免费黄视频| 黄色免费高清视频| 最近中文字幕免费mv2018在线|