Laya PageView组件简单实现
问题背景
Laya 1.x中没有PageView组件,就是一次滑动一整页的组件。
解决方法
替代方案是用List组件来实现一个。
方案要点
- 在触摸事件中处理翻页
- 利用List组件的成员scrollBar得到当前滑动的位置,然后计算出需要自动翻到第几页
- 利用List组件tweenTo方法来做翻页动画
- 翻页后发送翻页事件
代码
export class PageView extends Laya.List{
constructor(){
super();
this.on(Laya.Event.MOUSE_UP, this, this.onMouseUp);
this.on(Laya.Event.MOUSE_OUT, this, this.onMouseOut);
this.renderHandler = Laya.Handler.create(this, this.renderItem);
}
destroy(){
this.off(Laya.Event.MOUSE_UP, this, this.onMouseUp);
this.off(Laya.Event.MOUSE_OUT, this, this.onMouseOut);
}
onMouseUp(event){
this._updatePage();
}
// onMouseMove(event){
// console.info("PageView: mouse move => ", event);
// }
onMouseOut(event){
// console.info("PageView: mouse out => ", event);
this._updatePage();
}
private _currentPage:number = 0;
private _updatePage(){
// 参考:https://gitee.com/hopher/layaair/blob/master/src/ui/src/laya/ui/List.as
// this.tweenTo(0);
// this.onScrollBarChange
// 停止滚动
this.scrollBar.stopScroll();
// 滑行到下一页的位置
// let length:number = this._array.length;
// let totalPage = Math.ceil(length / (this.repeatX * this.repeatY));
// let numX:number = this._isVertical ? this.repeatX : this.repeatY;
// let numY:number = this._isVertical ? this.repeatY : this.repeatX; //
// let lineCount:number = Math.ceil(length / numX); // 总的行数
let total = this._cellOffset > 0 ? this.totalPage + 1 : this.totalPage;
let pageId = 0;
if (total > 1) {
pageId = Math.ceil((this.scrollBar.value - this._cellOffset - this._cellSize/2)/this._cellSize);
} else {
// this._scrollBar.setScroll(0, 0, 0);
// this._scrollBar.target = this._content;
}
// console.info("Slider pos => ", this.scrollBar.slider.value);
// console.info(`Neareast item id: ${pageId}`);
this.tweenTo(pageId);
this._currentPage = pageId;
if(this._onPageChange){
this._onPageChange(pageId);
}
}
public get pageId(){
return this._currentPage;
}
public set pageId(n:number){
this._currentPage = n;
this.tweenTo(n);
}
// onScrollBarChange(event){
// super.onScrollBarChange(event);
// console.info("ScrollBar Change => ", this.scrollBar.slider.value);
// }
private _onPageChange:(pageId:number)=>void = null;
public set onPageChangeHandler(handler:(pageId:number)=>void){
this._onPageChange = handler;
}
public get onPageChangeHandler(){
return this._onPageChange;
}
}