Skip to content

Commit

Permalink
Merge pull request #497 from PandaNocturne/playExcalidrawAnimation
Browse files Browse the repository at this point in the history
Play excalidraw animation
  • Loading branch information
juestchaos authored Nov 8, 2023
2 parents 132e1c1 + fad1871 commit 9aab093
Show file tree
Hide file tree
Showing 6 changed files with 201 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
---
uid: 20230717151344
title: Excalidraw 脚本:Slideshow 完美实现画板幻灯片演示的脚本
tags: [Excalidraw, Slideshow, 幻灯片, PPT]
tags:
- Excalidraw
- Slideshow
- 幻灯片
- PPT
- Excalidraw脚本
description: Excalidraw脚本Slideshow可以将您的绘图转换为幻灯片演示文稿
author: 熊猫别熬夜
type: other
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,13 @@ author: windilycloud
type: basic
draft: false
editable: false
modified: 20230801155252
modified: 20231108011953
---

# Obsidian 插件:Excalidraw 完美的绘图工具


![Excalidraw](https://cdn.pkmer.cn/covers/obsidian-excalidraw-plugin.PNG!pkmer)


> [!Note] Excalidraw
> - 插件名称:Excalidraw
> - 插件作者:Zsolt Viczian
Expand Down Expand Up @@ -122,15 +120,16 @@ Excalidraw 在早期是有很多问题的,比如没有手写压感,插图太

## 社区实践

- [[自定义Excalidraw脚本-实现Zotero与Excalidraw的拖拽联动]]
- [[Excalidraw脚本-Slideshow完美实现画板幻灯片演示的脚本]]
- [[Excalidraw局部嵌入Obsidian]]
- [[自定义Excalidraw脚本-实现Zotero与Excalidraw的拖拽联动]]
- [[自定义Excalidraw脚本-建立库外Eagle素材库的连接]]
- [[自定义Excalidraw脚本-画板局部或者全局播放动画]]

## 支持开源开发者

如果你深度使用 Excalidraw 并可以用其提高生产力,建议登录 [Buy ZsoltViczián a Coffee. ko-fi.com/zsolt - Ko-fi ❤️.](https://ko-fi.com/zsolt) 赞助一波,需要 paypal 或者信用卡。没有这两样的也可以 [zsviczian/obsidian-excalidraw-plugin](https://github.com/zsviczian/obsidian-excalidraw-plugin) 到这个项目下,登录后点右上角的星星,让更多人看到。


## Excalidraw 的朋友们

如果你喜欢 Excalidraw,请考虑尝试一下 [ExcaliBrain](https://github.com/zsviczian/excalibrain)(也可通过 Obsidian Community Plugins 获得)。
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ tags:
- Excalidraw
- 工作流
- 工作流搭建
- Excalidraw脚本
description: 本文仅仅是一个尝试将Ex画板转为线型笔记和生成大纲,不能保证大纲和线型笔记的效果达到非常完美,特别是排序只是从大到小的排序,而不是针对列表的顺序排序,存在很多漏洞。
author: 熊猫别熬夜
type: other
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
---
uid: 20230929013043
title: 自定义 Excalidraw 脚本:实现 Zotero 与 Excalidraw 的拖拽联动
tags: [zotero, excalidraw, workflow]
tags:
- zotero
- workflow
- Excalidraw脚本
- Excalidraw
description:
author: 熊猫别熬夜
type: other
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
---
uid: 20231014173618
title: 自定义 Excalidraw 脚本 - 建立库外 Eagle 素材库的连接
tags: [Eagle, Excalidraw, 工作流, 工作流搭建]
tags:
- Eagle
- Excalidraw
- 工作流
- 工作流搭建
- Excalidraw脚本
description: 自定义 Excalidraw 脚本 - 建立库外 Eagle 素材库的连接
author: 熊猫别熬夜
type: other
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,179 @@
---
uid: 20231108003544
title: 自定义 Excalidraw 脚本 - 画板局部或者全局播放动画
tags:
- Excalidraw
- Excalidraw脚本
description: 动态演示Excalidraw的画板元素
author: 熊猫别熬夜
type: other
draft: false
editable: false
modified: 20231108003655
---

# 自定义 Excalidraw 脚本 - 画板局部或者全局播放动画


![Memos20231107115642_动态演示](https://cdn.pkmer.cn/images/Memos20231107115642_%E5%8A%A8%E6%80%81%E6%BC%94%E7%A4%BA.png!pkmer)

> [!note]+ 基本思路
> 把全部元素 (排除 frame 框架) 的透明度设置为 0,逐步显示,播放顺序先以 X 轴从左到右,再 Y 轴从上到下,对文字采用字母、单词、或者整段进行播放。
## 选中元素后局部播放

![](https://cdn.pkmer.cn/images/GIF-231108%20010414.gif!pkmer)

## 不选中元素可以全局播放

![](https://cdn.pkmer.cn/images/Memos20231107115642_%E5%8A%A8%E6%80%81%E6%BC%94%E7%A4%BA.png!pkmer)

## 文字播放的选项

> 在 Excalidraw 插件设置里面进行设置
![](https://cdn.pkmer.cn/images/202311080117061.png!pkmer)

![](https://cdn.pkmer.cn/images/GIF-231108%20011029.gif!pkmer)

## playExcalidrawAnimation 脚本

```js
let api = ea.getExcalidrawAPI();

let settings = ea.getScriptSettings();
//set default values on first run
if (!settings["animationGapMs"]) {
settings = {
"animationGapMs": {
value: 400,
description: "动画过程中的播放的间隙(ms)",
},
"playTextFormat": {
value: "word",
valueset: ["letter", "word", "paragraph"],
description: "字母(letter)、单词(word)、整段(paragraph)的播放文字<br>推荐使用单词(word)的模式",

},
"wordPlaybackSpeed": {
value: 50,
description: "单词加载的间隙(ms)",
}
};
ea.setScriptSettings(settings);
}


// 排除一些指定元素
const selectedEls = ea.getViewSelectedElements().filter(el => !(el.type == "frame"));

const allEls = ea.getViewElements().filter(el => !(el.type == "frame"));


function elementsSort(elements, key = 'version') {
// default ordered by uptated time
// [older -> newer]
let result = elements.slice(0);
return result.sort((a, b) => a[key] - b[key]);
}


let updatedEls;

if (Object.keys(selectedEls).length !== 0) {
updatedEls = elementsSort(selectedEls, 'y');
updatedEls = elementsSort(selectedEls, 'x');
} else {
if (confirm("是否进行全局播放?")) {
updatedEls = elementsSort(allEls, 'y');
updatedEls = elementsSort(allEls, 'x');
} else {
new Notice(`❎退出播放!`, 2000);
}
}


for (let el of updatedEls) {
// 逐步显示元素
el.opacity = 0;
ea.copyViewElementsToEAforEditing([el]);
ea.addElementsToView();
}

async function animateElements() {
for (let el of updatedEls) {
// 逐步显示元素
await new Promise(resolve => setTimeout(resolve, 300));
// el.clear()

if (el.type == "text") {
// 单词添加时间间隔(ms)
let spaceTime = settings["wordPlaybackSpeed"].value;

// 保存原始数据
let elText = el.originalText;
let elOriginalText = el.originalText;
let elRawText = el.rawText;

let words = "";
let wordList = elOriginalText.split("");

for (let word of wordList) {

if (settings["playTextFormat"].value == "paragraph") break;
el.opacity = 100;
words += word;
el.originalText = el.rawText = el.text = words;

if (/[^a-zA-Z0-9]/g.test(word)) {
ea.copyViewElementsToEAforEditing([el]);

// 添加元素但不保存
ea.addElementsToView(false, false);
await new Promise(resolve => setTimeout(resolve, spaceTime));
} else {
if (settings["playTextFormat"].value == "word") continue;
// 用于分割单词的
ea.copyViewElementsToEAforEditing([el]);
ea.addElementsToView(false, false);
await new Promise(resolve => setTimeout(resolve, spaceTime));
// continue
}

}

el.opacity = 100;

// 还原原始数据
el.originalText = elOriginalText;
el.rawText = elRawText;
el.text = elText;

ea.copyViewElementsToEAforEditing([el]);
// 添加但不保存
ea.addElementsToView(false, false);
await new Promise(resolve => setTimeout(resolve, spaceTime));

} else {
await new Promise(resolve => setTimeout(resolve, settings["animationGapMs"].value));
el.opacity = 100;
ea.copyViewElementsToEAforEditing([el]);

// 添加元素并保存
ea.addElementsToView(false, false);
}

}

for (el of updatedEls) {
el.opacity = 100;
ea.copyViewElementsToEAforEditing([el]);

// 添加元素并保存
ea.addElementsToView(false, true);
}
new Notice(`✅回放已完成!`, 2000);
}

animateElements();
```

0 comments on commit 9aab093

Please sign in to comment.