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. SpringMVC和Spring的配置文件扫描包详解

    在Spring整体框架的核心概念中,容器是核心思想,就是用来管理Bean的整个生命周期的,而在一个项目中,容器不一定只有一个,Spring中可以包括多个容器,而且容器有上下层关系,目前最常见的一种场景 ...

  2. Vue.js - day6

    注意: 有时候使用npm i node-sass -D装不上,这时候,就必须使用 cnpm i node-sass -D 在普通页面中使用render函数渲染组件 在webpack中配置.vue组件页 ...

  3. input type=file 选择图片并且实现预览效果

    通过<input />标签,给它指定type类型为file,可提供文件上传: accept:可选择上传类型,如:只要传图片,且不限制图片格式,为image/*: multiple:规定是否 ...

  4. 怎样将python的文件转化为windows的可执行程序

    最近我在刚入手python,其中就学到了怎样将python的py格式文件转化为windows的exe执行程序, 是这样的,首先要创建一个py文件,这里给截图吧 接下来就以这个python文件为例创建一 ...

  5. uvm_object ——太极

    无极生太极——无名天地之始 太极生两仪——有名万物之母   文件: $UVM_HOME/src/base/uvm_object.svh 类: uvm_object The uvm_object cla ...

  6. SPM-软件项目管理之感想

    这学期开始选择选修课的时候是需要把每节课都过一遍的.当我上完SPM那节课的时候,我就已经决定要选这门课了,尽管还有其他的课我都还没上过.由于这节课是双语教学-中文老师兼外籍老师,这样的方式感觉很新颖, ...

  7. gEdit - GTK+ 基础文本编辑器

    语法 gedit [--help] [--version] [文件名] [文件名] [文件名] 等等... 描述 gEdit 是一个 X窗口系统下的基础文本编辑器由 GTK+ 写成.它现在支持建立,打 ...

  8. 思维 || Make It Equal

    http://codeforces.com/contest/1065/problem/C 题意:给你n个高度分别为a[i]的塔,每次可以横着切一刀,切掉不多于k个塔,问最少切多少刀才能把塔切的都一样高 ...

  9. SNP|RELP|genetic polymorphism|

    5.3个体基因组呈现广泛变化 遗传多态性:一个基因座上存在多个等位基因(因为野生型不止一种基因)的现象,但是只有这多种等位基因满足:1.多个基因稳定存在2.基因在种群中数目大于1%时,认为该基因座多态 ...

  10. 分布式mysql 和 zk ( zookeeper )的分布式的区别 含冷热数据讨论

    zk ( zookeeper )的分布式仅仅指的是备份模式. 分布式 mysql 不仅仅要关注备份(从以往的半主,主主,到 paxos). (mysql 比 hbase 的region成熟, hdfs ...