一体广告机实现思路,非常实用(二)

继续昨天未完成的工作,昨天主要介绍了一体机开发的主要功能(一体广告机实现思路,非常实用(一)),今天主要介绍实现逻辑(代码层面)。也许有些人会认为实现起来很简答,也许不会的人可能比登天还难,O(∩_∩)O哈哈~,我就来简单介绍下。也许我说的方法不是最好的,希望你能提供更好的方法,大家一起学习交流了,共同进步。

我所使用的广告滚动使用的是flash来实现,调用了VS的Interop.ShockwaveFlashObjects.dll文件,这个VS自带的。首先是屏蔽flash右键的实现代码(主要作用是单击右键不会出现其他菜单,否则就会出现点击右键有其他菜单显示,这肯定不符合广告的要求的,所以必须要屏蔽flash右键,实现逻辑也是调用钩子去屏蔽右键):

 1         #region * 屏蔽FLASH右键
 2         //此段代码实现调用系统函数,来实现窗体
 3         //加载flash时,可以屏蔽其右键
 4         private const int GWL_WNDPROC = -4;
 5         public delegate IntPtr FlaWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
 6
 7         private IntPtr OldWndProc = IntPtr.Zero;
 8         private FlaWndProc Wpr = null;
 9
10         [DllImport("user32.dll", CharSet = CharSet.Auto)]
11         public static extern IntPtr SetWindowLong(IntPtr hWnd, int nIndex, FlaWndProc wndProc);
12         [DllImport("user32.dll", CharSet = CharSet.Auto)]
13         public static extern IntPtr CallWindowProc(IntPtr wndProc, IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);
14         //给此控件一个特定消息值
15         private IntPtr FlashWndProc(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam)
16         {
17             if (msg == 516)
18                 return (IntPtr)0;
19             return CallWindowProc(OldWndProc, hWnd, msg, wParam, lParam);
20         }
21         #endregion

FormLoad加载flash,并设定程序的分辨率(更加广告机的分辨率去设定,这样避免程序显示不正确,因为要控制广告机除了播放滚动的图片之外,就是跳转相应的网站,而不允许进行桌面,否则别人就会做很多其他操作了,所以这点必须要控制的,而且图片的分辨率也是这样的,所以这样就这样就固定死程序的分辨率了),并且加载swf文件,并开始play,实现flash滚动,实现代码如下:

 1             this.Width = 1080;
 2             this.Height = 1920;
 3             this.Location = new Point(0, 0);
 4             //--
 5             this.timer1.Enabled = true;
 6             this.timer1.Interval = 100;
 7             this.timer1.Start();
 8             //--
 9             //屏蔽右键
10             this.Wpr = new FlaWndProc(this.FlashWndProc);
11             this.OldWndProc = SetWindowLong(axShockwaveFlash1.Handle, GWL_WNDPROC, Wpr);
12             //--加载FLASH
13             this.axShockwaveFlash1.Movie = Application.StartupPath + @"//Flash//apaperstudio.swf";
14             axShockwaveFlash1.Play();
15             //--
16             ReadUserInfo();//--读取用户信息
17             //--
18             LoadWeb();//--预加载网站

读取用户信息是XML文档,这样可以进行在现场进行配置,使用起来就比较方便。

 1         /// <summary>
 2         /// 读取用户信息
 3         /// </summary>
 4         protected virtual void ReadUserInfo()
 5         {
 6             //--从autorun.xml文件中读取配置文件
 7             string autPath = "";
 8             autPath = Application.StartupPath + @"//autorun.xml";//配置文件目录
 9             if (!File.Exists(autPath))//判断程序目录是否存在配置文件
10             {
11                 MessageBox.Show("配置文件不存在,请联系管理员!");
12                 return;
13             }
14             XmlDocument xmldoc = new XmlDocument();
15             xmldoc.Load(autPath);//加载XML文件
16             XmlNodeList audList = xmldoc.SelectSingleNode("Root").ChildNodes;//获取Root节点的所有子节点
17             foreach (XmlNode xn in audList)//遍历所有子节点
18             {
19                 XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
20                 userIDStr = xe.GetAttribute("UserID");//用户ID
21             }
22         }

