diff --git a/src/platforms/app-plus-nvue/runtime/components/movable-area b/src/platforms/app-plus-nvue/runtime/components/movable-area new file mode 100644 index 0000000000000000000000000000000000000000..8d352327707c1aba62baab1f19e5162cf1205c6c --- /dev/null +++ b/src/platforms/app-plus-nvue/runtime/components/movable-area @@ -0,0 +1,187 @@ +function getMovableArea (weex) { + const dom = weex.requireModule('dom') + + return { + name: 'MovableArea', + props: { + scaleArea: { + type: Boolean, + default: false + } + }, + data () { + return { + width: 0, + height: 0, + items: [] + } + }, + methods: { + _resize () { + this._getWH().then(() => { + this.items.forEach(function (item) { + item.componentInstance.setParent() + }) + }) + }, + // _find (target, items = this.items) { + // var root = this.$el + // function get (node) { + // for (let i = 0; i < items.length; i++) { + // const item = items[i] + // if (node === item.componentInstance.$el) { + // return item + // } + // } + // if (node === root || node === document.body || node === document) { + // return null + // } + // return get(node.parentNode) + // } + // return get(target) + // }, + _touchstart (t) { + // t.stopPropagation() + if (this.touchItem) { + this.touchItem.touchstart(t) + } + // var i = t.touches + // if (i) { + // if (i.length > 1) { + // var r = { + // x: i[1].pageX - i[0].pageX, + // y: i[1].pageY - i[0].pageY + // } + // this.pinchStartLen = calc(r) + // this.gapV = r + // if (!this.scaleArea) { + // var touch0 = this._find(i[0].target) + // var touch1 = this._find(i[1].target) + // this._scaleMovableView = touch0 && touch0 === touch1 ? touch0 : null + // } + // } + // } + }, + _touchmove (t) { + t.stopPropagation() + if (this.touchItem) { + this.touchItem.touchmove(t) + } + // var n = t.touches + // if (n) { + // if (n.length > 1) { + // t.preventDefault() + // var i = { + // x: n[1].pageX - n[0].pageX, + // y: n[1].pageY - n[0].pageY + // } + // if (this.gapV.x !== null && this.pinchStartLen > 0) { + // var r = calc(i) / this.pinchStartLen + // this._updateScale(r) + // } + // this.gapV = i + // } + // } + }, + _touchend (e) { + // e.stopPropagation() + if (this.touchItem) { + this.touchItem.touchend(e) + this.touchItem = null + } + // var t = e.touches + // if (!(t && t.length)) { + // if (e.changedTouches) { + // this.gapV.x = 0 + // this.gapV.y = 0 + // this.pinchStartLen = null + // if (this.scaleArea) { + // this.items.forEach(function (item) { + // item.componentInstance._endScale() + // }) + // } else { + // if (this._scaleMovableView) { + // this._scaleMovableView.componentInstance._endScale() + // } + // } + // } + // } + }, + // _updateScale (e) { + // if (e && e !== 1) { + // if (this.scaleArea) { + // this.items.forEach(function (item) { + // item.componentInstance._setScale(e) + // }) + // } else { + // if (this._scaleMovableView) { + // this._scaleMovableView.componentInstance._setScale(e) + // } + // } + // } + // }, + _getWH () { + return this._getComponentSize(this.$refs.el).then(({ width, height, top, left }) => { + this.width = width + this.height = height + this.top = top + this.left = left + }) + }, + _getComponentSize (el) { + return new Promise((resolve) => { + dom.getComponentRect(el, ({ size }) => { + resolve(size) + }) + }) + } + }, + created () { + this.items = [] + this.gapV = { + x: null, + y: null + } + this.pinchStartLen = null + }, + mounted () { + // 由于weex在mounted后渲染是异步的不能确保元素渲染完成,需要延迟执行 + setTimeout(() => { + this.__isMounted = true + this._resize() + }, 200) + }, + render (createElement) { + const items = [] + const slots = Array.isArray(this.$slots.default) ? this.$slots.default : [] + + slots.forEach(vnode => { + if (vnode.componentOptions && vnode.componentOptions.tag === 'movable-view') { + items.push(vnode) + } + }) + + this.items = items + const listeners = {} + const events = ['touchstart', 'touchmove', 'touchend'] + events.forEach(event => { + listeners[event] = this[`_${event}`] + }) + return createElement('div', this._g({ + ref: 'el', + on: listeners, + staticClass: ['uni-movable-area'] + }, this.$listeners), items, 2) + }, + style: { + 'uni-movable-area': { + width: '10px', + height: '10px' + } + } + } +} + +export default function init (Vue, weex) { + Vue.component('movable-area', getMovableArea(weex)) +}