【无限思维画布】制作思维导图第五步,节点创建与连接,拖拽对齐与双击缩放

正在为无限词典制作单词思维导图功能,实现无限单词导图,无限思维画布。目前制作到第五步,实现节点创建、节点连接、节点拖拽对齐:

节点创建与连接,拖拽对齐

Details

第四步,推倒重来。

一开始受vue-mindmap影响,用的是一个大型svg嵌套所有,其实没多大道理,大可不必。更重要的是,无论何种方法,在移动端放大的情况下,拖拽移动会很卡。用了亿点小技巧解决了(思路是原生结合js,解决)

不断推导重来,总共迭代出了八个副本,每个都是不大相同的路线:
8

第五步,拖拽对齐、节点连接、双击缩放

简单记录下。

拖拽对齐就是移动节点的时候,按照100像素对齐。否则节点容易歪歪斜斜的。

总布局呢是个巨大的div,初始大小1500x2500,接近黄金比例,作为一个画布单位,可以无限拓展。然后初始化的时候用transform属性将总布局缩小,适配设备宽度。

这样,我们的思维画布天生就有了 chrome 、 webview 的惯性平滑滚动,岂不美哉!

至于“双击快速缩放”功能,原本是原生就有的功能,后来取消了,但可手动模拟。具体不谈,可参考我开源仓库里的RLContainerSlider.java代码,这是个多才多艺的布局容器,融合了opera浏览器式左右翻页、下拉键盘、双击快速缩放等功能。

节点连接还是用svg实现的,在巨型svg下动态创建path。这里有个坑点,普通的createElement、className等可能无效,需要用createElementNS、setAttribute('class’等等,参考使用了这篇博客:用js在页面中创建svg标签不显示的问题的这个方法:

		// https://blog.csdn.net/yiyueqinghui/article/details/108004272
		function makeSVG(tag, attrs) {
			const ns = 'http://www.w3.org/2000/svg';
			const xlinkns = 'http://www.w3.org/1999/xlink';
			let el= document.createElementNS(ns, tag);
			if (tag==='svg'){
				el.setAttribute('xmlns:xlink', xlinkns);
			}
			for (let k in attrs) {
				if (k === 'xlink:href') {
					el.setAttributeNS(xlinkns, k, attrs[k]);
				} else {
					el.setAttribute(k, attrs[k]);
				}
			}
			return el;
		}

最后需要解决放大状态下,拖拽移动卡顿的问题。这个只在移动端发现,应该不是性能瓶颈造成的,而是chrome工程师偷藏的一个BUG。桌面也可用触摸板双指放大,但并未发现任何卡顿现象。

怎么办,提交bug report?别逗了,chromium开发组怕是没空理会这些“简单”问题的, 上次我提交的bug(好不容易说服老外哪里存在BUG)还没改正呢,人微言轻啊!

其实可以自己动手丰衣足食,用原生端java代码配合前端页面,通过JavaScript bridge 模拟拖拽即可解决,首先要在拖拽发生的刹那禁止原webview的滚动,做法有很多,可以重写 webview 的 overScrollby 方法直接返回,我的做法是在 RLContainerSlider 布局容器中,onInterceptTouchEvent 拦截,稍后再通过 evaluateJavascript 模拟拖拽,效果还行。不过开启对齐后,好像就不明显了?

这部分耦合较大,就不直接贴代码了。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值