XML文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<Root>
  <Para TerminalID="1111" AreaID="85" Airport="福田" AirportPlace="A1" UserID="adminUserId" Version="14" />
</Root>

预加载网站实现代码如下,这些数据都是通过升级程序下载到,并保存在本地,再供一体机程序调用:

 1         /// <summary>
 2         /// 预加载网站
 3         /// </summary>
 4         protected virtual void LoadWeb()
 5         {
 6             //--从ADXml.xml文件中读取广告列表
 7             string autPath = "";
 8             autPath = Application.StartupPath + @"//ADXml.xml";//广告列表目录
 9             if (!File.Exists(autPath))//判断程序目录是否存在广告列表
10             {
11                 MessageBox.Show("广告列表不存在,请联系管理员!");
12                 return;
13             }
14             XmlDocument xmldoc = new XmlDocument();
15             xmldoc.Load(autPath);//加载XML文件
16             XmlNodeList audList = xmldoc.SelectSingleNode("ADRoot").ChildNodes;//获取ADRoot节点的所有子节点
17             foreach (XmlNode xn in audList)//遍历所有子节点
18             {
19                 XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
20                 string url = xe.GetAttribute("url");//预加载的网址
21                 webBrowser1.Navigate(url);
22                 System.Threading.Thread.Sleep(5000);//--休眠5S
23             }
24         }

广告XML文件:

<?xml version="1.0" encoding="UTF-8"?>
<ADRoot>
  <AD name="终端7" imgLink="attachments/imgs/ad/201111/016965953952723834xorg.jpg" url="www.darenbang.com/taoletao/front/activity/activityIndex.do" area="85" place="福田" />
  <AD name="终10" imgLink="attachments/imgs/ad/201111/066067356307548920xorg.jpg" url="www.darenbang.com/taoletao/front/bbase/productSearch.do?type=2&amp;Q_newProduct_SN_EQ=1" area="85" place="福田" />
  <AD name="终端9" imgLink="attachments/imgs/ad/201111/012278613580213338xorg.jpg" url="www.darenbang.com/taoletao/front/index/channelsPage.do?categoryId=7" area="85" place="福田" />
  <AD name="终端4" imgLink="attachments/imgs/ad/201111/052606357223467712xorg.jpg" url="www.darenbang.com" area="85" place="福田" />
  <AD name="终端5" imgLink="attachments/imgs/ad/201111/023391954847731068xorg.jpg" url="www.darenbang.com/taoletao/front/activity/activityBuyer.do" area="85" place="福田" />
  <AD name="终端6" imgLink="attachments/imgs/ad/201111/007393856959106082xorg.jpg" url="www.darenbang.com/taoletao/front/activity/activityFront.do" area="85" place="福田" />
</ADRoot>

点击FLASH图片跳转网站,再通过连接打开相应的网站,这个在flash代码进行了定义,所以使用cmd命令就可以打开相应的网站,再根据链接跳转到相应的网站,打开的网站也之前在我们的程序中进行打开,使用的是webBrowser控件,这样就控制只能打开我们所指定的网站。

 1         #region * 点击FLASH图片跳转网站
 2         private void axShockwaveFlash1_FSCommand(object sender, AxShockwaveFlashObjects._IShockwaveFlashEvents_FSCommandEvent e)
 3         {
 4             if (e.command == "cmd")
 5             {
 6                 WebForm xForm = new WebForm(e.args.ToString() + "?id=" + userIDStr);//设定跳转的网站+用户ID
 7                 xForm.Show();
 8             }
 9         }
10         #endregion

程序启动时会调用Timer事件,启动程序升级,在相应的时间节点(可以设定多个时间检测是否需要升级)进行升级。

 1         #region * 启动升级程序
 2         ArrayList AutoTask = new ArrayList();
 3         private void timer1_Tick(object sender, EventArgs e)
 4         {
 5             System.DateTime dtAuto = DateTime.Now;
 6             AutoTask.Add("00:00:00");
 7
 8             for (int n = 0; n < AutoTask.Count; n++)
 9             {
10                 if (dtAuto.ToLongTimeString().Equals(AutoTask[n]))
11                 {
12                     System.Diagnostics.Process.Start(Application.StartupPath + @"\\AutoUpdater.exe");         //启动程序
13                     this.Close();//--关闭升级程序
14                     this.Dispose();
15                 }
16             }
17         }
18         #endregion

