浅谈sketch插件二
sketch是什么?
Sketch是 Mac系统才有的软件,可以理解为精简版的PS ,比PS更适合 UI设计,Sketch 插件开发的语言是类Javascript ,而 Sketchup是一款三维建模软件,一般用于建筑设计、景观设计还有游戏场景设计等,插件开发是用的 ruby语言。完成 sketch的插件开发指南这个系列,我也会开始写Sketchup插件开发指南
sketch的主要对象
所有的关于 sketch对象的操作,都是通过 context 来的。context 的document 对象,oc 对应的是 MSDocument 对象 。可以通过 log 命令打印出来查看
var doc = context.document,
plugin = context.plugin,
command = context.command,
page = doc.currentPage(),
artboards = page.artboards(),
selectedArtboard = page.currentArtboard(),// 当前被选择的画板
selection = context.selection; // 被选择的图层
console.log(doc);
Context
当输入插件定制的命令时,Sketch 会去寻找该命令对应的实现函数, 并传入 context
变量。context
包含以下变量
- command:
MSPluginCommand
对象,当前执行命令 - document:
MSDocument
对象 ,当前文档 - plugin:
MSPluginBundle
对象,当前的插件 bundle,包含当前运行的脚本 - scriptPath:
NSString
当前执行脚本的绝对路径 - scriptURL: 当前执行脚本的绝对路径,跟 **scriptPath **不同的是它是个
NSURL
对象 - selection: 一个
NSArray
对象,包含了当前选择的所有图层。数组中的每一个元素都是MSLayer
对象
Sketch分析
sketch是用Objective-C构建的。sketch官方针对 Sketch Native API 封装了一套 JS API,目前还未涵盖所有场景,比如UI界面、组件拖放等,若需要更丰富的底层 API 需结合 CocoaScript 进行实现
OC是一种通用、高级、面向对象的语言,是C语言的严格超集,广泛用于IOS开发。
CocoaScript 是一种bridge,实现 JavaScript 运行环境到 Objective-C运行时的桥接功能,可通过桥接器编写 JavaScript 外部脚本访问内部 Sketch API 和 macOS 框架(AppKit)底层丰富的 API 功能。
AppKit是为macOS应用程序构建和管理事件驱动的图形用户界面
技术实现
UI层:采用Webview实现可以使用各种前端开发框架,比如React或者Vue等
逻辑层:负责调用sketch API 通过CocoaScript Bridge进行通信
可以通过一张图看下整个流程:
sketch插件
- Sketch 插件是按照特定方式管理的一个文件夹,包含一个或多个 scripts,每个 script 含有若干扩展 Sketch 用途的命令
- 插件主要使用 Javascript 语言编写,支持 ES6 语法,但运行环境既不是浏览器也不是 Nodejs,而是 Hybrid SketchAPI for macOS Native 运行环境
sketch官方API
Actions API
该API用于监听用户操作行为而触发事件,例如 OpenDocumen(打开文档)、CloseDocument(关闭文档)、Shutdown(关闭插件)、TextChanged(文本变化)、TogglePresentationMode等。该API未来会被新的 Events API 替代。它代表了 Sketch App 内部触发的事件。具体可以参考官方文档:https://developer.sketch.com/reference/action/
订阅 Actions
manifest.json 文件,配置相应 handlers
"commands" : [ ... { "script" : "action.js", "name" : "Action", "handlers" : { "actions": { "OpenDocument": "onOpenDocument" } }, "identifier" : "my-plugin.my-command-identifier" } ... ]// action.js export function onOpenDocument(context) { context.actionContext.document.showMessage('Document Opened') }
Action Context
Action事件会将context.actionContext 传递给handler。有些Action包含两个状态,begin和finished,比如SelectionChanged 。需分别订阅 SelectionChanged.begin 和 SelectionChanged.finished,否则会触发两次事件。
不知道应该订阅哪个 Action 时,可以使用通配符。但运行时性能开销很大,建议仅在开发阶段使用
// 终端打开通配符支持 defaults write com.bohemiancoding.sketch3 actionWildcardsAllowed -bool YES// manifest.json 文件配置通配符 { ... "handlers": { "actions": { "*": "onActionHandler" } } ... }
Javascript API
是针对 Native API 的封装,目前还未涵盖所有场景,官方承诺未来将覆盖90%。具体可以看官方文档:https://developer.sketch.com/reference/api/
Sketch插件开发大概有如下三种方式:
- 纯使用 CocoaScript 脚本进行开发
- 通过 Javascript + CocoaScript 的混合开发模式
- 通过 AppKit + Objective-C 进行开发
官方建议使用 JavaScript API 编写 Sketch 插件,且官方针对 Sketch Native API 封装了一套 JS API ,目前还未涵盖所有场景, 若需要更丰富的底层 API 需结合 CocoaScript 进行实现。通过 JS API 可以很方便的对 Sketch 中 Document
、Artboard
、Group
、Layer
进行相关操作以及导入导出等,不过可能需要考虑兼容性.
原理
CocoaScript
实现 JavaScript 运行环境到 Objective-C 运行时的桥接功能,可通过桥接器编写 JavaScript 外部脚本访问内部 Sketch API 和 macOS 框架底层丰富的 API 功能。
借助CocoaScript使用JavaScript调Objective-C 语法:
- 方法调用用 ‘.’ 语法
- Objective-C 属性设置
- Getter:
object.name()
- Setter:
object.setName('Sketch')
,object.name='sketch'
- Getter:
- 参数都放在 ‘ ( ) ’ 里
- Objective-C中 ’ : '(参数与函数名分割符) 转换为 ’ _ ',最后一个下划线是可选的
- 返回值,JavaScript 统一用
var/const/let
设置类型
开发环境
Skpm
是一个打包工具,用于快速上手插件开发。它基于 webpack,项目根目录下存放 webpack.skpm.config.js, 用于工程配置修改
Dialog控件
skpm提供了一些供 JavaScript 调用的Native 控件,比如Dialog
import dialog from '@skpm/dialog'
console.log( dialog.showOpenDialog({ properties: ['openFile', 'openDirectory', 'multiSelections'] })
)
代码调试
Safari 浏览器开发工具可用于插件的 Javascript 代码调试。
Developer > name of your machine > Automatically Show Web Inspector for JSContexts
同时启用选项 Automatically Pause Connecting to JSContext
Objective-C Classes
Sketch 对外暴露了全部内部方法的调用权限,其 Objective-C 类 通过 Bridge 提供 Javascript API 调用。
Sketch 插件系统可以完全访问应用程序的内部结构和 macOS 中的核心框架。Sketch 是用 Objective-C 构建的,其 Objective-C 类通过 Bridge (CocoaScript/mocha) 提供 Javascript API 调用,简单的了解 Sketch 暴露的相关类以及类方法,对开发插件非常有帮助。
GUI
插件GUI的实现
skpm 提供了已封装好的基于 WKWebView 的 sketch-module-web-view,其 API 设计接近 Electron,具体见GitHub。
https://github.com/skpm/sketch-module-web-view/blob/master/docs/browser-window.md
CocoaScript GUI
Sketch 插件通过 Mohca / CocoaScript 连接到 Objective-C / Cocoa。Javascript 调用 Objective-C 方法,需要将方法名的冒号改为下划线,所有 selector 连接成一个连续的字符串。
打开文件对话框,使用 Appkit NSOpenPanel,详细官方文档见:https://developer.apple.com/documentation/appkit/nsopenpanel?language=objc
Native GUI
WebView GUI
Webview与Plugin之间需要实现双向通讯互操作。Webview通过 WKWebView delegates向Plugin发送消息,Plugin则通过webView.evaluateJavaScript_completionHandler() 触发Webview执行Javascript代码
可以做什么?
- 根据复杂的规则选择文档中的图层
- 操作图层属性
- 以所有支持的格式导出资产
- 与用户交互(要求输入,显示输出)
- 从外部文件和Web服务获取数据
- 与剪贴板交互
- 操作Sketch的环境(编辑指南,缩放等…)
- 通过从插件调用菜单选项来自动化现有功能
- 设计规格
- 内容生成
- 透视转换
webview
Sketch模块,用于使用webview创建复杂的UI。不用于一般的插件页面,可以使用webview模块加载一个复杂的Web应用,使其与Sketch进行交互。
BrowserWindow
// 在浏览器窗口中创建和控制Sketch
// plugin插件中
const BrowserWindow = require('sketch-module-web-view')let win = new BrowserWindow({ width: 800, height: 600 })
win.on('closed', () => {win = null
})// 加载远程url
win.loadURL('https://github.com')// 或者是加载本地文件
win.loadURL(require('./index.html'))
webContents
const BrowserWindow = require('sketch-module-web-view')
let win = new BrowserWindow({ width: 800, height: 1500 })
win.loadURL('http://github.com')
let contents = win.webContents
console.log(contents)
sketch和webview通信
1. 从plugin命令向WebView发送消息// webview中
window.someGlobalFunctionDefinedInTheWebview = function(arg) {console.log(arg)
}
// 插件中
browserWindow.webContents.executeJavaScript('someGlobalFunctionDefinedInTheWebview("hello")').then(res => {// do somethingconsole.loh(res);})2.从WebView向插件发送消息// 插件中
var sketch = require('sketch')
browserWindow.webContents.on('nativeLog', function(s) {sketch.UI.message(s)
})// webview中
window.postMessage('nativeLog', 'Called from the webview')// 传递单个参数
window.postMessage('nativeLog', {a: b,
})// 传递多个参数
window.postMessage('nativeLog', 1, 2, 3)
相关网址
- sketch-module-web-view:https://github.com/skpm/sketch-module-web-view
- Sketch-dev-tools:https://github.com/skpm/sketch-dev-tools
参考网址:
https://mp.weixin.qq.com/s/8Am4AD-qzO57W3XKx22ytQ?
https://mp.weixin.qq.com/s/pZx7nqYNjG9_7U0yVjqOjw?
https://juejin.cn/post/6844903984491134990 (非常详细)
https://github.com/mathieudutour/git-sketch-plugin (git客户端内置到sketch中)
https://blog.csdn.net/nx2xjbur4jg8ef80l1k/article/details/92854864
https://github.com/sketch-hq/SketchAPI/tree/develop/examples (sketch插件demo集合)
https://www.cnblogs.com/jingwhale/p/10520149.html
浅谈sketch插件二相关推荐
- catia三维轴承_浅谈基于CATIA二次开发的单排四点接触球轴承三维设计论文
浅谈基于CATIA二次开发的单排四点接触球轴承三维设计论文 一.概述 单排四点接触球转盘轴承是一种能够同时承受较大轴向负荷.径向负荷和倾覆力矩等综合载荷,集支承.旋转.传动.固定等多种功能于一身的特殊 ...
- 浅谈sketch插件开发(三)
sketch是什么? sketch是一款用来制作矢量绘图的软件,矢量绘图也是进行网页,图标以及界面设计的最好方式.但除了矢量编辑的功能之外,sketch同样添加了一些基本的位图工具,比如模糊和色彩校正 ...
- 浅谈领导力之二 - 授权与放权
前文回顾 浅谈关于领导力之一 - 识人之能 我见过非常多优秀的草根创业者,能力极为出众,自己可以搞定很多事情,但是做公司却很难做大,很多人卡在这个环节上,经常抱怨,没有人才啊,你看招来的都笨死了,是的 ...
- [转]浅谈浏览器插件检测 和自定义协议的支持
前一阵子一直在折腾浏览器的插件检测和自定义协议的支持. 经过种种痛苦的折腾,算是对这一领域有了点浅显的认知.特此记录一下 一.背景知识 自定义协议:常用的协议有 http:// https:// f ...
- 浅谈通信编程(二)--如何分离通信物理接口和应用程序
如何分离通信物理接口和应用程序<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" ...
- 浅谈python_浅谈Python(二)
一.Python算术运算符 以下假设变量a为10,变量b为21: 运算符描述实例 + 加 -- 两个对象相加 a + b 输出结果 31 - 减 -- 得到负数或是一个数减去另一个数 a - b 输出 ...
- hdfs安全模式退出_浅谈HDFS(二)之NameNode与SecondaryNameNode
NN与2NN工作机制 思考:NameNode中的元数据是存储在哪里的? 假设存储在NameNode节点的硬盘中,因为经常需要随机访问和响应客户请求,必然效率太低,所以是存储在内存中的 但是,如果存储在 ...
- 浅谈数据库设计二三事
作为程序员,程序设计前的数据库设计非常重要,这将直接关系到紧接着的代码编写工作,这里谈谈有关数据库设计过程中的一些细节问题. 一.数据表主键的字段选择(ID,Code,Number) ID(编号)一般 ...
- 浅谈分页插件PageHelper
前言: PageHelper是一款开源免费的Mybatis第三方物理分页插件.所谓物理分页,也就是每次都会根据要查询的参数去对应的数据库进行查询,真正实现了按需动态查询.逻辑分页,一般是指一次性查询所 ...
最新文章
- libc.so.6 is needed by mysql_libc.so.6(GLIBC_2.14)(64bit) is needed by…问题的解决办法
- flash里alert
- jquery页面加载的时候加载函数
- 18.IDA-创建自己的sig
- CVE-2019-2725复现(从环境搭建到getshell)
- [机器学习-Sklearn]K-means(K均值)学习与总结
- PLSQL_案例优化系列_明白索引是如何让SQL运行飞快(案例5)
- python变量类型字符串的内建函数使用
- Java小游戏之飞翔的小鸟
- python27的Windows下环境搭建
- 破解wifi时遇到rtl8187 - [phy1]SIOCSIFFLAGS: Name not unique on network
- Multisim卸载删除经历(已重新安装)
- dimm和udimm_服务器内存UDIMM与RDIMM区别
- cocos2dx游戏-可爱的小精灵的各种用法大全
- SpringBoot引入Dubbo问题解析
- Version 28 (intended for Android Pie and below) is the last version of the legacy support library, s
- 使用神器you-get获取萧大bilibili课程视频
- [python] 分治法查找数组元素的最大值和最小值
- 桌面计算机找不到硬盘,电脑BIOS启动项找不到硬盘,该怎么办?
- 如何用matlab拟合二元函数,怎么拟合二元函数?用什么软件比较容易实现?