LED跑马灯效果

今天在百度知道上帮网友解决一些问题,看到了一个类似跑马灯的效果,这个以前也有想过要写,但是没有什么头绪和时间,现在顺便就一起解决了。

这个LED跑马灯的效果是怎么一个原理,现分析如下:

假设有一个要进行变化的对象数组,我们称之为A对象。如下:

这个等变化的数组长度为5,

有颜色数组,我们称之为B,如下:

这个长度为3。

要分析出原理,我们要根据事物的表象去分析得到事物内在的规律与原理,根据这个原理与规律我们才能得出解决办法。 我们进行一次模拟:

(1)初始状态

(2)移动过程中的某一状态

我们可以写出这样的一个过程代码,这里用伪代码进行解释说明:

i是从指定的位置开始向低位变化的

j是从0开始进行遍历到高位,直至结束

for( i = 发生变化的游标位置, j=0;  i>=0; i--, j++ ){

if( j < B数组长度 ){

将B数组的值赋给A对象的样式属性

}

else{

说明j已经将B数组遍历结束,则A对象此时样式属性应该被设置为默认值

}

}

//相应的实现代码

//颜色数组(简称B)

var colorArr = [ ‘#f00‘, ‘#09f‘, ‘#6f6‘, ‘#c33‘, ‘#cf0‘ ];

var liIndex = 0; //游标,用于进行变化的下标变量。

for( var i=liIndex, j=0; i>=0; i--, j++ ){

if( j<colorArr.length){

liArr[i].style.backgroundColor = colorArr[j];

}else{

liArr[i].style.backgroundColor = ‘#ccc‘; //当超出时,设置为默认的颜色

}

}

这个过程都很正常,没有什么特别需要注意和处理的地方,关键是,当游标超出A对象的长度的时候,如何进行一个处理?

如图所示状态:

我们通过增加一个假想长度,让B能够继续完成它的遍历,但实际上对B而言,它面对的对象“A”是一个我们加了一个长度的假想对象A,目的只是让B完成它的遍历,而A对象仍然是不可能发生变化的,I游标的值,最大也是为A对象的长度,但变化游标的值却是可以移动到假想对象“A”的最后一个位置上的,所以liIndex是可以继续加大的,而liIndex与i的之间的距离,也就是offset偏移量的值,同时也是我们给A对象增加的假想长度。那么这个过程会持续到哪一个位置上结束?

对,没有错,就是当B完成了在A最后一个位置上的遍历时如下:

所以,可以得出,一次全程的过程的终结状态是在于offset的值=B数组的长度,而offset是由liIndex与i的差进行计算的,所以得到如下公式:

offset = liIndex - A.length;

判断结束状态为:

if( offset >= B.length ){ 结束,恢复回初始状态; }

至此,整个过程已经走完一次。所以,得到这个思路后,写代码就容易多了。

<!DOCTYPE html>
<html>

<head>
	<title>Test4</title>
	<meta http-equiv="Content-type" content="text/html;charset=utf-8" />
	<style type='text/css'>
		.box{ width:500px; margin:20px auto; }
		.box ul{list-style: none;}
		.box ul li { width:10px; height: 10px; background-color: #ccc; float:left;}
	</style>
</head>

<body>
	<div id='box' class='box'>
		<ul>
			<li></li>
			<li></li>
			<li></li>
			<li></li>
			<li></li>
			<li></li>
			<li></li>
			<li></li>
			<li></li>
			<li></li>
			<li></li>
			<li></li>
		</ul>
	</div>
</body>
<script type="text/javascript">

	//颜色数组(简称B)
	var colorArr = [ '#FF0000', '#FF3300', '#FF6600', '#FF9900', '#FFCC00' ];
	var liIndex = 0; //这里是一个数组游标,标记当前从哪个位置开始变化设置颜色
	var liArr = undefined; //进行变化的对象

	init();

	//初始化
	function init(){

		//我这里用的是li标签,如果你的是div,则将所有需要变化的div存在在一个变量中,我这里放的是liArr这个变量.
		liArr = document.getElementById('box').children[0].children; //简称A对象

		//调用跑马灯函数
		fLEDScroller();
	}

	function fLEDScroller(){

		//偏移量
		var offset = 0;

		//当超出变化对象长度时,但我们仍然需要把后续的颜色给走完,此时,我们假想给变化对象(A)加长len个长度,这个len就是颜色数组(B)的长度,这样加长后,能够让B继续走完,而我们在看到时,因为是假想的,所以相当于隐藏掉超出的颜色,看到的是还未走完的颜色。
		if( liIndex - liArr.length + 1  > 0 ){
			offset = liIndex - liArr.length + 1;
		}

		//但是如果假想的长度超过颜色数组(B)的长度时,说明颜色数组(B)已经走完了,可以恢复到初始的位置重新进行一次变化。
		if( offset > colorArr.length ){
			liIndex = 0;
			offse = 0;
		}

		//i的初始值,分两种情况,1是当游标未超出对象A的长度时,offset=0,2是当游标超出对象A的长度,offset=游标-对象A长度(即得到偏移量),上面已经进行了处理,这里是再说明一下,j的值就等于偏移量的值
		for(  var i = liIndex - offset, j = offset; i>=0 ; i--, j++ ){				

			//当偏移量并未超出颜色数组B的长度时,设置颜色
			if( j <colorArr.length ){
					liArr[i].style.backgroundColor = colorArr[j];
			}
			else{
				liArr[i].style.backgroundColor = '#ccc'; //当超出时,设置为默认的颜色
			}
		}

		//游标自增,进行移动
		liIndex++;

		//间隔100毫秒进行一次变化
		setTimeout( 'fLEDScroller()', 40 );
	}

</script>
</html>
时间: 2024-10-25 01:00:19

LED跑马灯效果的相关文章

iOS LED跑马灯效果实现

iOS中实现LED跑马灯效果 实现原理是使用scrollView, 将需要滚动的label添加两次到 scrollView的subView下面, 然后通过滚动scrollView来实现跑马灯效果. 具体实现代码如下: // // KMScrollLabel.swift // StopSmokingPrograms // // Created by Fran on 15/11/2. // Copyright © 2015年 kimree. All rights reserved. // impor

2、按下按键S1控制LED1.LED2.LED3实现跑马灯效果(CC2540开发寄存器设置)

按下按键S1控制LED1.LED2.LED3实现跑马灯效果 1 /**************************************************************************** 2 * 文 件 名: main.c 3 * 作 者: Amo [ www.amoMcu.com 阿莫单片机] 4 * 修 订: 2014-04-08 5 * 版 本: 1.0 6 * 描 述: 按下按键S1控制LED1.LED2.LED3实现跑马灯效果 7 ***********

练习:WinForm 跑马灯效果+Timer

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Timer { public partial class Form1 : Form { public Form1

Android TextView跑马灯效果

TextView跑马灯简单效果 <!--简单示例--> <TextView android:text="@string/longWord" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/textView1" android:ellipsize="marquee&quo

android 怎么实现跑马灯效果

自定义控件 FocusedTextView, 使android系统误以为它拥有焦点 1 public class FocusedTextView extends TextView { 2 public FocusedTextView(Context context, AttributeSet attrs, int defStyle) { 3 super(context, attrs, defStyle); 4 // TODO Auto-generated constructor stub 5 }

框架,锚点,背景音乐,嵌入视频和跑马灯效果

框架,iframe有点过时,会在部分浏览器出现一些奇怪的问题:设置三个属性: 1.src,框架默认的显示路径 2.name,让超链接的target属性与name值相等,就可以将超链接网页在框架中打开 3.框架的宽度和高度 站点:实际上就是一个文件夹,单独起了一个名字.统一来管理所有页面,就是一个站点,称之为网站 锚点: 书写格式:<a href="#锚点位置对应的名称">内容</a> --#是在本页面中 <a name="锚点位置的名称"

jCarousel Lite 实现图片跑马灯效果

官方网站:http://www.gmarwaha.com/jquery/jcarousellite/ demo: <!DOCTYPE> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <script src="http://libs.baidu.com/jquery/1.9.0/jquer

Android界面(1) 使用TextView实现跑马灯效果

方法一:(只能实现单个TextView的跑马灯效果)在TextView添加以下控件 android:singleLine="true"只能单行,超出的文字显示为"..." android:ellipsize="marquee"省略号没有,但没有跑马灯效果 android:focusable="true" android:focusableInTouchMode="true" 方法二:(可以实现多行TextV

安卓TextView的跑马灯效果

跑马灯效果的实现非常简单,可分为两步 1.定义一个View继承TextView,重写isFocused方法 package com.jsako.marquee; import android.content.Context; import android.util.AttributeSet; import android.view.ViewDebug.ExportedProperty; import android.widget.TextView; public class MarqueeTex