首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >数字标牌应用程序(as3)

数字标牌应用程序(as3)
EN

Stack Overflow用户
提问于 2013-01-08 22:42:48
回答 2查看 665关注 0票数 1

我正在尝试为我工作的公司开发一个数字标牌应用程序,使用flash cs6。它实际上由两个应用程序组成,一个是服务器端,另一个安装在具有运行windows xp的集成计算机的电视显示器上。服务器应用程序只是一个表单,管理员可以使用它通过一些php输入存储在mysql数据库中的数据。这工作得很好。

我的问题是在显示器中运行的客户端。这个应用程序实际上非常简单:它应该从mysql表中加载不同类型的信息的“部分”,因此加载的文本、图像和视频都存储在服务器中。问题是加载器与定时器并行运行。定时器负责调用movieclips和frames,这样我就不需要在时间线上对所有内容进行动画处理,应用程序就会在循环中从一个部分运行到另一个部分。这就是我发现问题的地方。我找不到一种合适的方法来编程这样的加载器,以一种与计时器很好地配合的方式。因此,最终的结果是图像和视频被部分加载或从未加载,使得客户端应用程序以奇怪的方式运行。以下是该应用程序的其中一个部分的示例:

代码语言:javascript
复制
import flash.utils.Timer;
import flash.display.MovieClip;
import flash.events.Event;
import flash.events.TimerEvent;
import fl.transitions.*;
import fl.transitions.easing.*;


var randomNumber:Number = Math.random();
var xAnivItemRef:Number = 75;
var yAnivItemRef:Number = 140;
var anivArray:Array = new Array  ;
var endingTimer:Timer = new Timer(10000);
var loopTimer:Timer = new Timer(500);
var counter:uint = 0;
var fotosURL:String = "http://www.maxionline.com.br/maxi_sds/server/img/aniversariantes/";
var current_time = new Date();
var i:uint = 0;
var alphaTween:Tween;
var aniversariante_mc:MovieClip;
var numAniversariantes:uint;


endingTimer.addEventListener(TimerEvent.TIMER, leaveEvents);
loopTimer.addEventListener(TimerEvent.TIMER, loadAniv);


function setTitleMonth(event:Event = null)
{
          var month:String = current_time.getMonth();
          switch (month)
          {
                    case "0" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "janeiro!";
                              break;


                    case "1" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "fevereiro!";
                              break;


                    case "2" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "março!";
                              break;


                    case "3" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "abril!";
                              break;


                    case "4" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "maio!";
                              break;


                    case "5" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "junho!";
                              break;


                    case "6" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "julho!";
                              break;


                    case "7" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "agosto!";
                              break;


                    case "8" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "setembro!";
                              break;


                    case "9" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "outubro!";
                              break;


                    case "10" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "novembro!";
                              break;


                    case "11" :
                              anivTitle_mc.anivTitlePt2_mc.month_txt.text = "dezembro!";
                              break;


                    default :
                              break;
          }
}


function anivSetup(event:Event = null):void
{
          var anivLoader:URLLoader = new URLLoader();
          anivLoader.dataFormat = URLLoaderDataFormat.TEXT;
          anivLoader.load(new URLRequest("http://www.maxionline.com.br/maxi_sds/client/dataRecoverAniv.php?_rand =" + randomNumber));
          anivLoader.addEventListener(Event.COMPLETE, getAnivData);
}


function getAnivData(evt:Event = null):void
{
          var anivDataStr:String = evt.target.data;
          var anivDataArray:Array = anivDataStr.split("&");
          var numItemsStr:String = anivDataArray[anivDataArray.length - 1].substr(5);
          var numItems:Number = Number(numItemsStr) * 4;
          numAniversariantes = numItems/4;
          anivDataArray.splice(anivDataArray.length - 1, 1);


          for (var i:uint=0; i<numItems; i++)
          {
                    anivArray.push(anivDataArray[i]);
          }
          loadAniv();
          anivMask_mc.gotoAndPlay("on");
          endingTimer.start();
          loopTimer.start();
}


