package by.flastar.ui.scrollwithcontent { import flash.display.Bitmap; import flash.display.BitmapData; import flash.display.DisplayObject; import flash.display.Sprite; import flash.events.Event; import flash.events.KeyboardEvent; import flash.events.MouseEvent; import flash.geom.Rectangle; import flash.ui.Keyboard; /** * ... * @author Sergey Flastar Gonchar - http://flastar.ru * Тут может быть ваша реклама!) * @version 0.2 */ public class ScrollWithContent extends Sprite { //PUBLIC VARS public var content:DisplayObject;//ссылка на контент, которым будем управлять public var maxWidth:Number;//макс длинна public var maxHeight:Number;//макс высота //PRIVATE VARS private var _contentStartY:Number; private var _skinScroll:Sprite; private var _scrollBox:Sprite; private var _skinScrollBg:Sprite; private var _scrollBg:Sprite; private var _scrollHeight:Number; private var _scrollWidth:Number; private var _maskSprite:Sprite; private var _photoContentContainer:Sprite; //private vars for drag content private var _scrollBoxYold:Number; private var _mouseYold:Number; public function ScrollWithContent(content:DisplayObject = null, maxWidth:Number =NaN, maxHeight:Number = NaN , scrollWidth:Number = 30) { //так лень писать моменты когда параметры будут налловыми или пустыми, так что, cори мну) //ну лана)) if (content) { this.content = content this._contentStartY = content.y; } else { throw new Error("Content is expected! by ScrollWithContent.as"); } if (maxWidth) { this.maxWidth = maxWidth } else { throw new Error("maxWidth is expected! by ScrollWithContent.as"); } if (maxHeight) { this.maxHeight = maxHeight } else { throw new Error("maxHeight is expected! by ScrollWithContent.as"); } if (scrollWidth) { this._scrollWidth = scrollWidth } else { throw new Error("scrollWidth equal NaN! Are you sick?"); } _scrollHeight = maxHeight / (content.height / maxHeight); _skinScrollBg = new Sprite(); _drawScrollBg(_scrollWidth, maxHeight); _skinScroll = new Sprite(); _drawSkinScrollBox(_scrollWidth,_scrollHeight); _photoContentContainer = new Sprite(); _photoContentContainer.addChild(_photoContent(content)); _scrollBg = new Sprite(); _scrollBg.addChild(_photoContentContainer); addChild(_scrollBg); _scrollBg.addChild(_skinScrollBg); _scrollBg.x = maxWidth; _scrollBg.y = 0; _stageUpdate(null); _scrollBox = new Sprite(); _scrollBox.addChild(_skinScroll); addChild(_scrollBox); _scrollBox.x = maxWidth; _addAPIforScrollBox();//немнога интерактивности _maskSprite = new Sprite(); _drawMaskSprite(maxWidth, maxHeight); changeSize(maxWidth, maxHeight); this.addEventListener(Event.ADDED_TO_STAGE, _init); this.addEventListener(Event.REMOVED_FROM_STAGE, _reinit); } //Если скрол убрали со сцены, убираем все листенеры private function _reinit(e:Event):void { _scrollBox.removeEventListener(MouseEvent.MOUSE_DOWN, _goDown); removeEventListener(MouseEvent.MOUSE_WHEEL, _goWheel); content.removeEventListener(MouseEvent.MOUSE_WHEEL, _goWheel); content.removeEventListener(MouseEvent.MOUSE_DOWN, _goContentDownAction); content.removeEventListener(MouseEvent.MOUSE_UP, _goContentUpAction); content.removeEventListener(MouseEvent.ROLL_OVER, _goOverContent); content.removeEventListener(MouseEvent.ROLL_OUT, _goOutContent); stage.removeEventListener(MouseEvent.MOUSE_UP, _goUp); stage.removeEventListener(Event.RESIZE, _stageUpdate); } //после добавления на сцену private function _init(e:Event):void { _scrollBox.addEventListener(MouseEvent.MOUSE_DOWN, _goDown); addEventListener(MouseEvent.MOUSE_WHEEL, _goWheel); content.addEventListener(MouseEvent.MOUSE_WHEEL, _goWheel); content.addEventListener(MouseEvent.MOUSE_DOWN, _goContentDownAction); content.addEventListener(MouseEvent.MOUSE_UP, _goContentUpAction); content.addEventListener(MouseEvent.ROLL_OVER, _goOverContent); content.addEventListener(MouseEvent.ROLL_OUT, _goOutContent); stage.addEventListener(MouseEvent.MOUSE_UP, _goUp); stage.addEventListener(Event.RESIZE, _stageUpdate); } //*******FOR SCROLL CONTENT************************************************* private function _goOverContent(e:MouseEvent):void { stage.addEventListener(KeyboardEvent.KEY_DOWN, _goDownKeyboard); } private function _goOutContent(e:MouseEvent):void { stage.removeEventListener(KeyboardEvent.KEY_DOWN, _goDownKeyboard); } private function _goDownKeyboard(e:KeyboardEvent):void { if (e.keyCode == Keyboard.UP) { _scrollBox.y -= 10; if (_scrollBox.y < 0) { _scrollBox.y = 0; } } if (e.keyCode == Keyboard.DOWN) { _scrollBox.y += 10; if (_scrollBox.y > maxHeight - _scrollHeight) { _scrollBox.y = maxHeight - _scrollHeight; } } _goMove(null); } private function _goContentDownAction(e:MouseEvent):void { _scrollBoxYold = _scrollBox.y; _mouseYold = mouseY; stage.addEventListener(MouseEvent.MOUSE_MOVE, _goMoveContentWithDrag); } private function _goContentUpAction(e:MouseEvent):void { stage.removeEventListener(MouseEvent.MOUSE_MOVE, _goMoveContentWithDrag); } private function _goMoveContentWithDrag(e:MouseEvent):void { _scrollBox.y = _scrollBoxYold + (_mouseYold - mouseY); if (_mouseYold - mouseY > 0) { if (_scrollBox.y > maxHeight - _scrollHeight) { _scrollBox.y = maxHeight - _scrollHeight; } } else if(_mouseYold - mouseY < 0) { if (_scrollBox.y < 0) { _scrollBox.y = 0; } } _goMove(null); } private function _goDown(e:MouseEvent):void { _scrollBox.stopDrag(); stage.addEventListener(MouseEvent.MOUSE_UP, _goUp); addEventListener(Event.ENTER_FRAME, _goMove); } private function _goWheel(e:MouseEvent):void { _scrollBox.y -=e.delta*5; if (e.delta < 0) { if (_scrollBox.y > maxHeight - _scrollHeight) { _scrollBox.y = maxHeight - _scrollHeight; } } else if(e.delta > 0) { if (_scrollBox.y < 0) { _scrollBox.y = 0; } } _goMove(null); } private function _goUp(e:MouseEvent):void { _scrollBox.stopDrag(); removeEventListener(Event.ENTER_FRAME, _goMove); } //Функция для расстоновки контента private function _goMove(e:Event):void { content.y =_contentStartY -_scrollBox.y * (content.height / maxHeight) } //***************************************************** //Если сцена меняет положение контента в остальном мире, мы подстраиваемся под него private function _stageUpdate(e:Event):void { x = content.x; y = content.y; } //Фоткаем контент private function _photoContent(content:DisplayObject):Bitmap { var bmd:BitmapData = new BitmapData(content.width, content.height, true); bmd.draw(content); var bm:Bitmap = new Bitmap(bmd); bm.width = _scrollWidth; bm.height = maxHeight; return bm; } //Функция для изменения размеров скролла public function changeSize(w:Number, h:Number):void { //content.y = 0; _scrollBg.y = 0; _scrollBox.y = 0; if (h < content.height) { this.visible = true; maxWidth = w; maxHeight = h; _scrollHeight = maxHeight / (content.height / maxHeight); _scrollBox.x = w; _drawScrollBg(_scrollWidth, maxHeight); _drawSkinScrollBox(_scrollWidth, _scrollHeight); _scrollBg.x = maxWidth; _scrollBg.y = 0; _stageUpdate(null); content.mask = null; _photoContentContainer.removeChildAt(_photoContentContainer.numChildren - 1); _photoContentContainer.addChild(_photoContent(content)); _drawMaskSprite(maxWidth, maxHeight); } else { this.visible = false; maxWidth = w; maxHeight = content.height; _scrollHeight = maxHeight / (content.height / maxHeight); _drawScrollBg(_scrollWidth, maxHeight); _drawSkinScrollBox(_scrollWidth, _scrollHeight); _scrollBg.x = maxWidth; _scrollBg.y = 0; _stageUpdate(null); content.mask = null; _photoContentContainer.removeChildAt(_photoContentContainer.numChildren-1); _photoContentContainer.addChild(_photoContent(content)); _drawMaskSprite(maxWidth, maxHeight); } } //Добавим немного интерактивности) private function _addAPIforScrollBox():void { _scrollBox.addEventListener(MouseEvent.ROLL_OVER, function(e:MouseEvent):void { _scrollBox.alpha = 0.5 } ); _scrollBox.addEventListener(MouseEvent.ROLL_OUT, function(e:MouseEvent):void { _scrollBox.alpha=1 } ); } //тут меняем цвет и вид фона private function _drawScrollBg(w:Number, h:Number):void { _skinScrollBg.graphics.clear(); _skinScrollBg.graphics.lineStyle(0, 0, 0); _skinScrollBg.graphics.beginFill(0xFFB300, 0.2); _skinScrollBg.graphics.drawRect(0, 0, w, h); _skinScrollBg.graphics.endFill(); } //тут меняем цвет и вид скролла private function _drawSkinScrollBox(w:Number, h:Number):void { _skinScroll.graphics.clear(); _skinScroll.graphics.lineStyle(1,0,1,true); _skinScroll.graphics.beginFill(0xFFB300, 0.5); _skinScroll.graphics.drawRoundRect(0, 0, w, h, 5, 5); _skinScroll.graphics.endFill(); } private function _drawMaskSprite(w:Number, h:Number):void { content.mask = null; if (contains(_maskSprite)) { removeChild(_maskSprite); } _maskSprite.graphics.clear(); _maskSprite.graphics.lineStyle(0, 0, 0); _maskSprite.graphics.beginFill(0xFFFFFF, 1); _maskSprite.graphics.drawRect(0, 0, w, h); _maskSprite.graphics.endFill(); addChild(_maskSprite); content.mask = _maskSprite; } } }