Laya List翻页滚动方案 & List滚动源码解析

@author ixenos 2019-03-29

1.List翻页滚动方案

 /**
* 计算下一页的起始索引, 不足时补足
* @param direction 0 for pre, 1 for nex , @author ixenos 2019-03-29
*/
private function btnScrollControl(direction:int=0):void{
if(direction==0){
var minusResult:int = list.startIndex - list.repeatX;
if(minusResult>=0){
list.tweenTo(minusResult);
}else{
list.tweenTo(0);
}
}else if(direction==1){
var plusResult:int = list.startindex + list.repeatX;
if(plusResult<=list.array.length-1){
list.tweenTo(plusResult);
}else{
list.tweenTo(list.array.length-1);
}}
}

2.List滚动源码解析

1) scrollTo和tweenTo都需要list本身自带滚动条
 /**
* <p>滚动列表,以设定的数据索引对应的单元格为当前可视列表的第一项。</p>
* @param index 单元格在数据列表中的索引。
*/
public function scrollTo(index:int):void {
if (_scrollBar) {
var numX:int = _isVertical ? repeatX : repeatY;
_scrollBar.value = Math.floor(index / numX) * _cellSize;
} else {
startIndex = index;
}
}
2) tweenTo内部是对scrollBar进行tween
 /**
* <p>缓动滚动列表,以设定的数据索引对应的单元格为当前可视列表的第一项。</p>
* @param index 单元格在数据列表中的索引。
* @param time 缓动时间。
* @param complete 缓动结束回掉
*/
public function tweenTo(index:int, time:int = 200, complete:Handler = null):void {
if (_scrollBar) {
var numX:int = _isVertical ? repeatX : repeatY;
Tween.to(_scrollBar, {value: Math.floor(index / numX) * _cellSize}, time, null, complete, 0, true);
} else {
startIndex = index;
if (complete) complete.run();
}
}
3) scrollBar之于List
 public function set scrollBar(value:ScrollBar):void {
if (_scrollBar != value) {
_scrollBar = value;
if (value) {
_isVertical = _scrollBar.isVertical;
addChild(_scrollBar);
_scrollBar.on(Event.CHANGE, this, onScrollBarChange);
}
}
}
 /**
* @private
* 滚动条的 <code>Event.CHANGE</code> 事件侦听处理函数。
*/
protected function onScrollBarChange(e:Event = null):void {
runCallLater(changeCells);
var scrollValue:Number = _scrollBar.value;
var lineX:int = (_isVertical ? this.repeatX : this.repeatY);
var lineY:int = (_isVertical ? this.repeatY : this.repeatX);
var scrollLine:int = Math.floor(scrollValue / _cellSize); if (!cacheContent) {
var index:int = scrollLine * lineX;
var num:int = 0;
if (index > _startIndex) {
num = index - _startIndex;
var down:Boolean = true;
var toIndex:int = _startIndex + lineX * (lineY + 1);
_isMoved = true;
} else if (index < _startIndex) {
num = _startIndex - index;
down = false;
toIndex = _startIndex - 1;
_isMoved = true;
} for (var i:int = 0; i < num; i++) {
if (down) {
var cell:Box = _cells.shift();
_cells[_cells.length] = cell;
var cellIndex:int = toIndex + i;
} else {
cell = _cells.pop();
_cells.unshift(cell);
cellIndex = toIndex - i;
}
var pos:Number = Math.floor(cellIndex / lineX) * _cellSize;
_isVertical ? cell.y = pos : cell.x = pos;
renderItem(cell, cellIndex);
}
_startIndex = index;
changeSelectStatus();
} else {
num = (lineY + 1);
if (_createdLine - scrollLine < num) {
_createItems(_createdLine, lineX, _createdLine + num);
renderItems(_createdLine * lineX, 0);
_createdLine += num;
}
} var r:Rectangle = _content._style.scrollRect;
if (_isVertical) {
r.y = scrollValue - _offset.y;
r.x = -_offset.x;
} else {
r.y = -_offset.y;
r.x = scrollValue - _offset.x;
}
_content.scrollRect = r;
}
 

