laya的pageView的简单实现


 

export default class ViewPageComp

{

//回弹距离

private moveOffset: number;

//当前pageIndex

private curPageIndex:number = 0;

//总页数

private totalPageNum:number;

private pageX:number[];

 

private mContainer:Laya.Box;

private cb:Function = null;

constructor() {

}

 

/**

* 初始化box

* @param box 容器

* @param pageWidth page宽度

* @param pageNum page数量

* @param cb 选定一页后的回调

*/

init(box:Laya.Box,pageWidth:number,pageNum:number,cb:Function = null)

{

if(!box)

{

return;

}

this.cb = cb;

this.mContainer = box;

this.totalPageNum = pageNum;

this.pageX = new Array<number>();

 

//初始化box能移动的最边界位置

this.moveOffset = Laya.stage.width / 6;

let max = (Laya.stage.width - pageWidth) / 2;

for(let i = 0 ; i < pageNum; i++)

{

let pagex = max - (pageWidth + 60) * i;

this.pageX.push(pagex);

}

this.mContainer.left = this.pageX[0];

 

this.mContainer.on(Laya.Event.MOUSE_DOWN, this, (event) => {

this.onMouseXDown(event.nativeEvent.changedTouches[0].clientX);

});

 

this.mContainer.on(Laya.Event.MOUSE_MOVE, this, (event) => {

this.onMouseXMove(event.nativeEvent.changedTouches[0].clientX);

});

 

this.mContainer.on(Laya.Event.MOUSE_UP, this, (event) => {

this.onMouseXUp(event.nativeEvent.changedTouches[0].clientX);

});

 

this.mContainer.on(Laya.Event.MOUSE_OUT, this, (event) => {

this.onMouseXUp(event.nativeEvent.changedTouches[0].clientX);

});

}

 

private _onMouseXDown: number = 0;

private touchMouseX:number = 0;

private _MoveDir: number = 0;

private isMouseDown:boolean = false;

private onMouseXDown(mouseX: number): void {

// Laya.Tween.clearTween(this.mContainer);

this._onMouseXDown = mouseX;

this.touchMouseX = mouseX;

this.isMouseDown = true;

}

 

private onMouseXMove(mouseX: number): void {

if(!this.isMouseDown)

{

return;

}

let containerLeft: number = this.mContainer.left;

let moveDis = mouseX - this._onMouseXDown;

this._onMouseXDown = mouseX;

this._MoveDir = moveDis > 0 ? 1 : -1;

if((containerLeft < this.pageX[this.pageX.length - 1] - this.moveOffset && this._MoveDir < 0) || (containerLeft > this.pageX[0] + this.moveOffset && this._MoveDir > 0))

{

return;

}

containerLeft += moveDis;

this.mContainer.left = containerLeft;

}

 

private onMouseXUp(mouseX: number): void {

let moveDis = Math.abs(mouseX - this.touchMouseX);

if(moveDis > 50)

{

let index = this.curPageIndex - this._MoveDir;

if(index < 0)

{

index = 0;

}

else if(index >= this.pageX.length)

{

index = this.pageX.length - 1;

}

this.moveToPage(index);

}

else

{

this.moveToPage(this.curPageIndex);

}

this.isMouseDown = false;

}

 

private moveToPage(pageIndex:number)

{

if(pageIndex >= this.pageX.length)

{

console.error("pageView pageIndex error");

return;

}

let targetX = this.pageX[pageIndex];

let tween = Laya.Tween.to(this.mContainer,{left:targetX},300,Laya.Ease.linearNone,Laya.Handler.create(this,()=>{

if(this.curPageIndex != pageIndex)

{

this.cb && this.cb(pageIndex);

this.curPageIndex = pageIndex;

}

Laya.Tween.clear(tween);

}),null,false);

}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值