升级程序会做几件事情:

1. 通过Webservice下载一体机的程序,根据版本号比较决定是否需要升级。

2. 通过Webservice下载一体机的广告图片,这样在相应的网站后台对图片进行维护,将广告数据保存在本地的XML文件中,供程序读取XML文件。

通过WebService下载数据,程序或广告图片,实现逻辑如下:

        #region * 通过WebService下载数据
        public virtual void DownloadWebServiceData()
        {
            //--绑定Webservice
            ws = new AutoUpdater.WebService.AdvertisWebServicesService();
            ws.Url = "http://www.fmafia.com/taoletao/AdvertisWebServices.jws?wsdl";
            //--
            //--从autorun.xml文件中读取配置文件
            string autPath = "";
            autPath = Application.StartupPath + @"//autorun.xml";//配置文件目录
            if (!File.Exists(autPath))//判断程序目录是否存在配置文件
            {
                MessageBox.Show("配置文件不存在,请联系管理员!");
                return;
            }
            xmldoc.Load(autPath);//加载XML文件
            XmlNodeList audList = xmldoc.SelectSingleNode("Root").ChildNodes;//获取Root节点的所有子节点
            foreach (XmlNode xn in audList)//遍历所有子节点
            {
                XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
                idStr = Convert.ToInt32(xe.GetAttribute("TerminalID"));//终端机ID
                areaStr = Convert.ToInt32(xe.GetAttribute("AreaID"));//地区
                placeStr = xe.GetAttribute("Airport");//机场
                airportPlaceStr = xe.GetAttribute("AirportPlace");//机场位置
                userIDStr = xe.GetAttribute("UserID");//用户ID
                versionStr = Convert.ToInt32(xe.GetAttribute("Version"));//版本号
            }
            //--********************************************************************************************
            //--图片下载
            if (DownImage() == false) { return; };
            //--********************************************************************************************
            //--文件下载
            if (DownFile() == false) { return; };
        }
        #endregion

