建站学 - 轻松建站从此开始!

建站学-个人建站指南,网页制作,网站设计,网站制作教程

当前位置: 建站学 > 图像设计 > Flash教程 >

flash分页技巧(传统基础上的改进)

时间:2011-10-02 21:02来源: 作者: 点击:
一、建立分页从何下手? 在得到ego老大的支持和其他朋友的鼓励下,通过一段时间的准备,写了这篇继“关于图片切换的制作方法”之后的第二篇教程,之前我在网上看过一些人写的例子,但总感觉像是一个模子刻出来的,这其中不难发现肯定存在着copy,当然我不反对这样

一、建立分页从何下手?

在得到ego老大的支持和其他朋友的鼓励下,通过一段时间的准备,写了这篇继“关于图片切换的制作方法”之后的第二篇教程,之前我在网上看过一些人写的例子,但总感觉像是一个模子刻出来的,这其中不难发现肯定存在着copy,当然我不反对这样。不过在这里我想先岔开个话题,现在网上公开的源代码很多,你完全可以把别人的东西拿来修改然后使用,但是要记住一点,如果代码里面,你编写的东西没有超过50%以上的话,千万别说这个代码是你写的,因为这是做人最基本的道德问题,而且对于学习者来说这也是自欺欺人,水平永远都停留在这个阶段,要知道自己写一遍代码,学到的东西可能不光是代码本身,更重要的是学会了思考,很多人问我同样一个问题,想做一个效果该从哪做起呢?我的回答是“思考+实践”。我通过自己学习,总结出来的经验就是,学习编程其实就是学的一种思想,代码只是一种实现的手段,千万不要为了学代码而学代码。就拿这个贴子的话题来说吧,当你想写一个分页程序的时候,你首先考虑到的是什么呢?我的建议是:

1、先将外部数据调入数组(为什么要使用数组,后面会讲到);
2、设定每页需要显示多少,至少需要这些自定义参数:行、列、(数组)元素总数;
3、将数组中的数据有选择性的输出;
4、增加显示特效。
  
(注:本教程以算法为主,代码不作为主要内容,因为方法不唯一)
下面我们就从第一步做起,有些人可能不习惯使用数组,但是它的优点真的很多,管理方便,而且能帮助我们提高效率,寻找它们就像寻找数据库的记录一样,想要什么数据一目了然。下面这段代码就是把xml节点数据读入数组:

    Load = function () { 
        var intro = myXML.firstChild; 
        var len:Number = intro.childNodes.length; 
        for (i=0; i<len; i++) { 
            box[i] = new Array(); 
            box[i][0] = intro.childNodes[i].attributes.spath; 
            box[i][1] = intro.childNodes[i].attributes.path; 
            box[i][2] = intro.childNodes[i].attributes.url; 
            box[i][3] = intro.childNodes[i].attributes.title; 
            box[i][4] = intro.childNodes[i].attributes.description; 
        } 
        record = len; 
        pages = Math.ceil(len/total); 
        if (i == len) { 
            refreshmenu(page); 
        } 
    };

读取结束以后,下面才是核心问题,如何将图片输出呢,我们可以根据自己预设的行、列参数来让它自动输出,但是单纯这样输出的话是不会分页的,所以我们要从中针对行、列分别进行一下判断,代码如下:

 

    refreshmenu = function (page) { 
        var i:Number = 0; 
        var j:Number = 0; 
        var num:Number = 0; 
        copy = function () { 
            if (i<hang) { 
                if (j<lie) { 
                    if (total1<=total) { 
                        CreateClip(i, j, num, box[num+(page-1)*total][0], box[num+(page-1)*total][1], box[num+(page-1)*total][2], box[num+(page-1)*total][3], box[num+(page-1)*total][4]); 
                        thecount = ((page-1)*total)+count; 
                        count++; 
                        j++; 
                        num++; 
                        total1++; 
                    } 
                    if (total1>total) { 
                        total1 = 1; 
                        count = 0; 
                        i = 0; 
                        j = 0; 
                        nb.gotoAndStop(1); 
                        pb.gotoAndStop(1); 
                        clearInterval(control); 
                        ListMenu(); 
                    } 
                } else { 
                    j = 0; 
                    i++; 
                } 
            } 
        }; 
        var control = setInterval(copy, 50); 
    };

