百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

写几句代码 - 完美复活 Flash 动画

haoteby 2024-11-27 14:42 46 浏览

Flash 动画在现代浏览器环境下虽然没有生存空间了,但是作为桌面软件的动画控件还是有些剩余价值的。现在系统已不再自带 Flash 控件。如果说让你的软件用户自己去找旧版本控件再啃着上万字的教程自己摸索复活 Flash 播放器 - 先不说别人有没有这个耐心,单单是修改版的控件加安装时跳出来的管理权限警告、或者冷不丁蹦出来的弹窗广告估计就能把别人吓跑了。

下面我介绍一个更简单复活 Flash 播放器的方法,用打包后只有 3MB 的 WebKit(WKE) 内核浏览器组件嵌入 Flash 插件(绿色免安装),可以生成独立 EXE 文件,兼容 com.flash 的接口。

这里我们需要用到 web.kit 扩展库里的 web.kit.flash ,先看个简单的例子:

import win.ui;
/*DSG{{*/
var winform = win.form(text="web.kit.flash 动画")
/*}}*/

import web.kit.flash;
var flash = web.kit.flash( winform ); 
winform.show(); 

//导出函数给 Flash
flash.external = {
  func = function(){} 
}

//指定初始化属性,建议在指定 movie 属性以前指定
flash.bgcolor = "transparent";
flash.wMode = "transparent"; 
flash.flashVars = {a="v1",b="v2"};

//修改此属性或调用 render() 函数才会打开 Flash 动画。
flash.movie = "https://update.aardio.com/v10.files/demo/transparent.swf";

//调用 Flash 控件函数
var flashVersion = flash.getVariable("$version")
winform.msgbox("Flash 版本:" + flashVersion)

//如下调用 Flash 导出的函数
/*
flash.xcall("Flash导出函数名",任意个调用参数)
flash.Flash导出函数名(任意个调用参数)
*/

win.loopMessage();

上面就是一个桌面软件的完整代码,在 aardio 里新建一个空白工程,把上面的代码复制到 main.aardio 中,然后按「发布」按钮就可以生成独立 EXE 文件了。

要注意用浏览器控件播放 Flash ,那么 Flash 的地址必须传入通过 HTTP 服务器访问的网址。如果你要打开本地文件,这在 aardio 中非常容易,一句代码就可以搞定,如下:

import wsock.tcp.simpleHttpServer;
flash.movie = wsock.tcp.simpleHttpServer.startUrl("/res/test.swf");

"/res/test.swf" 是加入 aardio 工程目录的文件,"/res/"可以是嵌入EXE的资源目录。不需要改动任何代码,aardio 会自动支持内存加载这个 "/res/test.swf" 文件,可以生成独立 EXE,可以在运行时自动创建 HTTP 服务端并分配访问这个文件的网址 —— 并且 HTTP 服务端自动获取空闲端口( 不会出现端口冲突 )。

wsock.tcp.asynHttpServer 也能创建嵌入式 HTTP 服务器,区别是 wsock.tcp.asynHttpServer 是单线程异步服务器,而 wsock.tcp.simpleHttpServer 是多线程服务器。

在 aardio 中你可以用任何内存数据虚拟一个通过 HTTP 访问的文件地址,例如 com.cube3 扩展库就是这样做的:

import wsock.tcp.asynHttpServer;
httpServer = wsock.tcp.asynHttpServer();

httpServer.run({ 
    ["/cube3.swf"] = #34;~\lib\com\cube3\.res\cube3.swf"
});
flash.movie = httpServer.getUrl("/cube3.swf");

上面的代码就是通过嵌入 HTTP 服务器虚拟的文件网址访问内存中的 swf 数据(请注意在文件路径前面加上 $ 就会将该文件的内容编译到程序中并返回二进制字符串)。

扩展库 com.cube3 是一个魔方公式转动画的组件,这个扩展库原来是使用 com.flash 实现,我们现在使用 web.kit.flash 复活了这个扩展库,com.cube3 的完整源码如下:

import web.kit.flash;
import wsock.tcp.asynHttpServer;
import string.conv;

namespace com;

