UNPKG

dragonbones-runtime

Version:

the tools to build dragonbones file for diffrent framework

932 lines (864 loc) 34 kB
////////////////////////////////////////////////////////////////////////////////////// // // Copyright (c) 2014-present, Egret Technology. // All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // * Neither the name of the Egret nor the // names of its contributors may be used to endorse or promote products // derived from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY EGRET AND CONTRIBUTORS "AS IS" AND ANY EXPRESS // OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. // IN NO EVENT SHALL EGRET AND CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;LOSS OF USE, DATA, // OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, // EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // ////////////////////////////////////////////////////////////////////////////////////// namespace eui { let scrollerThrowEvent:ScrollerThrowEvent; /** * @private */ const enum Keys { scrollPolicyV, scrollPolicyH, autoHideTimer, touchStartX, touchStartY, touchMoved, horizontalCanScroll, verticalCanScroll, touchScrollH, touchScrollV, viewport, viewprotRemovedEvent, //表示是被移除触发的viewport设空 touchCancle } /** * The Scroller component displays a single scrollable component, * called a viewport, and horizontal and vertical scroll bars. * The viewport must implement the IViewport interface. * <p>The Group components implement the IViewport interface * and can be used as the children of the Scroller control, * as the following example shows:</p> * <pre> * <s:Scroller width="100" height="100"> * <s:Group> * <s:Image width="300" height="400" source="assets/logo.jpg"/> * </s:Group> * </s:Scroller> * </pre> * <p>The size of the Image control is set larger than that of its parent Group container. * By default, the child extends past the boundaries of the parent container. * Rather than allow the child to extend past the boundaries of the parent container, * the Scroller specifies to clip the child to the boundaries and display scroll bars.</p> * * @event eui.UIEvent.CHANGE_START Dispatched when the scroll position is going to change * @event eui.UIEvent.CHANGE_END Dispatched when the scroll position changed complete * @event egret.Event.CHANGE Dispatched when the scroll position is changing * @event egret.TouchEvent.TOUCH_CANCEL canceled the touch * * @defaultProperty viewport * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @includeExample extension/eui/components/ScrollerExample.ts * @language en_US */ /** * Scroller 组件显示一个称为视域的单个可滚动组件,以及水平滚动条和垂直滚动条。该视域必须实现 IViewport 接口。 * <p>Group 组件实现 IViewport 接口,且可以用作 Scroller 控件的子代,如下例所示:</p> * <pre> * <s:Scroller width="100" height="100"> * <s:Group> * <s:Image width="300" height="400" source="assets/logo.jpg"/> * </s:Group> * </s:Scroller> * </pre> * Image 控件的大小比其父 Group 容器设置得大。默认情况下,子代超过父容器的边界。 * Scroller 会指定将子代剪切到边界并显示滚动条,而不是让子代超过父容器的边界。 * * @event eui.UIEvent.CHANGE_START 滚动位置改变开始 * @event eui.UIEvent.CHANGE_END 滚动位置改变结束 * @event egret.Event.CHANGE 滚动位置改变的时候 * @event egret.TouchEvent.TOUCH_CANCEL 取消触摸事件 * * @defaultProperty viewport * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @includeExample extension/eui/components/ScrollerExample.ts * @language zh_CN */ export class Scroller extends Component { /** * The threshold value(in pixels) trigger the rolling. * when the touch points deviate from the initial touch point than this value will trigger the rolling. * * @default 5 * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language en_US */ /** * 开始触发滚动的阈值(以像素为单位),当触摸点偏离初始触摸点的距离超过这个值时才会触发滚动。 * * @default 5 * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language zh_CN */ public static scrollThreshold:number = 5; /** * Constructor. * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language en_US */ /** * 构造函数。 * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language zh_CN */ public constructor() { super(); let touchScrollH = new sys.TouchScroll(this.horizontalUpdateHandler, this.horizontalEndHandler, this); let touchScrollV = new sys.TouchScroll(this.verticalUpdateHandler, this.verticalEndHanlder, this); this.$Scroller = { 0: "auto", //scrollPolicyV, 1: "auto", //scrollPolicyH, 2: null, //autoHideTimer, 3: 0, //touchStartX, 4: 0, //touchStartY, 5: false, //touchMoved, 6: false, //horizontalCanScroll, 7: false, //verticalCanScroll, 8: touchScrollH, //touchScrollH, 9: touchScrollV, //touchScrollV 10: null, //viewport 11: false, //viewprotRemovedEvent 12: false //touchCancle }; } private $bounces:boolean = true; /** * Whether to enable rebound, rebound When enabled, ScrollView contents allowed to continue to drag the border after arriving at the end user drag operation, and then bounce back boundary position * @default true * @version Egret 2.5.6 * @language en_US */ /** * 是否启用回弹,当启用回弹后,ScrollView中内容在到达边界后允许继续拖动,在用户拖动操作结束后,再反弹回边界位置 * @default true * @version Egret 2.5.6 * @language zh_CN */ public get bounces():boolean { return this.$bounces; } public set bounces(value:boolean) { this.$bounces = !!value; let touchScrollH = this.$Scroller[Keys.touchScrollH]; if (touchScrollH) { touchScrollH.$bounces = this.$bounces; } let touchScrollV = this.$Scroller[Keys.touchScrollV]; if (touchScrollV) { touchScrollV.$bounces = this.$bounces; } } /** * Adjust the speed to get out of the slide end.When equal to 0,the scroll animation will not be play. * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language en_US */ /** * 调节滑动结束时滚出的速度。等于0时,没有滚动动画 * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language zh_CN */ public set throwSpeed(val:number) { val = +val; if (val < 0) val = 0; this.$Scroller[Keys.touchScrollH].$scrollFactor = val; this.$Scroller[Keys.touchScrollV].$scrollFactor = val; } public get throwSpeed():number { return this.$Scroller[Keys.touchScrollH].$scrollFactor; } /** * @private */ $getThrowInfo(currentPos:number, toPos:number):eui.ScrollerThrowEvent { if (!scrollerThrowEvent) { scrollerThrowEvent = new eui.ScrollerThrowEvent(ScrollerThrowEvent.THROW, false, false, currentPos, toPos); } else { scrollerThrowEvent.currentPos = currentPos; scrollerThrowEvent.toPos = toPos; } return scrollerThrowEvent; } /** * @private */ $Scroller:Object; /** * the horizontal scroll bar * * @skinPart * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language en_US */ /** * 水平滚动条 * * @skinPart * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language zh_CN */ public horizontalScrollBar:eui.HScrollBar = null; /** * the vertical scroll bar * * @skinPart * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language en_US */ /** * 垂直滚动条 * * @skinPart * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language zh_CN */ public verticalScrollBar:eui.VScrollBar = null; /** * Indicates under what conditions the scroller can be moved and the vertical scroll bar is displayed. * <p><code>ScrollPolicy.ON</code> - the scroller can be moved, and the scroll bar is displayed when it's move.</p> * <p><code>ScrollPolicy.OFF</code> - the scroller can not be moved, the scroll bar is never displayed.</p> * <p><code>ScrollPolicy.AUTO</code> - the scroller can not be moved when * the viewport's contentHeight is larger than its height. the scroll bar is displayed when it's move. * * @default ScrollPolicy.AUTO * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language en_US */ /** * 指示在哪些条件可以滚动并且显示垂直滑动条。 * <p><code>ScrollPolicy.ON</code> - 可以滚动,滚动时显示滚动条。</p> * <p><code>ScrollPolicy.OFF</code> - 不可以滚动并且不显示滚动条。</p> * <p><code>ScrollPolicy.AUTO</code> - 当视域的 contentHeight 大于其自身的高度时可以滚动,滚动时显示滚动条。</p> * * @default ScrollPolicy.AUTO * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language zh_CN */ public get scrollPolicyV():string { return this.$Scroller[Keys.scrollPolicyV]; } public set scrollPolicyV(value:string) { let values = this.$Scroller; if (values[Keys.scrollPolicyV] == value) { return; } values[Keys.scrollPolicyV] = value; this.checkScrollPolicy(); } /** * Indicates under what conditions the scroller can be moved and the horizontal scroll bar is displayed. * <p><code>ScrollPolicy.ON</code> - the scroller can be moved, and the scroll bar is displayed when it's move.</p> * <p><code>ScrollPolicy.OFF</code> - the scroller can not be moved, the scroll bar is never displayed.</p> * <p><code>ScrollPolicy.AUTO</code> - the can not be moved when * the viewport's contentWidth is larger than its width. the scroll bar is displayed when it's move. * * @default ScrollPolicy.AUTO * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language en_US */ /** * 指示在哪些条件下可以滚动并且显示水平滑动条。 * <p><code>ScrollPolicy.ON</code> - 可以滚动,滚动时显示滚动条。</p> * <p><code>ScrollPolicy.OFF</code> - 不可以滚动并且不显示滚动条。</p> * <p><code>ScrollPolicy.AUTO</code> - 当视域的 contentWidth 大于其自身的宽度时可以滚动,滚动时显示滚动条。</p> * * @default ScrollPolicy.AUTO * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language zh_CN */ public get scrollPolicyH():string { return this.$Scroller[Keys.scrollPolicyH]; } public set scrollPolicyH(value:string) { let values = this.$Scroller; if (values[Keys.scrollPolicyH] == value) { return; } values[Keys.scrollPolicyH] = value; this.checkScrollPolicy(); } /** * Stop the scroller animation * @version Egret 3.0.2 * @version eui 1.0 * @platform Web,Native * @language en_US */ /** * 停止滚动的动画 * * @version Egret 3.0.2 * @version eui 1.0 * @platform Web,Native * @language zh_CN */ public stopAnimation():void { let values = this.$Scroller; let scrollV = values[Keys.touchScrollV]; let scrollH = values[Keys.touchScrollH]; if (scrollV.animation.isPlaying) { UIEvent.dispatchUIEvent(this, UIEvent.CHANGE_END); } else if (scrollH.animation.isPlaying) { UIEvent.dispatchUIEvent(this, UIEvent.CHANGE_END); } scrollV.stop(); scrollH.stop(); let verticalBar = this.verticalScrollBar; let horizontalBar = this.horizontalScrollBar; if (verticalBar && verticalBar.autoVisibility) { verticalBar.visible = false; } if (horizontalBar && horizontalBar.autoVisibility) { horizontalBar.visible = false; } } /** * The viewport component to be scrolled. * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language en_US */ /** * 要滚动的视域组件。 * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native * @language zh_CN */ public get viewport():IViewport { return this.$Scroller[Keys.viewport]; } public set viewport(value:IViewport) { let values = this.$Scroller; if (value == values[Keys.viewport]) return; this.uninstallViewport(); values[Keys.viewport] = value; values[Keys.viewprotRemovedEvent] = false; this.installViewport(); } /** * @private * 安装并初始化视域组件 */ private installViewport():void { let viewport = this.viewport; if (viewport) { this.addChildAt(viewport, 0); viewport.scrollEnabled = true; viewport.addEventListener(egret.TouchEvent.TOUCH_BEGIN, this.onTouchBeginCapture, this, true); viewport.addEventListener(egret.TouchEvent.TOUCH_END, this.onTouchEndCapture, this, true); viewport.addEventListener(egret.TouchEvent.TOUCH_TAP, this.onTouchTapCapture, this, true); viewport.addEventListener(egret.Event.REMOVED, this.onViewPortRemove, this); } if (this.horizontalScrollBar) { this.horizontalScrollBar.viewport = viewport; } if (this.verticalScrollBar) { this.verticalScrollBar.viewport = viewport; } } /** * @private * 卸载视域组件 */ private uninstallViewport():void { if (this.horizontalScrollBar) { this.horizontalScrollBar.viewport = null; } if (this.verticalScrollBar) { this.verticalScrollBar.viewport = null; } let viewport = this.viewport; if (viewport) { viewport.scrollEnabled = false; viewport.removeEventListener(egret.TouchEvent.TOUCH_BEGIN, this.onTouchBeginCapture, this, true); viewport.removeEventListener(egret.TouchEvent.TOUCH_END, this.onTouchEndCapture, this, true); viewport.removeEventListener(egret.TouchEvent.TOUCH_TAP, this.onTouchTapCapture, this, true); viewport.removeEventListener(egret.Event.REMOVED, this.onViewPortRemove, this); if (this.$Scroller[Keys.viewprotRemovedEvent] == false) { this.removeChild(viewport); } } } private onViewPortRemove(event:egret.Event):void { if (event.target == this.viewport) { this.$Scroller[Keys.viewprotRemovedEvent] = true; this.viewport = null; } } /** * @inheritDoc * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native */ protected setSkin(skin:Skin):void { super.setSkin(skin); let viewport = this.viewport; if (viewport) { this.addChildAt(viewport, 0); } } /** * @private * @param event */ private onTouchBeginCapture(event:egret.TouchEvent):void { this.$Scroller[Keys.touchCancle] = false; let canScroll:boolean = this.checkScrollPolicy(); if (!canScroll) { return; } this.onTouchBegin(event); } /** * @private * @param event */ private onTouchEndCapture(event:egret.TouchEvent):void { if (this.$Scroller[Keys.touchCancle]) { event.$bubbles = false; this.dispatchBubbleEvent(event); event.$bubbles = true; event.stopPropagation(); this.onTouchEnd(event); } } /** * @private * @param event */ private onTouchTapCapture(event:egret.TouchEvent):void { if (this.$Scroller[Keys.touchCancle]) { event.$bubbles = false; this.dispatchBubbleEvent(event); event.$bubbles = true; event.stopPropagation(); } } /** * @private * 检查当前滚动策略,若有一个方向可以滚动,返回true。 */ private checkScrollPolicy():boolean { let values = this.$Scroller; let viewport:IViewport = values[Keys.viewport]; if (!viewport) { return false; } let hCanScroll:boolean; let uiValues = viewport.$UIComponent; switch (values[Keys.scrollPolicyH]) { case "auto": if (viewport.contentWidth > uiValues[sys.UIKeys.width] || viewport.scrollH !== 0) { hCanScroll = true; } else { hCanScroll = false; } break; case "on": hCanScroll = true; break; case "off": hCanScroll = false; break; } values[Keys.horizontalCanScroll] = hCanScroll; let vCanScroll:boolean; switch (values[Keys.scrollPolicyV]) { case "auto": if (viewport.contentHeight > uiValues[sys.UIKeys.height] || viewport.scrollV !== 0) { vCanScroll = true; } else { vCanScroll = false; } break; case "on": vCanScroll = true; break; case "off": vCanScroll = false; break; } values[Keys.verticalCanScroll] = vCanScroll; return hCanScroll || vCanScroll; } /** * @private * 记录按下的对象,touchCancle时使用 */ private downTarget:egret.DisplayObject; private tempStage:egret.Stage; /** * @private * * @param event */ private onTouchBegin(event:egret.TouchEvent):void { if (event.isDefaultPrevented()) { return; } if (!this.checkScrollPolicy()) { return; } this.downTarget = event.target; let values = this.$Scroller; this.stopAnimation(); values[Keys.touchStartX] = event.$stageX; values[Keys.touchStartY] = event.$stageY; if (values[Keys.horizontalCanScroll]) { values[Keys.touchScrollH].start(event.$stageX); } if (values[Keys.verticalCanScroll]) { values[Keys.touchScrollV].start(event.$stageY); } let stage = this.$stage; this.addEventListener(egret.TouchEvent.TOUCH_MOVE, this.onTouchMove, this); stage.addEventListener(egret.TouchEvent.TOUCH_END, this.onTouchEnd, this, true); this.addEventListener(egret.TouchEvent.TOUCH_CANCEL, this.onTouchCancel, this); this.addEventListener(egret.Event.REMOVED_FROM_STAGE, this.onRemoveListeners, this); this.tempStage = stage; } /** * @private * * @param event */ private onTouchMove(event:egret.TouchEvent):void { if (event.isDefaultPrevented()) { return; } let values = this.$Scroller; if (!values[Keys.touchMoved]) { let outX:boolean; if (Math.abs(values[Keys.touchStartX] - event.$stageX) < Scroller.scrollThreshold) { outX = false; } else { outX = true; } let outY:boolean; if (Math.abs(values[Keys.touchStartY] - event.$stageY) < Scroller.scrollThreshold) { outY = false; } else { outY = true; } if (!outX && !outY) { return; } if (!outY && outX && values[Keys.scrollPolicyH] == 'off') { return; } if (!outX && outY && values[Keys.scrollPolicyV] == 'off') { return; } values[Keys.touchCancle] = true; values[Keys.touchMoved] = true; this.dispatchCancelEvent(event); let horizontalBar = this.horizontalScrollBar; let verticalBar = this.verticalScrollBar; if (horizontalBar && horizontalBar.autoVisibility && values[Keys.horizontalCanScroll]) { horizontalBar.visible = true; } if (verticalBar && verticalBar.autoVisibility && values[Keys.verticalCanScroll]) { verticalBar.visible = true; } if (values[Keys.autoHideTimer]) { values[Keys.autoHideTimer].reset(); } UIEvent.dispatchUIEvent(this, UIEvent.CHANGE_START); this.$stage.addEventListener(egret.TouchEvent.TOUCH_MOVE, this.onTouchMove, this); } event.preventDefault(); let viewport = values[Keys.viewport]; let uiValues = viewport.$UIComponent; if (values[Keys.horizontalCanScroll]) { values[Keys.touchScrollH].update(event.$stageX, viewport.contentWidth - uiValues[sys.UIKeys.width], viewport.scrollH); } if (values[Keys.verticalCanScroll]) { values[Keys.touchScrollV].update(event.$stageY, viewport.contentHeight - uiValues[sys.UIKeys.height], viewport.scrollV); } } /** * @private * @param event */ private onTouchCancel(event:egret.TouchEvent):void { if (!this.$Scroller[Keys.touchMoved]) { this.onRemoveListeners(); } } /** * @private * @param event */ private dispatchBubbleEvent(event:egret.TouchEvent) { let viewport = this.$Scroller[Keys.viewport]; if (!viewport) { return; } let cancelEvent = egret.Event.create(egret.TouchEvent, event.type, event.bubbles, event.cancelable); cancelEvent.$initTo(event.$stageX,event.$stageY,event.touchPointID); let target:egret.DisplayObject = this.downTarget; cancelEvent.$setTarget(target); let list = this.$getPropagationList(target); let length = list.length; let targetIndex = list.length * 0.5; let startIndex = -1; for (let i = 0; i < length; i++) { if (list[i] === viewport) { startIndex = i; break; } } list.splice(0, list.length - startIndex + 1); targetIndex = 0; this.$dispatchPropagationEvent(cancelEvent, list, targetIndex); egret.Event.release(cancelEvent); } /** * @private * @param event */ private dispatchCancelEvent(event:egret.TouchEvent) { let viewport = this.$Scroller[Keys.viewport]; if (!viewport) { return; } let cancelEvent = egret.Event.create(egret.TouchEvent, egret.TouchEvent.TOUCH_CANCEL, event.bubbles, event.cancelable); cancelEvent.$initTo(event.$stageX,event.$stageY,event.touchPointID); let target:egret.DisplayObject = this.downTarget; cancelEvent.$setTarget(target); let list = this.$getPropagationList(target); let length = list.length; let targetIndex = list.length * 0.5; let startIndex = -1; for (let i = 0; i < length; i++) { if (list[i] === viewport) { startIndex = i; break; } } list.splice(0, startIndex + 1 - 2); list.splice(list.length - 1 - startIndex + 2, startIndex + 1 - 2); targetIndex -= startIndex + 1; this.$dispatchPropagationEvent(cancelEvent, list, targetIndex); egret.Event.release(cancelEvent); } /** * @private * @param event */ private onTouchEnd(event:egret.Event):void { let values = this.$Scroller; values[Keys.touchMoved] = false; this.onRemoveListeners(); let viewport:IViewport = values[Keys.viewport]; let uiValues = viewport.$UIComponent; if (values[Keys.touchScrollH].isStarted()) { values[Keys.touchScrollH].finish(viewport.scrollH, viewport.contentWidth - uiValues[sys.UIKeys.width]); } if (values[Keys.touchScrollV].isStarted()) { values[Keys.touchScrollV].finish(viewport.scrollV, viewport.contentHeight - uiValues[sys.UIKeys.height]); } } /** * @private */ private onRemoveListeners():void { let stage = this.tempStage || this.$stage; this.removeEventListener(egret.TouchEvent.TOUCH_MOVE, this.onTouchMove, this); stage.removeEventListener(egret.TouchEvent.TOUCH_END, this.onTouchEnd, this, true); stage.removeEventListener(egret.TouchEvent.TOUCH_MOVE, this.onTouchMove, this); this.removeEventListener(egret.TouchEvent.TOUCH_CANCEL, this.onTouchCancel, this); this.removeEventListener(egret.Event.REMOVED_FROM_STAGE, this.onRemoveListeners, this); } /** * @private * * @param scrollPos */ private horizontalUpdateHandler(scrollPos:number):void { this.$Scroller[Keys.viewport].scrollH = scrollPos; this.dispatchEventWith(egret.Event.CHANGE); } /** * @private * * @param scrollPos */ private verticalUpdateHandler(scrollPos:number):void { this.$Scroller[Keys.viewport].scrollV = scrollPos; this.dispatchEventWith(egret.Event.CHANGE); } /** * @private * */ private horizontalEndHandler():void { if (!this.$Scroller[Keys.touchScrollV].isPlaying()) { this.onChangeEnd(); } } /** * @private * */ private verticalEndHanlder():void { if (!this.$Scroller[Keys.touchScrollH].isPlaying()) { this.onChangeEnd(); } } /** * @private * */ private onChangeEnd():void { let values = this.$Scroller; let horizontalBar = this.horizontalScrollBar; let verticalBar = this.verticalScrollBar; if (horizontalBar && horizontalBar.visible || verticalBar && verticalBar.visible) { if (!values[Keys.autoHideTimer]) { values[Keys.autoHideTimer] = new egret.Timer(200, 1); values[Keys.autoHideTimer].addEventListener(egret.TimerEvent.TIMER_COMPLETE, this.onAutoHideTimer, this); } values[Keys.autoHideTimer].reset(); values[Keys.autoHideTimer].start(); } UIEvent.dispatchUIEvent(this, UIEvent.CHANGE_END); } /** * @private * * @param event */ private onAutoHideTimer(event:egret.TimerEvent):void { let horizontalBar = this.horizontalScrollBar; let verticalBar = this.verticalScrollBar; if (horizontalBar && horizontalBar.autoVisibility) { horizontalBar.visible = false; } if (verticalBar && verticalBar.autoVisibility) { verticalBar.visible = false; } } /** * @inheritDoc * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native */ protected updateDisplayList(unscaledWidth:number, unscaledHeight:number):void { super.updateDisplayList(unscaledWidth, unscaledHeight); let viewport = this.viewport; if (viewport) { //必须先调用setLayoutBoundsSize(),因为尺寸改变会影响布局位置。 viewport.setLayoutBoundsSize(unscaledWidth, unscaledHeight); viewport.setLayoutBoundsPosition(0, 0); } } /** * @inheritDoc * * @version Egret 2.4 * @version eui 1.0 * @platform Web,Native */ protected partAdded(partName:string, instance:any):void { super.partAdded(partName, instance); if (instance == this.horizontalScrollBar) { this.horizontalScrollBar.touchChildren = false; this.horizontalScrollBar.touchEnabled = false; this.horizontalScrollBar.viewport = this.viewport; if (this.horizontalScrollBar.autoVisibility) { this.horizontalScrollBar.visible = false; } } else if (instance == this.verticalScrollBar) { this.verticalScrollBar.touchChildren = false; this.verticalScrollBar.touchEnabled = false; this.verticalScrollBar.viewport = this.viewport; if (this.verticalScrollBar.autoVisibility) { this.verticalScrollBar.visible = false; } } } } registerProperty(Scroller, "viewport", "eui.IViewport", true); }