上面这段代码没有什么难点,都是一些计数器之类的,关键是上面CreateClip自定义函数,通过它把数组里面的数据和图片的计数器变量读取出来,然后对其进行有选择性的输出。
这里是自定义函数的内部结构:

    CreateClip = function (i:Number, j:Number, num:Number, thespath:String, thepath:String, theurl:String, thetitle:String, thedescription:String) { 
        var movie = mc.createEmptyMovieClip("mc"+i+j, num); 
        dx = movie.attachMovie("tu", "tu1", 1); 
        dx._x += (dx._width+feng_x)*j+x; 
        dx._y += (dx._height+feng_y)*i+y; 
        dx.msg.selectable = false; 
        dx.msg.text = thetitle; 
        dx.imgs = thespath; 
        dx.link = theurl; 
    };

上面有两个变量没有用到(thepath、 thedescription),这是为了以后扩展用的,比如做个图片放大读取或者相关信息描述之类的都可以,这里相当于个接口,但是因为他们所涉及到的内容和本教程无关,所以这里不作为研究对象(这里可以当他们不存在)。其中每个图片(dx)里面的第一帧也有一些代码,不过只是限制图片大小和加载图片的简短代码,老声常谈的东西这里就不赘述了。
之后我们再继续添加关于翻页按钮输出:

 

    ListMenu = function () { 
        var menupath = mc.menu.menu1; 
        menu._x = x+30; 
        menu_y = y+hang*(dx._height+feng_y); 
        menu._y = menu_y; 
        menupath.up.onRelease = function() { 
            if (page == 1) { 
            } else { 
                page--; 
                refreshmenu(page); 
            } 
            gotoAndStop(1); 
        }; 
        menupath.down.onRelease = function() { 
            if (page == pages) { 
            } else { 
                page++; 
                refreshmenu(page); 
            } 
            gotoAndStop(1); 
        }; 
        menupath.makesure.onRelease = function() { 
            if ((menupath.jump.text>pages) || (menupath.jump.text<1)) { 
                menupath.jump.text = page; 
                makesure = true; 
            } else { 
                page = menupath.jump.text; 
                refreshmenu(page); 
            } 
        }; 
        mc.menu.menu1.totaltxt.selectable = false; 
        mc.menu.menu1.pagetxt.selectable = false; 
        mc.menu.menu1.totaltxt.text = "--共"+pages+"页--"; 
        mc.menu.menu1.pagetxt.text = "--第"+page+"页--"; 
    };

这样,一个分页展示的雏形基本就已经出来了,下面给出了源文件fenye.rar,但是这样程序是不健全的,我们可以从中看到很多的不完善:

1、最后一页图片出现undefined;
2、狂点翻页按钮,显示会出现问题,因为图片是循环输出的,有时间间隔,当还没完全输出的时候,又点击了另外一组图片,所以显示就会错误了;

在下面我们就继续来分析如何解决上述bug。
fenye.rar

二、如何完善你的程序?

什么样的程序才能算是完善呢,首先你的程序的bug要全部得到解决,所以你可以让别人来帮你一起测试,做到万无一失;第二点是你的程序功能是否可以扩展,如果我们需要做很多程序,而其中有些东西是可以再利用的,如果前期工作没有做好的话,那么很可能你要把代码再重新写一遍,做重复性的工作,所以我们在写程序的时候,要多想想后面你会碰到什么样的问题以方便将来程序的扩展;还有一点,你的想法是否“另类”,能够让你的效果看上去与众不同。
下面我们就来一步步解决这些问题。针对第一点,程序中出现的undefined是因为他们是多余的,没有数据传输过去,所以我们应该想办法把他们屏蔽掉。
我做了如下修改:

    if (total1<=total) { 
        if (total1<=flag) { 
            CreateClip(i, j, num, box[num+(page-1)*total][0], box[num+(page-1)*total][1], box[num+(page-1)*total][2], box[num+(page-1)*total][3], box[num+(page-1)*total][4]); 
            thecount = ((page-1)*total)+count; 
            count++; 
            j++; 
        } else { 
            var movie = mc.createEmptyMovieClip("mc"+i+j, num); 
            movie.removeMovieClip(); 
        } 
        num++; 
        total1++; 
    }

