Painter Event Dev Design
title: Painter Event Dev Design
date: 2018-07-27
author: 生忘
subtitle: painter的点击触发事件设计
tags: [小程序]
categories: 【小程序,canvas,dev design】
事件类型包括:
event name | description |
---|---|
tap | 点击 |
longpress | 长按 |
touchstart | 触屏 |
touchmove | 移动 |
touchend | 离开屏幕 |
在Painter的框架中,由palette决定画面整体的借口和样式。为了能使主canvas响应相对应的点击事件,对palette进行扩展:
-
在各个view的属性中,添加methods对象作为新的属性,该对象响应、处理页面上对应的点击事件。例如:
{ type:'image', url:'/res/img.png', css:{ width:'100rpx', height:'100rpx', left:0, right:0 }, methods:{ // methods tap(){}, longpress(){}, touchstart(){}, touchmove(){}, touchend(){} } }
-
每一个view,都能够接受以上类型的5个事件,不写则不触发相应事件。
在pen.js中的扩展:
-
对于canvas上触发的点击事件,对其进行定位,分发到对应的view。
监听canvas组件的所有事件,根据事件发生的坐标,决定分配给那一个组件。
分配机制:
-
支持事件的冒泡与拦截
事件的冒泡与拦截机制见流程图;事件是自上而下传递或是相反,取决于元素事件序列的排序规则
-
支持canvas全图点击事件的获取。
canvas上任意一点上触发的点击事件,都可以是一个全图点击事件。获取整个canvas的点击事件后,先对全图的点击事件进行消耗。全图事件也可以被拦截,这样的话,其它的任何组件都得不到点击事件。
在上述流程图中,添加环节:
-
动态改变一个元素(view)的位置以及其它状态。 对于某一个元素位置的动态控制能力。这一点是我认为最复杂的一点,在canvas上控制元素的移动和状态,就意味着不断地刷新重绘这个元素。可行的思路有一下两点:
- 每一次移动都完全重绘整个页面。毫无疑问,这对性能的损耗可能是无法接受的。
- 移动的操作:擦除原先的元素,再绘上新位置的元素。在绘制的时候,将静态元素先行绘制完毕,然后储存画布的当前状态,然后进行动态元素的绘制。