• flash数据交互


    随笔 - 14  文章 - 5  评论 - 0

    安卓中webview读取html,同时嵌入Flex的SWF,交互


    安卓activity与html交互很简单,用javascript接口即可,网上一堆的例子,基本上没多大问题。

    在html里面嵌入swf并与之交互就有点麻烦,我用了ExternalInterface没有成功,那位兄台成功了可以交流交流。我用的是FlashVars,

    不用改什么配置,html就可以向swf传递数据。

    Html代码  
    1. <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,28,0" width="940" height="600">  
    2.             <param name="movie" value="client.swf?v=3">  
    3.             <param name="wmode" value="opaque"/>  
    4.             <param name="quality" value="high" />  
    5.             <param name="FlashVars" value="p1=222&p2=333" />  
    6.             <param name="menu" value="false"/>  
    7.             <embed src="client.swf" quality="high" wmode="opaque" pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" type="application/x-shockwave-flash"  FlashVars="p1=222&p2=333" width="940" height="600">  
    8. </embed>  
    9. </object>  

     其中可以在FlashVars中指定,也可以通过movie或src中的swf url指定参数,例如上面的v。

    Flex代码

    1. // 需要引入  
    2. import mx.core.Application;  
    3.   
    4. // 获取 FlashVars 的 Object  
    5. var params:*= Application.application.parameters;  
    6. //  也可以指定某一个参数  
    7. var p1:String = Application.application.parameters.p1; 

     Okay!

    Android使用Webview播放Swf文件,实现与Flash数据交互

    原创 2017年05月11日 14:08:24

    HDSwfPlayer

    Platform 
    characteristic

    谷歌中国API链接:https://developer.android.google.cn 

    支持swf播放以及html带swf的播放。 

    支持swf与js的交互。 

    自动写入flash信任路径。 

    提供播放回调。 

    Android版本不要超过4.3。 

    目录

    如何导入到项目

    支持jcenter方式导入。 

    支持本地Module方式导入。 

    jcenter方式导入

    • 在需要用到这个库的module中的build.gradle中的dependencies中加入
    dependencies { compile 'com.yhd.hdswfplayer:hdswfplayer:1.0.0'}
    • 1
    • 2
    • 3

    Module方式导入

    • 下载整个工程,将hdmediaplayer拷贝到工程根目录,settings.gradle中加入
    include ':hdswfplayer'
    • 1
    • 在需要用到这个库的module中的build.gradle中的dependencies中加入
    dependencies { compile project(':hdswfplayer')}
    • 1
    • 2
    • 3

    如何使用

    本类支持播放.swf文件、.html文件(.html可以包裹.swf文件并实现与android的交互)。 

    在demo中提供.html文件模板实例,如果需要js与android数据交互,请移步demo参考。 

    HDSwfPlayerHelper

    • 初始化
    private void initSwf() { //工程assets目录下swf文件对应的html文件路径,如果直接传入swf文件的路径也可以播放,但是不能与js交互 String assetsPath="file:///android_asset/main.html"; SwfPlayerHelper.getInstance(getApplicationContext()) .setJSCallClassName("jsCallClassName")//设置js调用的类名 .setJSCallMethodName("jsCallMethodName")//设置js调用的方法名 .setWebView(webView)//设置flash播放的载体 .setSwfPlayerCallBack(new SwfPlayerHelper.SwfPlayerCallBack() {//设置播放过程的回调 @Override public void onCallBack(SwfPlayerHelper.CallBackState state, final Object... args) { Log.v(TAG, state.toString()); //收到js调用方法发来的参数字符串信息 if(state== SwfPlayerHelper.CallBackState.JS_CALL_ANDROID_METHOD_WITH_PARAM){ runOnUiThread(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(),(String)args[0],Toast.LENGTH_LONG).show(); } }); } } }) .playSwf(assetsPath);//传入绝对路径、带file://的绝对路径、url都行}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 为了让退出播放或者在播放时用户转到其它页面后flash不再播放,应该重写用于播放的Activity的onPause和onResume方法,并分别调用webview的隐藏方法”onPause”和”onResume
    @Overrideprotected void onResume() { super.onResume(); SwfPlayerHelper.getInstance(getApplicationContext()).onResume();}@Overrideprotected void onPause() { super.onPause(); SwfPlayerHelper.getInstance(getApplicationContext()).onPause();}
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 更多的操作
    //WebView调用js的基本格式为:webView.loadUrl(“javascript:methodName(parameterValues)”)SwfPlayerHelper.getInstance(getApplicationContext()).androidCallJsMethod("jsMethodString");SwfPlayerHelper.getInstance(getApplicationContext()).androidCallJSMethodWithReturn("jsMethodString");
    • 1
    • 2
    • 3

    关于我

    欢迎 Star Fork交流地址:尹海德(123302687@qq.com)
    • 1
    • 2
    • 3

    License

    Copyright 2017 yinhaideLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License.
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    Github传送门https://github.com/yinhaide/HDSwfPlayer

    版权声明:本文为博主原创文章,未经博主允许不得转载,转载请标出原文出处。
    • 本文已收录于以下专栏:
    • Android开源之路

      Android通过javascript与flash动画交互

      原创 2015年01月17日 12:35:52

      问题描述:当我们在Android应用上加载了flash,然后希望点击flash的相关控件,Android应用能够做出相应。

      这就涉及到Android通过javascript与flash动画交互技术。我们实现方案是:新建一个html文件显示flash动画,html文件嵌入javascript函数与flash交互,然后我们我们Android应用通过webview加载html文件,再与该html文件嵌入的javascript函数交互,最后可以实现Android的数据与flash的数据进行通信。有点绕口,不知读者是否看明白了。总之就一句话:html中的javascript函数是中介,Android与flash分别与它进行数据传输即可。

      贴代码:

      flash.html

      [html] view plain copy
      1. <!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd ;">  
      2. <html xmlns="http://www.w3.org/1999/xhtml">  
      3. <head>  
      4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />  
      5. <script language="JavaScript" type="text/JavaScript">  
      6. var str1 = "hello";  
      7. var InternetExplorer = navigator.appName.indexOf("Microsoft") != -1;  
      8. function myFlash_DoFSCommand(command, args)                {  
      9.   var myFlashObj = InternetExplorer ? myFlash : document.myFlash;  
      10.   //flash传来的参数,如果有数据传来则调用Android代码的函数,将flash数据传给Android  
      11.   if(command =="file1_open"||command=="file2_open"||command=="file3_open"||command=="file4_open"||command=="file5_open"||command=="file6_open")  
      12. {  
      13.     //alert(command);  
      14.     doFromCommand(command);  
      15.   }else{  
      16.     //alert(command);  
      17.   }  
      18. }  
      19. //下面的代码是网页加载flash的钩子  
      20. if (navigator.appName && navigator.appName.indexOf("Microsoft") != -1 &&   
      21.   navigator.userAgent.indexOf("Windows") != -1 && navigator.userAgent.indexOf("Windows 3.1") == -1) {  
      22.   document.write('<SCRIPT LANGUAGE=VBScript>  ');  
      23.   document.write('on error resume next  ');  
      24.   document.write('Sub myFlash_FSCommand(ByVal command, ByVal args) ');  
      25.   document.write(' call myFlash_DoFSCommand(command, args) ');  
      26.   document.write('end sub ');  
      27.   document.write('</SCRIPT>  ');  
      28. }   
      29. //调用android的函数,runJs2Activity是Android代码定义的函数,<span style="font-family: Arial, Helvetica, sans-serif;">playerJs是Android中定义该类的别名,</span><span style="font-family: Arial, Helvetica, sans-serif;">目的是获得flash传来的数据</span>  
      30.  function doFromCommand(command){  
      31.     window.playerJs.runJs2Activity(command);  
      32.  }  
      33. </script>  
      34. </head>   
      35. <body>  
      36. <OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"  
      37.  codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=11,0,0,0"  
      38.  WIDTH="100%" HEIGHT="100%" id="myFlash">  
      39.  <PARAM NAME=movie VALUE="flash.swf">   <!--这里一堆代码是加载flash动画的-->  
      40.  <PARAM NAME=quality VALUE=high>  
      41.  <PARAM NAME=bgcolor VALUE=#CCCCCC>   
      42.  <param name="allowScriptAccess" value="always" />  
      43.  <param name="allowNetworking" value="all">  
      44.  <param name="allowFullScreen" value="true">  
      45.  <EMBED src="flash.swf" quality=high bgcolor=#CCCCCC  WIDTH="100%" HEIGHT="100%" NAME="myFlash" swLiveConnect="true" allowScriptAccess="always" allownetworking="all" TYPE="application/x-shockwave-flash" PLUGINSPAGE="http://www.macromedia.com/go/getflashplayer"></EMBED>  
      46. </OBJECT>  
      47.  <div id="show" style="color:#000000;font-size:30px;margin-left:50px" ></div>  
      48.   
      49. </body>  
      50. </html>  
      Android中定义的与thml交互的函数
      [java] view plain copy
      1.    //类中类:定义js中调用的Android类  
      2. lass RunJavaScript {  
      3. public void runJs2Activity(String str) {  
      4.     strFromJs = str;  
      5.     mScriptHandler.removeCallbacks(mPlayerRunnable);  
      6.     mScriptHandler.postDelayed(mPlayerRunnable, 300);  
      7. }  
      Android中是Vebview加载html文件的,其中交互类的别名是这样定义的
      [java] view plain copy
      1. //给网页文件添加Android与JS交互函数的定义  
      2. mWebView.addJavascriptInterface(new RunJavaScript(), "playerJs");  

      下面是Android完整代码
      [java] view plain copy
      1. package com.ideal.swfplayer;  
      2. /************************ 
      3.  *用来加载flash.html文件* 
      4.  ************************/  
      5. import java.io.File;  
      6. import java.util.Timer;  
      7. import java.util.TimerTask;  
      8. import sunvision.database.DBOperation;  
      9. import sunvision.dialog.MatchDialog;  
      10. import sunvision.dialog.TipDialog;  
      11. import sunvision.dialog.VersionDialog;  
      12. import sunvision.file.FileOperation;  
      13. import sunvision.tools.FlashPath;  
      14. import sunvision.tools.IdealSystemProperties;  
      15. import android.annotation.SuppressLint;  
      16. import android.app.Activity;  
      17. import android.content.Intent;  
      18. import android.graphics.Bitmap;  
      19. import android.os.Build;  
      20. import android.os.Bundle;  
      21. import android.os.Handler;  
      22. import android.os.Message;  
      23. import android.os.SystemClock;  
      24. import android.util.Log;  
      25. import android.view.Gravity;  
      26. import android.view.KeyEvent;  
      27. import android.view.LayoutInflater;  
      28. import android.view.MotionEvent;  
      29. import android.view.View;  
      30. import android.view.ViewGroup;  
      31. import android.view.WindowManager;  
      32. import android.webkit.WebChromeClient;  
      33. import android.webkit.WebSettings;  
      34. import android.webkit.WebSettings.PluginState;  
      35. import android.webkit.WebView;  
      36. import android.webkit.WebViewClient;  
      37. import android.widget.FrameLayout;  
      38. import android.widget.ImageView;  
      39. import android.widget.TextView;  
      40. import android.widget.Toast;  
      41.   
      42. public class MainFlashActivity extends Activity {  
      43.     private WebView mWebView = null;  
      44.     private FrameLayout mFrameLayout = null;  
      45.     private ImageView mImageView = null;  
      46.     private Timer mTimer = null;  
      47.     private Timer mTimer2 = null;  
      48.     private WebSettings settings;  
      49.     private String strFromJs = "";  
      50.     private String TAG = "SwfPlayer";  
      51.     private int mLoadingIndex = 0;  
      52.     private int mWebViewLoadTimes = 0;  
      53.     private int versionloadtime=0;  
      54.     private MatchDialog mDialogManager;  
      55.     private Handler mHandler = null;  
      56.     private FileOperation mFileUnit;  
      57.     private boolean isversionup=true;  
      58.     Handler mScriptHandler = new Handler() {};  
      59.     //加载驱动  
      60.     public native void native_initPlayer( ) throws Exception;  
      61.     public native void native_prepare() throws Exception;  
      62.     public native void native_start();  
      63.     public native void native_finish();   
      64.   
      65.     @Override  
      66.     public void onCreate(Bundle savedInstanceState) {  
      67.         super.onCreate(savedInstanceState);  
      68.         setContentView(R.layout.activity_flash);  
      69.         //初始化UI界面  
      70.         InitUI();  
      71.         //加载主界面  
      72.         loadSwf(FlashPath.MainPath);  
      73.         //等待消息传过来更新界面  
      74.         //mHandler.post(task);  //启动定时器1秒刷新一次  
      75.         mHandler = new Handler() {  
      76.             @SuppressLint("Recycle")   
      77.             public void handleMessage(Message msg) {  
      78.                 Log.i(TAG, "PlayerActivity-mLoadingIndex==" + mLoadingIndex);  
      79.                 switch (msg.arg1) {  
      80.                 case 0:  
      81.                     mImageView.setImageResource(R.drawable.flashloading);  
      82.                     break;  
      83.                 case 1:  
      84.                     mTimer.cancel();  
      85.                     mImageView.setVisibility(View.GONE);  
      86.                     mImageView.destroyDrawingCache();  
      87.                     mLoadingIndex = 0;  
      88.                     break;  
      89.                 case 6:  
      90.                     mWebView.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(),MotionEvent.ACTION_DOWN, mWebView.getLeft() + 5,mWebView.getTop() + 5, 0));  
      91.                     mWebView.dispatchTouchEvent(MotionEvent.obtain(SystemClock.uptimeMillis(),SystemClock.uptimeMillis(), MotionEvent.ACTION_UP,mWebView.getLeft() + 5, mWebView.getTop() + 5, 0));  
      92.                     break;  
      93.                 default:  
      94.                     break;  
      95.                 }  
      96.                 super.handleMessage(msg);  
      97.             }  
      98.         };  
      99.   
      100.     }  
      101.     //UI界面初始化函数  
      102.     private void InitUI() {  
      103.         mFileUnit = new FileOperation(getApplicationContext());  
      104.         mFileUnit.createFlashPlayerTrust();  
      105.         mFrameLayout = (FrameLayout) findViewById(R.id.player_frameLayout);  
      106.         mImageView = (ImageView) findViewById(R.id.swf_loading_img);  
      107.         mWebView = (WebView) findViewById(R.id.webView_show);  
      108.     }  
      109.   
      110.      //加载Flash动画  
      111.         @SuppressLint({ "SetJavaScriptEnabled", "Recycle" })   
      112.         public void loadSwf(String swfPath) {  
      113.             //获得配置函数  
      114.             settings = mWebView.getSettings();  
      115.             //设置允许与js交互  
      116.             settings.setJavaScriptEnabled(true);  
      117.             //设置允许文件操作  
      118.             settings.setAllowFileAccess(true);  
      119.             //设置允许使用Adobe Flash播放视频  
      120.             settings.setPluginState(PluginState.ON);  
      121.             //设置加载方式是替换加载,而不是新页面加载  
      122.             settings.setLoadWithOverviewMode(true);  
      123.             //设置编码方式  
      124.             settings.setDefaultTextEncodingName("GBK");  
      125.             //设置透明背景  
      126.             mWebView.setBackgroundColor(0);  
      127.             //重写Flash加载辅助函数  
      128.             mWebView.setWebChromeClient(new WebChromeClient() {  
      129.                 public void onShowCustomView(View view, int requestedOrientation,  
      130.                         WebChromeClient.CustomViewCallback callback) {  
      131.                     super.onShowCustomView(view, callback);  
      132.                     //Android SDK版本  
      133.                     if (Build.VERSION.SDK_INT >= 14) {  
      134.                         if (view instanceof FrameLayout) {  
      135.                             mFrameLayout.addView(view,new FrameLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT,Gravity.CENTER));  
      136.                             mFrameLayout.setVisibility(View.VISIBLE);  
      137.                         }  
      138.                     }  
      139.                 }  
      140.                 @Override  
      141.                 public void onHideCustomView() {  
      142.                     super.onHideCustomView();  
      143.                 }  
      144.             });  
      145.             //重写Flash加载主要函数  
      146.             mWebView.setWebViewClient(new WebViewClient() {  
      147.                 @Override  
      148.                 public boolean shouldOverrideUrlLoading(WebView view, String url) {  
      149.                     view.loadUrl(url);  
      150.                     return true;  
      151.                 }  
      152.                 //Flash启东时调用  
      153.                 @Override  
      154.                 public void onPageStarted(WebView view, String url, Bitmap favicon) {  
      155.                     super.onPageStarted(view, url, favicon);  
      156.                     mWebViewLoadTimes++;  
      157.   
      158.                 }  
      159.                 //Flash加载完成之后调用  
      160.                 @Override  
      161.                 public void onPageFinished(WebView view, String url) {  
      162.                     super.onPageFinished(view, url);  
      163.                     //Flash加载之前会有一段时间是白屏,为了掩盖,让五张图片隔时刷新  
      164.                     if (mWebViewLoadTimes == 1) {  
      165.                         mTimer = new Timer();  
      166.                         mTimer.schedule(new TimerTask() {  
      167.                             @Override  
      168.                             public void run() {   
      169.                                 Message msg = new Message();  
      170.                                 msg.what = 0;  
      171.                                 msg.arg1 = mLoadingIndex;  
      172.                                 mHandler.sendMessage(msg);  
      173.                                 mLoadingIndex++;  
      174.                             }  
      175.                         }, 0, 2000);  
      176.                         //flash偶尔会失去焦点,让flash加载完成之后每隔2秒点击一次界面获得焦点  
      177.                         mTimer2 = new Timer();  
      178.                         mTimer2.schedule(new TimerTask() {  
      179.                             @Override  
      180.                             public void run() {   
      181.                                 Message msg = new Message();  
      182.                                 msg.what = 0;  
      183.                                 msg.arg1 = 6;  
      184.                                 mHandler.sendMessage(msg);  
      185.                             }  
      186.                         }, 0, 2000);  
      187.                     } else if (mWebViewLoadTimes >= 2) {  
      188.                         mWebViewLoadTimes = 0;  
      189.                         String path = FlashPath.TIP_NO_FILE;  
      190.                         Intent intent = new Intent(MainFlashActivity.this,NoFileFlashActivity.class);  
      191.                         intent.putExtra("swfPath", path);  
      192.                         startActivity(intent);  
      193.                         MainFlashActivity.this.finish();  
      194.                     }  
      195.                 }  
      196.             });  
      197.             //给网页文件添加Android与JS交互函数的定义  
      198.             mWebView.addJavascriptInterface(new RunJavaScript(), "playerJs");  
      199.             //设置网页能够获得焦点  
      200.             mWebView.requestFocusFromTouch();  
      201.             mWebView.requestFocus();  
      202.             mWebView.setFocusable(true);  
      203.             //设置完毕之后加载Flash  
      204.             mWebView.loadUrl(swfPath);  
      205.         }  
      206.         //类中类:定义js中调用的Android类  
      207.     class RunJavaScript {  
      208.         public void runJs2Activity(String str) {  
      209.             strFromJs = str;  
      210.             mScriptHandler.removeCallbacks(mPlayerRunnable);  
      211.             mScriptHandler.postDelayed(mPlayerRunnable, 300);  
      212.         }  
      213.     }  
      214.      //类中接口:当js调用RunJavaScript时,新开辟线程处理消息,这里是接口   
      215.     Runnable mPlayerRunnable = new Runnable() {  
      216.         @Override  
      217.         public void run() {  
      218.             //文件操作行为  
      219.             if (strFromJs.equals("file1_open")||strFromJs.equals("file2_open")||strFromJs.equals("file3_open")||strFromJs.equals("file4_open")||strFromJs.equals("file5_open")||strFromJs.equals("file6_open") ) {    
      220.                 File folder = new File("/mnt/external_sd/");  
      221.                 //TF卡存在  
      222.                 if(folder.length()>0){  
      223.                   Intent intent = new Intent(MainFlashActivity.this,FileListActivity.class);  
      224.                   intent.putExtra("filename", strFromJs);  
      225.                   startActivity(intent);  
      226.                   //TF卡不在  
      227.                 }else{  
      228.                     TipDialog mTipDialog = new TipDialog(MainFlashActivity.this, R.style.IdealDialog,R.drawable.no_tf_card,3);  
      229.                     //设置背景透明度  
      230.                     WindowManager.LayoutParams lp=mTipDialog.getWindow().getAttributes();   
      231.                     lp.dimAmount=0.7f;   
      232.                     mTipDialog.getWindow().setAttributes(lp);   
      233.                     mTipDialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DIM_BEHIND);  
      234.                     mTipDialog.show();  
      235.                 }             
      236.             }   
      237.         }  
      238.     };  
      239.        
      240.     //加载Antivity是调用  
      241.     @SuppressLint("Recycle") @Override  
      242.     protected void onResume() {  
      243.         super.onResume();  
      244.         //flash在回到该Activity是能够继续播放  
      245.         try {  
      246.             mWebView.getClass().getMethod("onResume").invoke(mWebView, (Object[]) null);  
      247.         } catch (Exception e) {  
      248.             e.printStackTrace();  
      249.         }   
      250.     }  
      251.       
      252.     //Activity停止时调用  
      253.     @Override  
      254.     protected void onPause() {  
      255.         super.onPause();  
      256.         //允许flash暂停播放  
      257.         try {  
      258.             mWebView.getClass().getMethod("onPause").invoke(mWebView, (Object[]) null);  
      259.         } catch (Exception e) {  
      260.             e.printStackTrace();  
      261.         }  
      262.     }  
      263.       
      264.     //该Activity销毁时调用  
      265.     @Override  
      266.     protected void onDestroy() {  
      267.         super.onDestroy();  
      268.         mWebView.destroyDrawingCache();  
      269.         mWebView.destroy();  
      270.         try {  
      271.             mHandler.removeMessages(0);  
      272.             mTimer.cancel();  
      273.         } catch (Exception e) {  
      274.         }  
      275.     }  
      276.       
      277. }  

      Android加载flash时有一些要注意的问题:Webview加载flash一开始会出现白屏,可以通过刷图的形式掩盖;刚加载完flash,它还无法获得Android用户的焦点事件,必须在代码里面模拟点击屏幕,才可以获得焦点;在运行flash的过程中可能会出现焦点丢失的情况,我的方案是每隔几秒点击屏幕一次;Android加载flash需要flash插件,必须确保插件装好了,但是。即使插件装好了也不能通信,必须要把要加载的flash的路径写到flash插件安装目录下的安全路径文件中,这点非常重要,如读者遇到该问题,需要帮助的话可在线留言~
  • 相关阅读:
    asp.net mvc 三层加EF两表联查
    asp.net mvc 三层加EF 登录注册 增删改查
    超市管理系统
    asp.net三层架构增删改查
    ACCP8.0 HTML标签
    Sql 优化解决方案
    抽象类与抽象方法
    Form 表单提交的几种方式
    C# 接口的使用(工厂模式)
    使用VBA设置打印页面高度和宽度
  • 原文地址:https://www.cnblogs.com/totoo/p/swf.html
Copyright © 2020-2023  润新知