我新引入了一个变量flag,是用来判断本页应该显示几张图片的,var movie = mc.createEmptyMovieClip(”mc”+i+j, num);movie.removeMovieClip();
这两句是用来屏蔽undefined用的。
关于防止用户狂点按钮,我们可以采取当图片正在显示过程中,让按钮失效的做法,再引入一个变量makesure,把按钮代码做如下修改:

    menupath.up.onRelease = function() { 
        if (makesure == true) { 
            makesure = false; 
            if (page == 2) { 
                menupath.up._visible = false; 
            } else { 
                menupath.up._visible = true; 
                menupath.down._visible = true; 
            } 
            page--; 
            refreshmenu(page); 
        } 
        gotoAndStop(1); 
    }; 
    menupath.down.onRelease = function() { 
        if (makesure == true) { 
            makesure = false; 
            if (page == pages-1) { 
                menupath.down._visible = false; 
            } else { 
                menupath.up._visible = true; 
                menupath.down._visible = true; 
            } 
            page++; 
            refreshmenu(page); 
            gotoAndStop(1); 
        } 
    }; 
    menupath.makesure.onRelease = function() { 
        if (makesure == true) { 
            makesure = false; 
            if ((menupath.jump.text>pages) || (menupath.jump.text<1)) { 
                menupath.jump.text = page; 
                makesure = true; 
            } else { 
                page = menupath.jump.text; 
                refreshmenu(page); 
            } 
            if (page == 1) { 
                menupath.up._visible = false; 
                menupath.down._visible = true; 
            } else if (page == pages) { 
                menupath.up._visible = true; 
                menupath.down._visible = false; 
            } else { 
                menupath.up._visible = true; 
                menupath.down._visible = true; 
            } 
        } 
    };

现在来讲,一个分页展示就已经完成了,测试一下吧~~!见(fenye1.rar)

******************************************************************

(进阶教程——-图片飞入)

现在网站上流行的主要是一些比较动感的特效,在这里,我做的是让每张图片按先后次序连续飞入场景的特效,代码如下:

    PicIn = function () { 
        for (i=0; i<hang; i++) { 
            for (j=0; j<lie; j++) { 
                mc["mc"+i+j]._y += (InTarget-mc["mc"+i+j]._y)*0.2; 
            } 
        } 
    };

因为之前我们已经将每个图片在场景中实例化了,所以我们可以利用他们来做出一些效果出来。
这里我突然又有了一个想法,如果能让翻页按钮随着行高的不同而跟随的变化的话,感觉也蛮不错的,但是怎样让他知道当前的高度是多少呢?经过思考,我的算法是这样的:

    if (page == pages) { 
        menu_y = y+Math.ceil(flag/lie)*(dx._height+feng_y); 
    } else { 
        menu_y = y+hang*(dx._height+feng_y); 
    }

经过判断,如果没有到达最后一页的话,高度直接按照规定的行高就可以,否则把当前的行高重新计算再赋值。这样,图片飞入的效果就实现了。代码不算难,关键还是一个思路的问题。
(见fenye2.rar)
fenye1.rar
fenye2.rar

三、我的创意我作主

下面是我加的一些效果,供大家参考。我个人认为,一个好的设计者,最重要的因素就是创造力。

这个程序的扩展性很好,只需很少改动甚至只修改1~2处地方,就可以应用在其他方面,比方说新闻列表,mp3、视频播放器列表等等,因为我已经有成功案例了,节省了大量的时间开发重复性工作,所以这里拿出来和大家一起分享。记住:因为你们快乐,所以我很快乐~!

方法总结:
1、利用数组保存临时数据;
2、通过判断语句的嵌套,达到限制每页图片输出的目的;
3、CreateClip传值方法;
4、缓冲移动效果的运用。

附加小程序:
“动态文本框的调用”:也许大家已经注意到了,范例中的题目是通过调用TextField类来实现的,如果不了解这方面使用方法的话,上面的源文件已经给出了范例的应用,作为你学习本教程的额外收获吧~!

(责任编辑:admin)
织梦二维码生成器
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
表情:
用户名: 验证码:点击我更换图片