UNPKG

extjs-gpl

Version:

GPL licensed version of Sencha Ext JS

136 lines (110 loc) 3.86 kB
/** * Demonstrates path drawing and smoothing. */ Ext.define('KitchenSink.view.chart.FreeDrawComponent', function () { function smoothList(points) { if (points.length < 3) { return ['M', points[0], points[1]]; } var dx = [], dy = [], result = ['M'], i, ln = points.length; for (i = 0; i < ln; i += 2) { dx.push(points[i]); dy.push(points[i + 1]); } dx = Ext.draw.Draw.spline(dx); dy = Ext.draw.Draw.spline(dy); result.push(dx[0], dy[0], 'C'); for (i = 1, ln = dx.length; i < ln; i++) { result.push(dx[i], dy[i]); } return result; } return { extend: 'Ext.draw.Container', xtype: 'free-draw-component', background: 'white', sprite: undefined, lastEventX: undefined, lastEventY: undefined, list: [], constructor: function () { var me = this; me.callParent(arguments); me.on({ element: 'element', mousedown: 'onMouseDown', mousemove: 'onMouseMove', mouseup: 'onMouseUp', mouseleave: 'onMouseUp', scope: me }); }, onMouseDown: function (e) { var targetElement = this, me = Ext.getCmp(targetElement.id), surface = me.getSurface(), xy, x, y; if (!me.sprite) { xy = surface.getEventXY(e); x = xy[0]; y = xy[1]; me.list = [x, y, x, y]; me.lastEventX = x; me.lastEventY = y; me.sprite = surface.add({ type: 'path', path: ['M', me.list[0], me.list[1], 'L', me.list[0] + 1e-1, me.list[1] + 1e-1], lineWidth: 30 * Math.random() + 10, lineCap: 'round', lineJoin: 'round', strokeStyle: new Ext.util.Color(Math.random() * 127 + 128, Math.random() * 127 + 128, Math.random() * 127 + 128) }); surface.renderFrame(); } }, onMouseMove: function (e) { var targetElement = this, me = Ext.getCmp(targetElement.id), surface = me.getSurface(), path, xy, x, y, dx, dy, D; if (me.sprite) { xy = surface.getEventXY(e); x = xy[0]; y = xy[1]; dx = me.lastEventX - x; dy = me.lastEventY - y; D = 10; if (dx * dx + dy * dy < D * D) { me.list.length -= 2; me.list.push(x, y); } else { me.list.length -= 2; me.list.push(me.lastEventX = x, me.lastEventY = y); me.list.push(me.lastEventX + 1, me.lastEventY + 1); } path = smoothList(me.list); me.sprite.setAttributes({ path: path }); if (Ext.os.is.Android) { Ext.draw.Animator.schedule(function () { surface.renderFrame(); }, me); } else { surface.renderFrame(); } } }, onMouseUp: function(e) { var targetElement = this, me = Ext.getCmp(targetElement.id); me.sprite = null; }, onResize: function() { var size = this.element.getSize(); this.getSurface().setRect([0, 0, size.width, size.height]); this.renderFrame(); } }; });