图片的下载,webservice接口由Java实现的,C#程序直接调用接口程序即可:

        #region * 图片下载
        /// <summary>
        /// 图片下载
        /// </summary>
        protected virtual Boolean DownImage()
        {
            //--**************************************************************************************************************************************
            //--第二步从webservice下载广告数据
            string xStr = "";
            try
            {
                xStr = ws.getAdvertisList(areaStr, placeStr);
            }
            catch (Exception)
            {
                MessageBox.Show("读取远程数据失败!");
                return false;
            }
            //--***************************************************************************************************************************************
            //--String类型XML转成XML文档
            XmlDocument doc = new XmlDocument();
            try
            {
                doc.LoadXml(xStr);//加载XML文档
            }
            catch (Exception xEr)
            {
                MessageBox.Show(xEr.Message);
                return false;
            }
            string xmlPath = "";
            xmlPath = Application.StartupPath + @"\ADXml.xml";//保存XML的路径
            //检测XML文件是否已存在
            if (File.Exists(xmlPath))
            {
                File.Delete(xmlPath);//删除该文件
                doc.Save(xmlPath);//保存XML文件
            }
            else
            {
                doc.Save(xmlPath);//保存XML文件
            }
            //--**************************************************************************************************************************************
            //--根据下载的广告XML数据重新生成一个新的XML文档,新XML文档即用于FLASH的加载图片所用
            if (File.Exists(xmlPath))
            {
                //--把广告XML文档数据写入临时Datatable1中
                xDataTable1.Clear();
                //--
                xmldoc.Load(xmlPath);//加载本地XML文件
                XmlNodeList nodeList = xmldoc.SelectSingleNode("ADRoot").ChildNodes;//获取ADRoot节点的所有子节点
                foreach (XmlNode xn in nodeList)//遍历所有子节点
                {
                    XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
                    DataRow xDataRow1 = xDataTable1.NewRow();
                    xDataRow1[0] = xe.GetAttribute("name");
                    xDataRow1[1] = CompanyUrl + xe.GetAttribute("imgLink");//--加入链接地址,即为图片下载地址
                    xDataRow1[2] = xe.GetAttribute("url");
                    xDataRow1[3] = xe.GetAttribute("area");
                    xDataRow1[4] = xe.GetAttribute("place");
                    xDataTable1.Rows.Add(xDataRow1);
                }
            }
            else
            {
                MessageBox.Show("广告数据并未存在,请联系管理员!");
                return false;
            }
            //--**************************************************************************************************************************************
            //--下载图片
            if (xDataTable1 != null)
            {
                for (int i = 0; i < xDataTable1.Rows.Count; i++)//循环下载图片
                {
                    //--
                    string ImagePath = "";
                    ImagePath = Application.StartupPath + @"\Flash\swf\" + xDataTable1.Rows[i]["Name"].ToString().Trim() + ".JPG";//检测图片是否已经存在
                    //检测图片文件是否已存在,如果已经存在不再进行下载,不存在则进行下载
                    if (!File.Exists(ImagePath))//检测文件是否存在
                    {
                        DownloadImage(xDataTable1.Rows[i]["Name"].ToString().Trim() + ".JPG", xDataTable1.Rows[i]["imgLink"].ToString().Trim());//调用数据下载方法
                    }
                    else
                    {
                        //如果图片文件已经存在,则不进行处理,自动跳过
                    }
                }
            }
            //--***************************************************************************************************************************************
            //--生成FLASH加载图片的XML文件
            xmldoc = new XmlDocument();
            //--加入XML生命段落
            XmlDeclaration xmldecl;
            xmldecl = xmldoc.CreateXmlDeclaration("1.0", "GB2312", null);//创建XML的头元素
            xmldoc.AppendChild(xmldecl);//添加元素
            //--加入一个根元素
            xmlelem = xmldoc.CreateElement("", "imgList", "");
            xmldoc.AppendChild(xmlelem);
            //--
            if (xDataTable1 != null)
            {
                //--循环DataTable写入XML文档中,用于FLASH的加载
                for (int i = 0; i < xDataTable1.Rows.Count; i++)
                {
                    //--在根节点中添加元素
                    XmlNode root = xmldoc.SelectSingleNode("imgList");
                    XmlElement xe1 = xmldoc.CreateElement("list");
                    xe1.SetAttribute("path", Application.StartupPath + @"\Flash\swf\" + xDataTable1.Rows[i]["Name"].ToString().Trim() + ".JPG");//FLASH加载图片地址
                    xe1.SetAttribute("info", "");//FLASH图片显示的描述,现不需要,暂时为空
                    xe1.InnerText = xDataTable1.Rows[i]["url"].ToString().Trim();//点击FLASH跳转的网站
                    root.AppendChild(xe1);
                }
            }
            xmldoc.Save(Application.StartupPath.ToString() + @"\\Flash\\imgList.xml");//FLASH加载的XML
            //--图片下载完成
            return true;
        }
        #endregion

        #region * 图片下载操作方法
        /// <summary>
        /// 图片下载操作方法
        /// </summary>
        /// <param name="FileName">图片名字</param>
        /// <param name="Url">图片下载地址</param>
        public virtual void DownloadImage(string FileName, string Url)
        {
            WebRequest request = WebRequest.Create(Url);
            WebResponse response = request.GetResponse();
            Stream reader = response.GetResponseStream();
            string FilePath = Application.StartupPath + @"//Flash//swf";//存放图片的文件夹
            //--检测文件夹是否存在
            if (!Directory.Exists(FilePath))
            {
                //如果不存在就创建该文件夹
                Directory.CreateDirectory(FilePath);
            }
            FileStream writer = new FileStream(FilePath + @"//" + FileName, FileMode.OpenOrCreate, FileAccess.Write);
            byte[] buff = new byte[5120];//--5M的图片
            int c = 0;
            //实际读取的字节数
            while ((c = reader.Read(buff, 0, buff.Length)) > 0)
            {
                writer.Write(buff, 0, c);
            }
            writer.Close();
            writer.Dispose();
            reader.Close();
            reader.Dispose();
            response.Close();
        }
        #endregion

以上可能显示比较多的是对XML的读写操作而已,相对而言比较简单。

文件下载的实现逻辑:

        #region * 文件下载
        /// <summary>
        /// 文件下载
        /// </summary>
        protected virtual Boolean DownFile()
        {
            //--**************************************************************************************************************************************
            //--第一步从webservice下载更新程序
            string xFileStr = "";//定义下载文件的路径
            try
            {
                xFileStr = ws.getUpdatePack(versionStr);//从webservice读取下载信息
            }
            catch(Exception)
            {
                MessageBox.Show("读取远程数据失败!");
                return false;
            }
            string xFileSavePath = "";//定义保存文件的路径
            xFileSavePath = Application.StartupPath + @"\\YTJ.exe";
            if (xFileStr != null)//--需更新文件
            {
                string xFileDowmLoadPath = CompanyUrl + xFileStr;//下载文件的路径
                if (File.Exists(xFileSavePath))//检测文件是否存在,如果存在则删除
                {
                   //先杀死进程中的文件
                    System.Diagnostics.Process[] ps = System.Diagnostics.Process.GetProcesses();
                    foreach (System.Diagnostics.Process p in ps)
                    {
                        if (p.ProcessName.ToLower() == "ytj")
                        {
                            p.Kill();//杀死进程
                            break;
                        }
                    }
                    //--
                    Thread.Sleep(2000);//--休眠2秒
                    File.Delete(xFileSavePath);//--删除文件
                    //--
                    DownloadFile(xFileSavePath, xFileDowmLoadPath);//文件下载
                    UpdateVersion();//版本号的更新
                    //--                }
                else//不存在直接创建
                {
                    DownloadFile(xFileSavePath, xFileDowmLoadPath);//文件下载
                    UpdateVersion();//版本号的更新
                }
            }
            else
            {
                //--如果文件的版本号相同,则不需要进行下载操作
                //--不需要更新文件,可直接打开应用程序
            }
            //启动程序
            //启动应用程序之前先杀死进程中的文件,防止程序多次打开
            System.Diagnostics.Process[] pss = System.Diagnostics.Process.GetProcesses();
            foreach (System.Diagnostics.Process p in pss)
            {
                if (p.ProcessName.ToLower() == "ytj")
                {
                    p.Kill();
                    break;
                }
            }
            System.Diagnostics.Process.Start("YTJ.exe");         //启动程序
            this.Close();//--关闭升级程序
            this.Dispose();
            //--
            //--****************************************************************************************************************************************
            //--文件更新完成
            return true;
        }

        /// <summary>
        /// 版本号的更新
        /// </summary>
        protected virtual void UpdateVersion()
        {
            //--文件更新后,配置文件XML文档中的版本号增加"1"。
            //--修改版本号
            //--从autorun.xml文件中读取配置文件
            string autPath = "";
            autPath = Application.StartupPath + @"//autorun.xml";//配置文件目录
            if (!File.Exists(autPath))//判断程序目录是否存在配置文件
            {
                MessageBox.Show("配置文件不存在,请联系管理员!");
                return;
            }
            xmldoc.Load(autPath);//加载XML文件
            XmlNodeList audList = xmldoc.SelectSingleNode("Root").ChildNodes;//获取Root节点的所有子节点
            foreach (XmlNode xn in audList)//遍历所有子节点
            {
                XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
                xe.SetAttribute("Version", Convert.ToString((versionStr + 1)));//修改版本号,并增加1
            }
            xmldoc.Save(autPath);//保存XML文件
        }
        #endregion

文件下载操作方法

        #region * 文件下载操作方法
        /// <summary>
        /// 文件下载操作方法
        /// </summary>
        /// <param name="FileName">文件名</param>
        /// <param name="Url">文件下载地址</param>
        public virtual void DownloadFile(string xFile, string Url)
        {
            WebRequest request = WebRequest.Create(Url);
            WebResponse response = request.GetResponse();
            Stream reader = response.GetResponseStream();
            FileStream writer = new FileStream(xFile, FileMode.OpenOrCreate, FileAccess.Write);
            byte[] buff = new byte[10240];//--10M的文件
            int c = 0;
            //实际读取的字节数
            while ((c = reader.Read(buff, 0, buff.Length)) > 0)
            {
                writer.Write(buff, 0, c);
            }
            writer.Close();
            writer.Dispose();
            reader.Close();
            reader.Dispose();
            response.Close();
        }
        #endregion

通过以上的介绍,也许很多人会觉得这实现起来非常简单,一些相对简单的代码即可实现了,不过你有没有好好想想,怎么实现动态的图片显示在flash里面,并且一点击flash图片调转到相应的网站,这又是怎么实现的,这也许就是实现一体广告机的关键之处,当年我在做这个地方可是花费了很多时间,查阅了很多资料才知道,flash还可以编程,这其中就是通过这个实现的,不知你能否想得到,如果你能想得到那证明你就是高手了,O(∩_∩)O哈哈~不知道的话希望今天看了我的博文能在你以后的工作中的使用到,也许这只是其中一种实现方法,也许你有更好的方法,如有希望你能够提供给我,大家一起学习进步。

首先是通过程序的下载,会将相应的信息写入到XML中,XML文件如下:

<?xml version="1.0" encoding="GB2312"?>
<imgList>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\终端7.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\终10.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\终端9.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\终端4.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\终端5.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\终端6.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\g02.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\g03.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
  <list path="D:\java\C#\YTJ\$DLL\Flash\swf\test.JPG" info="">http://www.cnblogs.com/luoyuhao/</list>
</imgList>

为了显得不是打广告,所有的链接都进行了替换,还有就是图片的路径是绝对路径,好像这里不能用相对路径,这好像是flash的原因,使用了绝对路径就显示不出图片了。

由于现在电脑未安装flash编辑工具,所以就不能贴上flash相应的实现代码了,后续等我能打开flash的文件后再将实现代码贴出来,一起和大家交流学习,请大家关注,不好意思了。

时间: 2024-10-14 00:55:48

一体广告机实现思路,非常实用(二)的相关文章

一体广告机实现思路,非常实用(一)

序言 当今社会广告随处可见,广告展现在大家面前也各尽不同,如电视.报纸.网络.车站.公车等等应有尽有,广告是无处不在,如不想见到广告那就不要出门.不要打开电脑手机.这样或许能暂时看不到广告.从这可见广告在人们生活中起到的作用,很多人都会根据广告去购买相关商品,所以现在才导致越来越多的企业不惜重金去打广告.然而广告又是人们非常讨厌的东西,比如在看电视时突然给你来一段广告,哎...广告泛滥的年代,你我都是广告受害者. 我今天给大家介绍一个广告一体机的实现思路,供大家一起交流学习,共同进步.也许我说的

互动广告机解决方案

方案背景 在日益发展的科技进程中,广告机也逐渐由单一发布转变为智能交互的多媒体广告机,并力求精准推送.增加收入和提高客户满意度,于是互动型触摸显示一体的广告机便应运而生.Firefly提供了一站式互动广告机的软硬件方案,该方案丰富的硬件接口与代码开源,可让你迅速完成极具科技竞争力的广告机产品. 方案简介 提供标准行业主板,适配市面上全尺寸的显示屏/触摸屏,主板依靠高性能,高稳定性,高扩展性可直接应用在各种广告机.该方案支持Android或Linux系统,并开源代码,可更方便地自定义个性化功能,打

武汉拼接屏 广告机 监视器

武汉拼接屏 公司▌▌深圳鼎创视界▌▌Tel▌Q◆Q:1744002725电◆话:15816879084 丁礼龙▌专注42寸46寸47寸55寸液晶拼接屏供应商,三星拼接屏,液晶拼接屏最新价格,液晶拼接墙,液晶监视器,液晶广告机,室内广告机,液晶拼接生产厂家.55寸液晶拼接,46寸液晶拼接,47寸液晶拼接.液晶拼接墙.无缝液晶拼接大屏幕.无缝液晶拼接墙.液晶拼接单元.拼接屏集品牌设计.研发.销售于一体液晶拼接屏生产厂家. 地区:武汉.黄石.襄樊.十堰.荆州.宜昌.荆门.鄂州.孝感.黄冈.咸宁.随州.

鑫飞广告机充电桩开启智能充电新模式

你知道2017年液晶广告机都有哪些新产品吗?你知道鑫飞智显独家首发了款什么新广告机吗? 你可能以为这是一款普通的液晶广告机,但是做好被震惊的准备吧.因为我们并不想告诉你充电柜广告机是一个多么伟大的产品,而是要无情的揭露它. 当我们第一次看到充电柜广告机的时候,我们仅仅看一眼就它的样子就感到不可思议."讨厌"我们看着它的样子就觉得这个液晶广告机"好奇怪"为什么要加上那么多充电线啊,那嚒多个小柜子有什么用呢.而且,我们根本没有在其他地方看过它,甚至想不到它有多大作用?

全彩LED电子屏幕室内应用和户外广告机将成市场趋势

为了整治光污染等问题,大屏幕户外安装的审批越来越困难,这也就意味,优质的安装位置越来越稀缺,对于LED显示屏厂家而言,想要实现户外应用量上的突破也越来越不容易.当户外应用不足以支撑业绩的增长,LED显示屏厂家将目光投向了以前无法企及的室内应用市场,而LED显示技术的提升则成为了进军的信心. 室内空间有限,而传统的LED显示屏有近距离观看颗粒感强的弊端,与画面显示细腻的液晶.等离子等产品相比,其必然不会成为用户的首选对象.不过,随着小间距LED显示屏的迅速崛起,这一短板得到了有效弥补.画面显示效果

【JS 设计模式 】用组合模式来实现树形导航--JS代码结构思路分析(二)

[JS 设计模式 ]用组合模式来实现树形导航--代码结构思路分析(一) 根据上一节中的HTML代码结构我们通过JS来渲染HTML代码,我们先提供一下JS的代码片段,这代码代码不是一个完整的代码是经过简化的.通过JS代码来分析如何组装HTML的 Composite类型的代码: function TreeComposite(id, name, total, level, last) { var root = document.createDocumentFragment(); var panel =

学习《第一行代码》使用实机测试所遇问题(二)

实机使用酷派大神F1,添加menu后,右上角不出现菜单,此时在java代码中加入以下方法在onCreate中运行 private void makeActionOverflowMenuShown() { //devices with hardware menu button (e.g. Samsung Note) don't show action overflow menu try { ViewConfiguration config = ViewConfiguration.get(this)

扫雷 思路 与源代码 二

扫雷步骤2: 首先第一步:随机埋雷, 定义一个随机埋雷的对象,循环,取得一个整数范围的数量(0- 格子的数)如果这个格子有地雷为真,那么循环+1第二步:计算每个格子周边的格子的数量 用循环所有格子,其次在用一个cell类型的数组,并在周围格子的占内存中查找来存放当前方格周边所有的方格 并用int unm来记录 (传一个对象给我,然后统计当前的地雷)如果在周围格子中发现了地雷,记录下来并将值传给cell数组第三步:定义一个周边格子的的数组类将当前格子传给它. 先计算左右.上下.四个角,并返回一个值

slot水果机抽奖思路

创建一个数组,数组里把所有的奖项按顺序里面,这个数组可命名为rewardArr,数组里面放每个奖项对应的显示对象.根据mvc的思想,所见非所得,每次刚点下抽奖按钮的时候,就给他随机出一个奖品,然后在随机一个转的圈数 接下来是滚动的显示,滚动就用TweenMax去解决,他里面有各种加速减速曲线,具体在用的时候,var rewardArr:Array = [a,b,c,d,e,f.....]; var redLightArr:Array = [n,n,n,n,n.....];var duration