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. MvcPager无刷新分页,包含搜索和跳转功能

    1.MVC无刷新分页和搜索(第一版)  http://pan.baidu.com/s/1eRQ7Ml8  密码:uqf7 出现的问题: 1)程序不走判断条件一直为false, 错误原因:1)可能没有引 ...

  2. SpringBoot学习笔记-Chapter2(hello word)

    开篇 第一次在博客园上写博客,初衷是想记录一下学习笔记,以往都是用笔去记录下学习笔记,现在来看在效率.检索速度上以及可可复制性都不好.作为一名Java开发人员 不会Spring Boot一定会被鄙视的 ...

  3. mongodb 正则

    正则表达式常用来在所有语言中搜索字符串的任何模式或文字.MongoDB还提供了正则表达式功能的字符串模式使用正则表达式$regex操作符.MongoDB使用PCRE(Perl兼容正则表达式)为正则表达 ...

  4. hihocoder1821 取卡片游戏

    思路: 博弈dp. 实现: #include <iostream> #include <algorithm> #include <cstring> using na ...

  5. 跨平台C++开源代码的两种常用编译方式

    作者:朱金灿 来源:http://blog.csdn.net/clever101 跨平台C++开源代码为适应各种编译器的编译,采用了两种方式方面来适配.一种是makefile方式.以著名的空间数据格式 ...

  6. MAC无法确认开发者身份

    网上下载的软件,如果来自身份不明的开发者,在MAC上打开时会提示无法确认开发者的身份,在网上找到了一篇尝试解决的文章,文章链接地址为http://jingyan.baidu.com/article/f ...

  7. nuget用法

    Update-Package -reinstall -ProjectName Cardin.HeartCare.Service.ChatService

  8. easyui 刷新页面

    window.location.reload()刷新当前页面. parent.location.reload()刷新父亲对象(用于框架) opener.location.reload()刷新父窗口对象 ...

  9. ubuntu 16.0安装 hadoop2.8.3

    环境:ubuntu 16.0 需要软件:jdk ssh https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/ 2.8.3 安装 jdk并 ...

  10. JSON数组不用字符串转换的写法

    var organization = []; //机构组织 //初始化用户数据列表中用户机构列的数据源 admin.ajax("GetOrganizationInfo", null ...