class cube3{
  ctor( winform,param ){
    this = ..web.kit.flash(winform);
  }; 
  start = function(param){
    if(param){
      var fm = function(move){
        if(!#move) return; 
        move = ..string.conv.fromWide( move ); 
        move = ..string.replace(move,"\n","\\n");
        move = ..string.replace(move,'\t',' ') ;
        return move;
      }

      param.initmove = fm(param.initmove);
          param.move = fm( param.move );
          param.speed = param.speed;
          param.mirror = param.mirror;
          
          this.flashVars = param;
    }
    
    this.movie = httpServer.getUrl("/cube3.swf");  
  } 
}

namespace cube3{
    httpServer = ..wsock.tcp.asynHttpServer();
    httpServer.run({ 
      ["/cube3.swf"] = #34;~\lib\com\cube3\.res\cube3.swf"
    });
}

看下调用 com.cube3 的运行效果:


在 aardio 扩展库管理器中双击 com.cube3 扩展库可以打开上面的范例源代码。

相关推荐

如何为MySQL服务器和客户机启用SSL?

用户想要与MySQL服务器建立一条安全连接时,常常依赖VPN隧道或SSH隧道。不过,获得MySQL连接的另一个办法是,启用MySQL服务器上的SSL封装器(SSLwrapper)。这每一种方法各有其...

OpenVPN客户端配置_openvpn客户端配置文件解析

...

k8s 证书问题排查_k8s dashboard 证书

从去年开始一些老项目上陆陆续续出现一些列的证书问题,(证书原理这里就不说了,官方文档一堆)多数刚开始的表现就是节点的kubelet服务起不来,节点状态NotReady表现日志如下failed...

企业级网络互通方案:云端OpenVPN+爱快路由器+Win11互联实战

企业级网络互通方案:OpenVPN搭建公有云+爱快路由器+Win11三地互联实战指南「安全高效」三地局域网秒变局域网实施环境说明...

OpenV** Server/Client配置文件详解

Server配置详解...

接口基础认知:关键信息与合规前提

1.核心技术参数(必记)...

S交换机通过SSH登录设备配置示例(RADIUS认证+本地认证独立)

说明:●本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。●通过不同的管理域来实现RADIUS认证与本地认证两种方式同时使用,两...

SSL证书如何去除私钥密码保护_ssl证书怎么取消

有时候我们在生成证书的时候可以加入了密码保护。然后申请到证书安装到了web服务器。但是这样可能会带来麻烦。每次重启apache或者nginx的时候,都需要输入密码。那么SSL证书如何去除私钥密码保护。...

SSL证书基础知识与自签名证书生成指南

一、证书文件类型解析...

S交换机通过SSH登录设备配置示例(RADIUS认证)

说明:本示例只介绍设备的认证相关配置,请同时确保已在RADIUS服务器上做了相关配置,如设备地址、共享密钥、创建用户等配置。假设已在RADIUS服务器上创建了用户名yc123,密码test#123。对...

HTTPS是什么?加密原理和证书。SSL/TLS握手过程

秘钥的产生过程非对称加密...

HTTPS TLS握手流程_进行tls握手

1.客户端向服务器发送`ClientHello`消息,包括支持的TLS版本、加密套件、随机数等信息。2.服务器收到`ClientHello`消息后,解析其中的信息,并根据配置选择一个加密套件。3....

Spring Boot 单点登录(SSO)实现_spring boot 单点登录jwt

SpringBoot单点登录(SSO)实现全指南单点登录(SingleSign-On,SSO)是一种身份验证机制,允许用户使用一组凭证登录多个相关但独立的系统。在微服务架构和企业级系统中,SS...

源码分享:在pdf上加盖电子签章_pdf如何加盖电子公章

在pdf上加盖电子签章,并不是只是加个印章图片,。而是要使用一对密钥中的私钥对文件进行签字。为啥要用私钥呢?很简单,因为公钥是公开的,其他人才可以用公钥为你证明,这个文件是你签的。这就是我们常说的:私...

微信支付商户API证书到期 怎么更换

微信支付商户API证书到期更换是一个非常重要的操作,需要仔细按照流程进行。如果证书过期,所有通过API的支付、退款等操作都会失败,将直接影响您的业务。请按照以下详细步骤进行操作:重要前提:分清...