Laya List翻页滚动方案 & List滚动源码解析的更多相关文章

  1. 百度智能手环方案开源(含源码,原理图,APP,通信协议等)

    分享一个百度智能手环开源项目的设计方案资料. 项目简介 百度云智能手环的开源方案是基于Apache2.0开源协议,开源内容包括硬件设计文档,原理图.ROM.通讯协议在内的全套方案,同时开放APP和云服 ...

  2. Laya Timer原理 & 源码解析

    Laya Timer原理 & 源码解析 @author ixenos 2019-03-18 16:26:38 一.原理 1.将所有Handler注册到池中 1.普通Handler在handle ...

  3. [源码解析] 深度学习分布式训练框架 horovod (11) --- on spark --- GLOO 方案

    [源码解析] 深度学习分布式训练框架 horovod (11) --- on spark --- GLOO 方案 目录 [源码解析] 深度学习分布式训练框架 horovod (11) --- on s ...

  4. 简易数据分析 10 | Web Scraper 翻页——抓取「滚动加载」类型网页

    这是简易数据分析系列的第 10 篇文章. 友情提示:这一篇文章的内容较多,信息量比较大,希望大家学习的时候多看几遍. 我们在刷朋友圈刷微博的时候,总会强调一个『刷』字,因为看动态的时候,当把内容拉到屏 ...

  5. iOS仿抖音节拍界面、Swift,MVVM架构完整项目、日历demo、滚动切换分类等源码

    iOS精选源码 在Object-C中学习数据结构与算法之排序算法 日历-基本功能都有的日历 选择日期 上下月 动画 仿抖音卡节拍界面 垂直.水平方向皆可滚动.header悬浮的列表视图 Auto La ...

  6. Android DiskLruCache 源码解析 硬盘缓存的绝佳方案

    一.概述 依旧是整理东西,所以近期的博客涉及的东西可能会比较老一点,会分析一些经典的框架,我觉得可能也是每个优秀的开发者必须掌握的东西:那么对于Disk Cache,DiskLruCache可以算佼佼 ...

  7. 滴滴插件化方案 VirtualApk 源码解析

    那么其中的难点很明显是对四大组件支持,因为大家都清楚,四大组件都是需要在AndroidManifest中注册的,而插件apk中的组件是不可能预先知晓名字,提前注册中宿主apk中的,所以现在基本都采用一 ...

  8. LiteDB源码解析系列(2)数据库页详解

    在这一篇里,我将用图文的方式展示LiteDB中页的结构及作用,内容都是原创,在描述的过程中有不准确的地方烦请指出. 1.LiteDB页的技术工作原理 LiteDB虽然是单个文件类型的数据库,但是数据库 ...

  9. ------ 开源软件 Tor(洋葱路由器,构建匿名网络的方案之一)源码分析——主程序入口点(二)------

    ---------------------------------------------------------- 第二部分仅考察下图所示的代码片段--configure_backtrace_han ...

随机推荐

  1. Git常用命令的使用方法

    推荐一个比较好的GIT的教学地址,廖雪峰老师的git教程! 这里简述Git常用命令的使用方法: 一.初始化git 右键进入 Git Bash 1.建立身份信息 git config --global ...

  2. Flask信号流程

    首先先我们来看看Flask里面的信号是什么样的,我们可以找到一个叫signals.py的文件 这里面是所有定义了的后面请求流程中会用到的信号 二.哪些地方用到了信号 1.请求app上下文时执行的,在执 ...

  3. strong 、weak、copy 、assign 、retain 、unsafe_unretained 与autoreleasing区别和作用

    strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切 @property (nonatomic, strong) NSString *stringA; @property ...

  4. java 核心技术卷一笔记 6 .1.接口 lambda 表达式 内部类

    6.1.2 接口不是类,不能实例化一个接口:但是可以声明接口的变量:Comparable x;    接口变量必须引用实现了接口的类对象:x = new Employee(); 检查一个对象是否属于某 ...

  5. CAD交互绘制块引用对象(网页版)

    主要用到函数说明: _DMxDrawX::DrawBlockReference 绘制块引用对象.详细说明如下: 参数 说明 DOUBLE dPosX 插入点的X坐标 DOUBLE dPosY 插入点的 ...

  6. 修改visual studio setup 安装顺序(解决新版安装包无法自动移除老版本程序的问题)

    背景 visual studio setup 支持自动删除之前版本的安装,需要设置RemovePreviousVersions = true, DetectNewerInstalledVersion ...

  7. python之道04

    1.写代码,有如下列表,按照要求实现每一个功能 li = ["alex", "WuSir", "ritian", "barry&q ...

  8. 第2节 azkaban调度:16、azkaban的介绍以及azkaban的soloserver的安装使用

    2. 工作流调度器azkaban 2.1 概述 azkaban官网: https://azkaban.github.io/ 2.1.1为什么需要工作流调度系统 l  一个完整的数据分析系统通常都是由大 ...

  9. java常考小程序

    private static void nineNineMulitTable(){ /** * 9*9乘法表 */ for (int i = 1,j = 1; j <= 9; i++) { Sy ...

  10. HTML网页的浏览器标题栏显示小图标的方法

    HTML网页的浏览器标题栏显示小图标的方法   就像这种效果,方法其实很简单,就是 在head头部里写: <link rel='icon' href='pic.ico ' type='image ...