/**
* 滚动HTML集合对象
* @param {Element} container 容器节点
* @param {Number} unitLength 滚动宽度,等于容器内子对象的宽度,子对象宽度必须一致
* @param {Number} speed 每10毫秒移动的像素值
* @param {String} direction 滚动方向(up, down, left, right)
* @param {Number} containerRange 容器可视范围 width - paddingLeft - paddingRight 或者 height - paddingTop - paddingBottom
*/
Scroll = function(container, unitLength, speed, direction, containerRange){
var count = (function(){
var qty = 0;
for(var i=0,l=container.childNodes.length;i<l;i++) {
if(container.childNodes[i].nodeType==1)qty++;
}
return qty;
})();
var container_length = (unitLength * count * 2);
this.getContainer = function(){
return container;
}
this.getCount = function(){return count;};
/**
*@param {String} direction 移动方向
*@param {Number} perMoveCount 每次移动对象个数
*/
this.moveOnce = function(direction, perMoveCount, callback){
if(isNaN(parseInt(perMoveCount)))perMoveCount = 1;
var hash = {
left: container.style.marginLeft,
right: container.style.marginLeft,
up: container.style.marginTop,
down: container.style.marginTop
}
var v = parseInt(hash[direction]);
var moved_length = Math.abs(v - init_pos[direction]);
if(moved_length == unitLength * count)this.reset(direction);
var remainder = count % perMoveCount;
if(remainder){
var full_times = Math.floor(count / perMoveCount) * perMoveCount;
var thisObj = this;
this.move(speed, full_times * unitLength, direction, function(){
thisObj.move(speed, remainder * unitLength, direction, callback);
});
}else{
this.move(speed, perMoveCount * unitLength, direction, callback);
}
}
this.init = function(){
var childNodes = container.innerHTML;
container.style.display = "block";
container.innerHTML = childNodes + childNodes;
if(direction == 'up' || direction == 'down'){
container.style.height = container_length + "px";
}else if(direction == 'left' || direction == 'right'){
container.style.width = container_length + "px";
}
this.reset(direction);
}
this.scroll = function(){
var thisObj = this;
this.move(speed, unitLength * count, direction, function(){
//console.info("scrolling");
thisObj.reset(direction);
thisObj.scroll(direction);
});
}
var init_pos = {
left: 0,
right: -(container_length - containerRange),
up: 0,
down: -(container_length - containerRange)
}
/**
*重置对象到初始位置
*/
this.reset = function(direction){
//console.info("reset");
if(direction == "left" || direction == "right"){
container.style.marginLeft = init_pos[direction] + 'px';
}else if(direction == "up" || direction == "down"){
container.style.marginTop = init_pos[direction] + 'px';
}
}
}
/**
* 移动对象
* @private
* @param {Element} moveObj 移动对象
* @param {Number} speed 每10毫秒移动像素
* @param {String} direction 移动方向
* @param {Function} onMoved 移动后调用
*/
Scroll.prototype.move= function(speed, distance, direction, onMoved){
var moveObj = this.getContainer();
var i = Math.abs(distance);
var scroll_px = speed;
var handler = function(){
if(direction == "left"){
moveObj.style.marginLeft = parseInt(moveObj.style.marginLeft) - scroll_px + 'px';
}else if(direction == "right"){
moveObj.style.marginLeft = parseInt(moveObj.style.marginLeft) + scroll_px + 'px';
}else if(direction == "up"){
moveObj.style.marginTop = parseInt(moveObj.style.marginTop) - scroll_px + 'px';
}else if(direction == "down"){
moveObj.style.marginTop = parseInt(moveObj.style.marginTop) + scroll_px + 'px';
}
i -= scroll_px;
if(i > 0 && i < scroll_px){
scroll_px = i;
}
if (i > 0) {
window.setTimeout(handler, 10);
}else{ // == 0
if(typeof(onMoved) == "function")onMoved();
}
}
window.setTimeout(handler, 10);
}
/*
----------------------单击按钮向右滚动示例--------------------------
<input id="btnScrollRight" name="" type="button" class="btn_goto"/>
<div style="width:636px;overflow:hidden;">
<div id="scroll_prizes">
<div class="list"><a href=""><img src="../imgaes/index/img1x.gif" alt='1' width="150" height="150" border="0" alt="" /></a></div>
<div class="list"><a href=""><img src="../imgaes/index/img1x.gif" alt='2' width="150" height="150" border="0" alt="" /></a></div>
<div class="list"><a href=""><img src="../imgaes/index/img1x.gif" alt='3' width="150" height="150" border="0" alt="" /></a></div>
<div class="list"><a href=""><img src="../imgaes/index/img1x.gif" alt='4' width="150" height="150" border="0" alt="" /></a></div>
<div class="list"><a href=""><img src="../imgaes/index/img1x.gif" alt='5' width="150" height="150" border="0" alt="" /></a></div>
<div class="list"><a href=""><img src="../imgaes/index/img1x.gif" alt='6' width="150" height="150" border="0" alt="" /></a></div>
</div>
</div>
<script>
var mq1 = new Scroll(document.getElementById("scroll_prizes"), 159, 10, "right", 636, function(){});
mq1.init();
//mq1.scroll();
var mq1_is_moving = false;
document.getElementById("btnScrollRight").onclick = function(){
//this.moveOnce = function(direction, perMoveCount, callback){
if(mq1_is_moving)return;
mq1_is_moving = true;
mq1.moveOnce("right", 4, function(){
mq1_is_moving = false;
});
}
</script>
---------------------循环向上滚动示例-------------------------------
<div class="co_list" style="height:566px;overflow:hidden;padding:20px 30px">
<div style="height:536px;overflow:hidden;">
<div id="marquee2">
<a href=""><img src="../imgaes/index/co_adv11.png" width="150" height="55" border="0" alt=""/></a>
<a href=""><img src="../imgaes/index/co_adv12.png" width="150" height="55" border="0" alt=""/></a>
<a href=""><img src="../imgaes/index/co_adv13.png" width="150" height="55" border="0" alt=""/></a>
<a href=""><img src="../imgaes/index/co_adv14.png" width="150" height="55" border="0" alt=""/></a>
<a href=""><img src="../imgaes/index/co_adv15.png" width="150" height="55" border="0" alt=""/></a>
</div>
</div>
</div>
<script>
mq2 = new Scroll(document.getElementById("marquee2"), 69, 2, "up", 536, function(){});
mq2.init();
mq2.scroll();
</script>
-------------------------循环向右滚动示例-------------------------
<div style="width:615px;overflow:hidden;height:110px;">
<div id="marquee1">
<div class="list">
<img src="../imgaes/index/co_adv11.png" width="201" height="101" border="0" alt="" />
</div>
<div class="list">
<img src="../imgaes/index/co_adv12.png" width="201" height="101" border="0" alt="" />
</div>
<div class="list">
<img src="../imgaes/index/co_adv13.png" width="201" height="101" border="0" alt="" />
</div>
<div class="list">
<img src="../imgaes/index/co_adv14.png" width="201" height="101" border="0" alt="" />
</div>
<div class="list">
<img src="../imgaes/index/co_adv15.png" width="201" height="101" border="0" alt="" />
</div>
</div>
</div>
<script>
var mq1 = new Scroll(document.getElementById("marquee1"), 211, 2, "right", 615, function(){});
mq1.init();
mq1.scroll();
</script>
*/
分享到:
相关推荐
标题中的“不用时钟滚动标题”可能...通过学习这个源码,开发者不仅可以掌握如何在易语言中实现滚动标题,还可以了解事件驱动编程、界面更新和资源管理等通用编程概念。对于易语言初学者来说,这是一个很好的实践案例。
7. **性能优化**:对于大量文本,可能会有虚拟化技术来提高滚动时的性能。 8. **触摸事件处理**:在触屏设备上,`TextWidget`可能需要处理触摸事件,例如点击事件、滑动事件等。 9. **自适应**:根据设备的屏幕...
在Android应用开发中,"通用下拉刷新"是一种常见的组件功能,它允许用户通过下拉列表来刷新数据。这个功能通常被用在ListView、RecyclerView等滚动视图中,以实现数据实时更新。XRefreshView是可能的一个开源库,...
本文将深入探讨如何在Android项目中集成并使用通用的下拉刷新控件。 首先,我们要介绍的是SwipeRefreshLayout,这是Android SDK提供的一种标准下拉刷新控件。SwipeRefreshLayout通常包含一个可以滚动的视图,如...
总之,这个DEMO提供了一个通用的解决方案,无论你的视图是基于LinearLayout的哪种类型,都可以轻松实现下拉刷新和上推加载更多功能,从而提升应用的交互性和实用性。通过学习和理解这个DEMO,开发者可以将这些功能...
<com.example.junweiliu.commindexdemo.widget.SideBar android:id="@+id/sidebar" android:layout_width="wrap_content" android:layout_height="match_parent" app:normalColor="@color/colorNormal" app:...
在Android开发中,RecyclerView是一个非常重要的视图组件,它提供了高效的数据展示和滚动性能,能够替代ListView和GridView。本文将详细介绍如何在Android中实现RecyclerView的通用适配器,以简化多类型视图的处理。...
- **滚动窗控件**:探讨Scrolled Window Widget的使用方法及其应用场景。 - **按钮框控件**:介绍Button Box Widget的使用方法。 - **工具栏控件**:解释Toolbar Widget的特性和应用场景。 - **选项卡控件**:探讨...
为了使时间轴组件更具通用性,我们可以添加一些可配置的参数,如颜色、线条宽度、文字样式等。这些可以通过构造函数传递给我们的自定义Widget。 6. **事件处理**: 如果需要,我们可以为时间点添加点击事件处理。...
通用Widget的处理封装 下拉刷新 + 上拉加载更多 应用检查更新 PopupWindow 扫码功能(qr_code_scanner插件) 菜单切换动画(圆形扩散、3D翻转) 侧滑删除 城市选择 类似京东选择城市的三级联动 各种自定义Dialog ...
[新功能] 后台左侧菜单支持鼠标滚动拖拽,方便管理超长菜单 [新功能] 后台支持 Widget 动态请求,方便开发者自定义页面内容 [新功能] 运营报表-用户数据页面,支持统计报表和每日明细 [新功能] Time组件增加秒存储...
2. **Container**:这是一个非常通用的Widget,可以用来包裹其他Widget,并提供背景颜色、边框、阴影等装饰。它还可以配合BoxConstraints指定子Widget的尺寸范围。 3. **Flex**( Flexible 和 Expanded):在Row和...
虽然`SwipeRefreshLayout`自带的旋转指示器已经很通用,但开发者还可以根据需求自定义刷新动画。这可以通过重写`SwipeRefreshLayout`的`setProgressViewOffset`和`setColorSchemeResources`方法实现。 三、结束刷新...
在练习中,你可以看到如何创建、添加或删除列表元素,以及如何使用ListView来展示滚动列表。 2. **GridView**: GridView是Flutter中的网格视图,常用于显示具有网格布局的数据。它可以根据需要自适应屏幕大小,用于...
QICI Widget:一套JavaScript图形组件库(qc-widget.js),为编辑器提供丰富强大的通用组件。 QICI Editor:一套基于浏览器的跨平台集成式游戏编辑器,包含基于Node.JS的后台服务。 QICI Core可用于编程方式...
在Android开发中,控件(Widget)是用户界面的重要组成部分,用于构建应用程序的交互界面。Android提供了丰富的控件,包括基本的按钮、文本框、列表视图等,以及更复杂的布局管理器和自定义视图。掌握这些控件的使用...
ViewGroup也是布局(Layout)的基础,布局是提供屏幕界面通用类型的类,比如线性布局、相对布局等,它们帮助我们组织和定位屏幕上的多个View。 在Android UI中,整个界面通常被表示为一棵视图树。Activity通过调用...
然而,需要注意的是,当涉及到`GridView`、`ListView`和`ScrollView`等复杂布局时,直接使用通用的刷新组件可能会引发一些问题。这些视图自身已经包含了滚动行为,与刷新组件的集成可能会导致冲突或不期望的行为。...
1. **SwipeRefreshLayout**:这是Android SDK自带的一个组件,它提供了一个通用的下拉刷新框架。它可以包裹一个子View,如ListView、RecyclerView等,并提供下拉刷新的动画效果。使用SwipeRefreshLayout时,你需要在...