function loadAniv(event:Event = null):void
{
          var aniversariante:anivItem_mc = new anivItem_mc();
          aniversariante.name = "aniversariante" + counter;

          if (numAniversariantes > 12)
          {
                    if (counter < 4)
                    {
                              aniversariante.y = yAnivItemRef + (220 * counter);
                              aniversariante.x = xAnivItemRef;
                    }
                    if (counter >= 4 && counter < 8)
                    {
                              aniversariante.y = yAnivItemRef + (220 * (counter - 4));
                              aniversariante.x = xAnivItemRef + 1355;
                    }
                    if (counter >= 8 && counter < 12)
                    {
                              aniversariante.y = yAnivItemRef + (220 * (counter - 8));
                              aniversariante.x = xAnivItemRef + 250;
                    }
                    if (counter >= 12 && counter < 16)
                    {
                              aniversariante.y = yAnivItemRef + (220 * (counter - 12));
                              aniversariante.x = xAnivItemRef + 895;
                    }
          }
          if (numAniversariantes > 8 && numAniversariantes <= 12)
          {
                    if (counter < 4)
                    {
                              aniversariante.y = yAnivItemRef + (220 * counter);
                              aniversariante.x = xAnivItemRef;
                    }
                    if (counter >= 4 && counter < 8)
                    {
                              aniversariante.y = yAnivItemRef + (220 * (counter - 4));
                              aniversariante.x = xAnivItemRef + 1355;
                    }
                    if (counter >= 8 && counter < 12)
                    {
                              aniversariante.y = yAnivItemRef + (220 * (counter - 8));
                              aniversariante.x = xAnivItemRef + 250;
                    }
          }
          if (numAniversariantes > 0 && numAniversariantes <= 8)
          {
                    if (counter < 4)
                    {
                              aniversariante.y = yAnivItemRef + (220 * counter);
                              aniversariante.x = xAnivItemRef + 200;
                    }
                    if (counter >= 4 && counter < 8)
                    {
                              aniversariante.y = yAnivItemRef + (220 * (counter - 4));
                              aniversariante.x = xAnivItemRef + 1150;
                    }
          }
          anivLoader_mc.addChild(aniversariante);
          aniversariante_mc = MovieClip(root).aniv_mc.anivLoader_mc.getChildByName("aniversariante" + counter);
          aniversariante_mc.anivName_txt.text = anivArray[i];
          aniversariante_mc.day_mc.anivDay_txt.text = anivArray[i + 1];


          var imgLoader:Loader = new Loader();
          imgLoader.load(new URLRequest(fotosURL + anivArray[i + 3]));
          imgLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGR ESS,imageLoading);
          imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE,imag eLoaded);


          var fadein:TransitionManager = new TransitionManager(aniversariante_mc);
          fadein.startTransition({type:Fade, direction:Transition.IN, duration:1, easing:Strong.easeOut});


          counter++;
          i = i + 4;


          if (i >= anivArray.length)
          {
                    loopTimer.stop();
                    loopTimer.removeEventListener(TimerEvent.TIMER, loadAniv);
          }
}


function leaveEvents(event:TimerEvent):void
{
          endingTimer.removeEventListener(TimerEvent.TIMER, leaveEvents);
          endingTimer.stop();
          anivMask_mc.gotoAndPlay("off");
          play();
}


function imageLoading(evt:ProgressEvent):void
{
          var loaded:Number = evt.bytesLoaded / evt.bytesTotal;
          updateProgress(loaded);
}


function updateProgress(vl:Number)
{
          aniversariante_mc.photo_mc.preloader_mc.loadingBar_mc.width = vl * aniversariante_mc.photo_mc.preloader_mc.loadingBar_mc.width;
}


function imageLoaded(event:Event):void
{
          var loadInfo:LoaderInfo = (event.target as LoaderInfo);
          aniversariante_mc.photo_mc.photoLoader_mc.addChild(loadInfo.cont ent);
}


anivSetup();
setTitleMonth();


stop();

可以从以下位置下载.fla:

http://www.maxionline.com.br/maxi_sds/sds_client.fla

任何建议都将不胜感激!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-09 04:09:09

后退一步,放眼全局...

我已经使用Flash构建了一个数字标牌类型的应用程序,其中包含从服务器提供的内容,目前正在开始第四年的更新。在我看来,一些普遍的想法是:

  1. 不要将传统的闪光时间轴用于程序的主要流程。取而代之的是使用ActionScript3编程来做所有的事情。这应该会消除一些无法正确显示的问题,但更重要的是将允许更大的缩放能力。这也将允许您在动态插入内容时进行更好的控制。
  2. 有一个顶级的“管理器”类来管理你要循环的内容的“播放列表”。当内容播放完成时,它应该通知“管理器”已完成(或失败),以便管理器可以立即播放下一个内容项。这将需要在适用的情况下添加事件侦听器和处理程序,在某些情况下可能会替换计时器。
  3. 将所有代码保存在类文件(ClassName.as)中,并将它们组织到文件夹(名称空间)中。不要有任何位于随机关键帧上的内联Actionscript。你可以使用“导出到Actionscript”选项将库项目链接到类。
  4. 使你的主类尽可能小,将尽可能多的代码推到单独的类文件中。
  5. 大多数动画和补间都可以使用TweenLiteTimelineMax家族的包来完成。
  6. 任何像徽标这样的动画都应该包含在它自己的MovieClip /库对象/类中,这样你就可以很容易地将它插入到任何地方。对于您的徽标的动画,你应该不会有任何问题,使用传统的时间线动画,如果它包含。
  7. 将所有服务器内容下载到本地机器上,然后让闪存在本地读取所有内容。这应该会消除对内容的长时间等待,特别是当互联网陷入困境时。
  8. 为每种内容类型(视频、图像幻灯片、简介动画等)都有一个类。这将允许您插入自定义内容。
  9. 尽可能多地使用XML或JSON。

我希望这能有所帮助。

票数 1
EN

Stack Overflow用户

发布于 2014-11-11 07:13:35

你可以使用一个名为'Xibo‘的在线开源软件,它非常有用,也许能够满足你的需求。https://springsignage.com/xibo-for-android/

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14217420

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档