分类 编程 下的文章

回到顶部按钮

<p>asp.net 实现回到顶部的按钮效果</p><pre>void MainPage_Loaded(object sender, RoutedEventArgs e) { #region 回到顶部按钮 // Visual States are always on the first child of the control template FrameworkElement element = VisualTreeHelper.GetChild(viewer_hot, 0) as FrameworkElement; if (element != null) { VisualStateGroup group = FindVisualState(element, "ScrollStates"); if (group != null) { //group.CurrentStateChanging += (s, args) => pivot.Title = args.NewState.Name; group.CurrentStateChanging += (s, args) => { if (args.NewState.Name == "Scrolling") { imgTopBack.Visibility = System.Windows.Visibility.Collapsed; } elseif (viewer_hot.VerticalOffset > 1) { imgTopBack.Visibility = System.Windows.Visibility.Visible; } }; } } #endregion }</pre><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><div> <pre> VisualStateGroup FindVisualState(FrameworkElement element, string name) { if (element == null) returnnull; IList groups = VisualStateManager.GetVisualStateGroups(element); foreach (VisualStateGroup group in groups) if (group.Name == name) return group; returnnull; }</pre><div> </div></div><div><pre>privatevoid imgTopBack_Tap(object sender, System.Windows.Input.GestureEventArgs e) { viewer_hot.ScrollToVerticalOffset(0.0); imgTopBack.Visibility = Visibility.Collapsed; e.Handled = true; }</pre><div> </div></div><p>xaml 中:</p><div><pre> <Image Height="56" Width="56" HorizontalAlignment="Left" VerticalAlignment="Bottom" Margin="12,0,0,80" Name="imgTopBack" Source="/images/topBack.png" Stretch="Fill" Visibility="Collapsed" Tap="imgTopBack_Tap" /></pre></div>

- 阅读剩余部分 -

支付宝接口方案

<p>支付宝的接口调用很不方便,刚做好一个封装,实现了虚拟交易和实物交易。
解决方案中有三个项目以及NDoc生成的文档,简单的序列图:CommonAliPay,封装的支付宝接口。
 TestAli,asp.net的测试项目
TestCommonAliPay,Nunit的测试项目。
源代码下载地址:http://files.cnblogs.com/bluewater/CommonAliPay.rar</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>
调用方法:
1、引入CommonAliPay.dll
2、实现支付宝服务接口的方法调用方式:</p><div> AliPay ap = new AliPay();
        string key = "";//填写自己的key
        string partner = "";//填写自己的Partner
        StandardGoods bp = new StandardGoods("trade_create_by_buyer", partner, key, "MD5", "卡2", Guid.NewGuid().ToString(), 2.551m, 1, "hao_ding2000@yahoo.com.cn", "hao_ding2000@yahoo.com.cn"
            , "EMS", 25.00m, "BUYER_PAY","1");
           bp.Notify_Url = "http://203.86.79.185/ali/notify.aspx";;
        ap.CreateStandardTrade("https://www.alipay.com/cooperate/gateway.do";, bp, this);</div><p>上面是通用的调用方式。
下面是只支持虚拟货物的方式:</p><div> string key = "";//填写自己的key
        string partner = "";//填写自己的Partner
        AliPay ap = new AliPay();
        DigitalGoods bp = new DigitalGoods("create_digital_goods_trade_p", partner, key, "MD5", "卡2", Guid.NewGuid().ToString(), 2.551m, 1, "hao_ding2000@yahoo.com.cn", "hao_ding2000@yahoo.com.cn");
        bp.Notify_Url = "http://203.86.79.185/ali/notify.aspx";;
        ap.CreateDigitalTrade("https://www.alipay.com/cooperate/gateway.do";, bp, this);</div><p>3、实现支付宝通知接口方法的调用(支持虚拟和实物):</p><p> </p><div>protected void Page_Load(object sender, EventArgs e)
    <span id="Codehighlighter1_57_576_Open_Text">{
       
        string key = "";//填写自己的key
        string partner = "";//填写自己的Partner
         AliPay ap = new AliPay();
         string notifyid = Request.Form["notify_id"];
         Verify v = new Verify("notify_verify", partner, notifyid);
        ap.WaitSellerSendGoods+=new AliPay.ProcessNotifyEventHandler(ap_WaitSellerSendGoods);
        ap.WaitBuyerPay += new AliPay.ProcessNotifyEventHandler(ap_WaitBuyerPay);
        ap.ProcessNotify(this, "https://www.alipay.com/cooperate/gateway.do";,key,v, "utf-8");
    }</span>

    void ap_WaitBuyerPay(object sender, NotifyEventArgs e)
    <span id="Codehighlighter1_642_721_Open_Text">{
        // //加入自己的处理逻辑
        Log4net.log.Error("wait buyer pay fire");
    }</span>

   
    private void ap_WaitSellerSendGoods(object sender, NotifyEventArgs e)
    <span id="Codehighlighter1_806_887_Open_Text">{
        //加入自己的处理逻辑
        Log4net.log.Error("WaitSellerSendGoods fire");
    }</span></div><p>支付宝的交易状态都被定义成了类似名称的事件。
部分源代码解析:
1、解析Forms集合到NotifyEventArgs类,因为后面此类的数据要用来做MD5Sign,所以所有值类型,不能存在初始值,如:int的0等。因此用Nullable范型。</p><p> </p><p> </p><div>   private NotifyEventArgs ParseNotify(NameValueCollection nv, object obj)
        <span id="Codehighlighter1_83_1464_Open_Text">{
            PropertyInfo[] propertyInfos = obj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);

            foreach (PropertyInfo pi in propertyInfos)
            <span id="Codehighlighter1_270_1412_Open_Text">{
                string v = nv.Get(pi.Name.ToLower());
                if (v != null)
                <span id="Codehighlighter1_373_1397_Open_Text">{
                    if (pi.PropertyType == typeof(string))
                    <span id="Codehighlighter1_454_529_Open_Text">{

                        pi.SetValue(obj, v, null);

                    }</span>
                    else if (pi.PropertyType == typeof(int?))
                    <span id="Codehighlighter1_613_697_Open_Text">{
                        pi.SetValue(obj, int.Parse(v), null);
                    }</span>
                    else if (pi.PropertyType == typeof(decimal?))
                    <span id="Codehighlighter1_785_874_Open_Text">{

                        pi.SetValue(obj, decimal.Parse(v), null);
                    }</span>
                    else if (pi.PropertyType == typeof(DateTime?))
                    <span id="Codehighlighter1_963_1053_Open_Text">{

                        pi.SetValue(obj, DateTime.Parse(v), null);
                    }</span>
                    else if (pi.PropertyType == typeof(bool))
                    <span id="Codehighlighter1_1137_1223_Open_Text">{

                        pi.SetValue(obj, bool.Parse(v), null);
                    }</span>
                    else
                    <span id="Codehighlighter1_1270_1379_Open_Text">{
                        //转型失败会抛出异常
                        pi.SetValue(obj, v, null);
                    }</span>
                }</span>

            }</span>
            return (NotifyEventArgs)obj;

        }</span></div><p>
2、从类型中获取排序后的参数</p><p> </p><p> </p><div> <span id="Codehighlighter1_1_129_Open_Text">/// <summary>
        /// 获取排序后的参数
        /// </summary>
        /// <param name="obj"></param>
        /// <returns></returns></span>
        private SortedList<string,string> GetParam(object obj)
        <span id="Codehighlighter1_201_954_Open_Text">{
            
            PropertyInfo[] propertyInfos = obj.GetType().GetProperties(BindingFlags.Public|BindingFlags.Instance);          
            SortedList<string, string> sortedList = new SortedList<string, string>(StringComparer.CurrentCultureIgnoreCase);
            foreach (PropertyInfo pi in propertyInfos)
            <span id="Codehighlighter1_533_892_Open_Text">{

                if (pi.GetValue(obj, null) != null)
                <span id="Codehighlighter1_604_878_Open_Text">{
                    if (pi.Name == "Sign" || pi.Name == "Sign_Type")
                    <span id="Codehighlighter1_695_751_Open_Text">{
                        continue;
                    }</span>
                    sortedList.Add(pi.Name.ToLower(), pi.GetValue(obj, null).ToString());
                  
                }</span>
            }</span>
            return sortedList;
                    
        }</span></div><p>3、从SortedList中产生参数</p><p> </p><p> </p><div> private string GetUrlParam(SortedList<string, string> sortedList,bool isEncode)
        <span id="Codehighlighter1_89_954_Open_Text">{
            StringBuilder param = new StringBuilder();
            StringBuilder encodeParam = new StringBuilder();
            if (isEncode == false)
            <span id="Codehighlighter1_254_552_Open_Text">{

                foreach (KeyValuePair<string, string> kvp in sortedList)
                <span id="Codehighlighter1_346_484_Open_Text">{
                    string t = string.Format("{0}={1}", kvp.Key, kvp.Value);
                    param.Append(t + "&");
                }</span>
                return param.ToString().TrimEnd('&');
            }</span>
            else
            <span id="Codehighlighter1_583_942_Open_Text">{
                foreach (KeyValuePair<string, string> kvp in sortedList)
                <span id="Codehighlighter1_674_868_Open_Text">{
                     string et = string.Format("{0}={1}", HttpUtility.UrlEncode(kvp.Key), HttpUtility.UrlEncode(kvp.Value));
                     encodeParam.Append(et + "&");
                }</span>
                return encodeParam.ToString().TrimEnd('&');
            }</span>
 
        }</span></div><p>下载地址:http://files.cnblogs.com/bluewater/CommonAliPay.rar
因为时间很紧,有些地方还不完善,大家提出意见,有时间我会修改的 
可以看:http://www.cnblogs.com/bluewater/archive/2007/07/17/821540.html,新版本</p>

- 阅读剩余部分 -

PHP开发提高效率技巧

<p>0、用单引号代替双引号来包含字符串,这样做会更快一些。因为 PHP会在双引号包围的字符串中搜寻变量,单引号则不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中 说echo是语言结构,不是真正的函数,故把函数加上了双引号)。</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。

2、$row[&rsquo;id&rsquo;] 的速度是$row[id]的7倍。

3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。

4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。

5、注销那些不用的变量尤其是大数组,以便释放内存。

6、尽量避免使用__get,__set,__autoload。

7、require_once()代价昂贵。

8、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。

9、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[&lsquo;REQUEST_TIME&rsquo;]要好于time()。<br /><br />10、函数代替正则表达式完成相同功能。<br /><br />11、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。<br /><br />12、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。<br /><br />13、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。<br /><br />14、用@屏蔽错误消息的做法非常低效,极其低效。<br /><br />15、打开apache的mod_deflate模块,可以提高网页的浏览速度。<br /><br />16、数据库连接当使用完毕时应关掉,不要用长连接。<br /><br />17、错误消息代价昂贵。<br /><br />18、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。<br /><br />19、递增一个全局变量要比递增一个局部变量慢2倍。<br /><br />20、递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。

21、递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。

22、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。

23、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。

24、派生类中的方法运行起来要快于在基类中定义的同样的方法。

25、调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。

26、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

27、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。

28、尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。

29、当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在 zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步 骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。

(举例如下)
if (strlen($foo) &lt; 5) { echo &ldquo;Foo is too short&rdquo;$$ }
(与下面的技巧做比较)
if (!isset($foo{5})) { echo &ldquo;Foo is too short&rdquo;$$ }

调用isset()恰巧比strlen()快,因为与后者不同的是,isset()作为一种语言结构,意味着它的执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度的顶层代码中你没有花太多开销。

34、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并 指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个 临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因 为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。

35、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。

36、并非要用类实现所有的数据结构,数组也很有用。

37、不要把方法细分得过多,仔细想想你真正打算重用的是哪些代码?

38、当你需要时,你总能把代码分解成方法。

39、尽量采用大量的PHP内置函数。

40、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。

41、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。

42、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。

43、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用 file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;

44、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;

45、优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);

46、尽可能的使用PHP内部函数(但是我却为了找个PHP里面不存在的函数,浪费了本可以写出一个自定义函数的时间,经验问题啊!);

47、循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);

48、多维数组尽量不要循环嵌套赋值;

49、在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;

50、foreach效率更高,尽量用foreach代替while和for循环;

51、用单引号替代双引号引用字符串;

52、“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;

53、对global变量,应该用完就unset()掉;</p>

- 阅读剩余部分 -

MVC部署(IIS6.0)

<p>MVC部署到IIS7.0是非常方便的事情,但是mvc部署到IIS6.0中,一些细节却不得不注意下。前一阵子,在IIS6.0 下部署ASP.NET MVC网站,走了一些弯路,也摸索出一些细节方面的体会, 跟大家分享下。
 
我所使用的环境环境:
l         操作系统 Windows Server 2003
l         Microsoft .net FrameWork 3.5 SP1
l         Microsoft MVC 1.0
l         IIS 6.0</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>
 
下面介绍下mvc部署到IIS6.0的安装步骤:
mvc部署1.      首先安装 Microsoft .net FrameWork 3.5 SP1安装包,需要在线下载一些内容,如果下载的是完整安装包,其中还是要有10M左右的需要在线下载的内容。
mvc部署2.      安装Microsoft MVC 1.0
mvc部署3.      安装IIS 6.0
mvc部署4.      IIS 的配置
n         ASP.NET 标签使用 ASP.NET v2.0.50727
n         建立一个应用程序池 MvcPool ,使用默认值。
n         文档 :默认文件 使用Default.aspx
n         添加MVC的解析:主目录标签,点击【配置】,【映射】,【添加】, .mvc ,关联文件为C:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_isapi.dll,确认文件是否存在 取消勾选,点击确定。
n         插入通配符应用程序映射,点击 【插入】,选择C:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_isapi.dll,确认文件是否存在 取消勾选,点击确定。
n         在不重启电脑的情况下Web服务扩展:
首先查看是否存在名称为 ASP.NET v2.0.50727,允许的服务扩展,如果不存在,那么,新建一个web服务扩展,关联文件为C:WINDOWSMicrosoft.NETFrameworkv2.0.50727aspnet_isapi.dll, 并设置为【允许】。
n         设置【主目录】,按照需要设置脚本资源访问、读取、写入、记录访问、索引资源 勾选项目。
n         选择其他网站没有使用的端口
n         设置网站的应用程序池为先前建立的 MvcPool
n         安装WCF服务宿主到服务器的服务列表中,启动该 服务,并设置为【自动启动】。
n         启动MvcPool应用程序池
n           启动网站.
n           IIS6.0日志的默认设置为C:WINDOWSsystem32LogFiles,但是最好不要设置到C盘,日志久了,或者访问量高了,慢慢的就会把C盘写满,导致网站无法保存新的内容。因此可以将其转移到其他盘,然后再定期清理。推荐建立一个操作系统的定时计划任务,写一个脚本,来定时执行清理。
mvc部署到IIS6.0 中有一定的困难,希望上文对您有所帮助.
 </p>

- 阅读剩余部分 -

PlentyOfFish.com .NET网站的又一传奇

PlentyOfFish(以下简称POF)是一家在美国广受欢迎的婚介交友网站,平均每月有4千5百万的访问者,每天有3千万的访问量(这是前一段时间的数据了),但你万万想不到的是,这个被估值$1000000000的网站却只有一个人每天只干两小时活。

- 阅读剩余部分 -

比较流行的PHP开发框架

<p> 近几年来,随着PHP作为一门被许多开发者选作他们的脚本语言而不断演化,PHP开发框架如雨后春笋般走上荧屏。人们总是在争吵到底哪个PHP开发框架最好,但不是每个框架都是为所有人而产生的,这本来是很简单的事实。这里列举五个最好的最受欢迎的PHP开发框架:  The Zend Framework  The Zend Framework 在开发社区中有大量的追随者,它致力于Web 2.0风格的程序。</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>因为它众多的追随者组成的活跃用户开发的扩展支持,Zend被称为“The PHP Company”。Zend是一个,也可能不是,今天可用的最受欢迎的PHP开发框架。它有健壮的特征能够支持协作开发,它需要一些PHP的额外知识。  CakePHP  CakePHP 无论对于初学者还是职业PHP开发者都是很好的选择。它基于与Ruby on Rails同样的原则而设计,它十分注重快速开发——这使得它成为一个非常好的用于RAD的开发框架。它快速增长的支持系统,简洁性和可测量性使得CakePHP成为今天可用的最受欢迎的PHP开发框架之一。  Symfony  Symfony 是为那些更加职业的主要开发企业级程序的开发者而准备的——特别是 Askeet 和 Yahoo! Bookmarks。这款开源PHP开发框架有着丰富的特性,做起这些来绰绰有余,它主要的缺点是比其他的框架略微慢一些。  Codelgniter  Codelgniter 以它的简单易用,性能和速度而闻名。与 Symphony 不同,这款PHP开发框架对于共享主机的用户而言很理想,如果你想有一个小型覆盖面的框架。它提供了简单的解决方案,还有扩展的知识库,通过视频教程,用户指南和wiki来提供支持。  初学者应当考虑CodeIgniter。  Seagull  Seagull 是一个良好的PHP开发框架,可以用来开发Web,命令行和GUI程序。这是一款无论对初学者还是职业程序员而言都及其简单的开发框架。对于初学者,Seagull提供一套包含样例程序的库,经过简单修改就能符合你的要求,而对于专家级程序员,Seagull提供了一整套设置选项——包括最佳练习,标准的和模块化的代码库——来快速简单地构建Web程序。Seagull有一个活跃的用户社区以及丰富的支持文档。  总结PHP开发框架对于各种能力层级的开发者都是一种减少重复编码需要的良好方式,同时加快开发过程,确保创建Web程序时写了正确的代码。这不仅加速了复杂程序的开发,同时也减少了你代码中的安全漏洞从而加强了PHP的安全性。  尽管一些专家级PHP程序员感觉没必要使用开发框架开发Web程序,它们在快速软件开发中仍然有巨大优势,比如在紧迫的期限下。而对于初学者或中等开发者,开发框架能够提高PHP学习效率同时促进练习编写高质量的代码且减少低质量代码,后者因为PHP自身的“宽松”特性而常常出现。  今天有许多可以使用的PHP开发框架,因此开发者肯定能找到一款满足他们在特性,支持,速度,可测度性等等方面的需求的框架。如今被开发者使用的顶级PHP开发框架包括:The Zend Framework,CakePHP,Symfony,Codelgniter和Seagull
thinkphp
ThinkPHP是一个开源的PHP框架, 是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。最早诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,并且遵循Apache2开源协议发布。早期的思想架构来源于Struts,后来经过不断改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开发结构和MVC模式,融合了Struts的Action和Dao思想和JSP的TagLib(标签库)、RoR的ORM映射和ActiveRecord模式,封装了CURD和一些常用操作,单一入口模式等,在模版引擎、缓存机制、认证机制和扩展性方面均有独特的表现,也已经越来越多地受到国内PHP开发人员的认可。  使用ThinkPHP,你可以更方便和快捷的开发和部署应用,当然不仅仅是企业级应用,任何PHP应用开发都可以从ThinkPHP的简单、兼容和快速的特性中受益。简洁、快速和实用是ThinkPHP发展秉承的宗旨,为此ThinkPHP会不断吸收和融入更好的技术以保证其新鲜和活力,提供WEB应用开发的最佳实践!  作为一个整体开发解决方案,ThinkPHP能够解决应用开发中的大多数需要,因为其自身包含了底层架构、兼容处理、基类库、数据库访问层、模板引擎、缓存机制、插件机制、角色认证、表单处理等常用的组件,并且对于跨版本、跨平台和跨数据库移植都比较方便。并且每个组件都是精心设计和完善的,应用开发过程仅仅需要关注您的业务逻辑。
Canphp
Canphp是一个中国开源的php框架,主要的设计理念就是为了追求简单,减少php初学者的学习成本,而且追求高效率,模版类不提供其他标签,直接应用php的源代码,还有它是微内核设计,移植性强,松散耦合等特点,能集成到你任何一个系统里面。其中集成的http类相当的强大,采集图片速度相当的快,为什么这样呢?因为适用了模拟异步多进程的原理。
InitPHP
InitPHP是一款轻量级的开源框架,采用分层体系架构,按需加载,具有高效、安全、易扩展、方便学习和修改框架本身等特点。InitPHP框架给您提供了详细开发手册,支持mysql分布式扩展,缓存体系自由切换,原生态的视图模型,多模型部署等。InitPhp,让框架变得简单!</p>

- 阅读剩余部分 -

FLEX制作MP3教程

<p>要做MP3要想下要想要的功能在开始初始化类</p><p>MP3的功能当然是先
1加载歌曲
2播放
3暂定 停止 播放
4上一首下一首
5播放顺序
6加载条,播放块
7音量
8播放列表</p><p>我们就分着8节开始讲</p><div style="page-break-after: always;"><span style="display: none;"><!--more-->& nbsp ;</span></div><p>
说到加载歌曲我们首先要用到类分别是 URLRequest (加载) Sound(声音)
这个类名是 MusicPlay
package{</p><p>先把这2个类导入进来才可以用,因为他们不是顶级类 必须先导入</p><p>import flash.net.URLRequest;
import flash.media.* 因为我们基本要使用里面大部分类 就导入整个包</p><p>private var shengyin:Sound //新建立个声音对象</p><p>punction function jiazai(url:String):void{ 这个函数提供歌曲加载功能</p><p>shengyin = new Sound() ; 初始化</p><p>shengyin.load(new URLRequest(url));开始加载</p><p>shengyin.addEventListener(Event.COMPLE,loadOK);当加载成功时候的事件</p><p>shengyin.play(); 开始加载了就能播放</p><p>}</p><p>}</p><p>在MXML文件运用</p><p>先导入,他们是在同一个包里 也可以不用导入</p><p>import MusicPlay;</p><p>private var plays:MuiscPlay = nw MusicPlay();实例化歌曲类</p><p>plays.jiazai("1.mp3");运行我们自定义类里的函数</p><p>所谓声音控制也就是 暂定 停止 播放

大家看下面一段代码

跟上一节一样我们就写在那个类里面所以代码我就不重心建类 在第一节那个原有的类里写代码

我们在做暂定 停止 播放前 需要一个变量来保存当前状态是播放状态还是停止状态,在播放状态下可以按停

止和暂定,在没播放状态下可以按播放按钮

private var bofang:Boolean = false;//初始化FALSE

private var weizhi:Number; //记录暂定的时间 然后播放从暂停位置开始播放

private var sy:Sound = new Sound();

private var sykz:SoundChanle = new SoundChanle();

//播放

public function plays():void{

if(!bofang){//如果歌曲不在播放状态下 才可以点击播放

sykz.stop();//在播放前停止所有声音。

sykz = sy.play(weizhi); //从暂停位置开始播放

bofang = true; 当前播放状态所以为true;

}
}

public function zanting():void{

if(bofang){ //当声音状态在播放情况下可以暂停和 停止

sykz.stop(); //在操作前先把声音STOP

weizhi = sykz.position; //记录声音在停止前播放的字节

bofang = false; //赞暂停后 声音状态自然就设置为FLASE

}

}
public function stop():void{

if(bofang){ 当声音在播放状态可以停止和播放

sykz.stop(); 一样先把声音停止

weizhi = 0; 既然停止了 一切都为0 当然是从新开始播放 设置为0是正确的

bofang = false; 一样停止了,当然播放状态就为FLASHE

}

}



好了想测试下很简单

就比如一个组件

<mx:Button id="btn" click = "danji">

private function danji():void{

MusicPlay.plays()

}</p>

- 阅读剩余部分 -

随机文章

最近回复

分类

其它

友情连接

推广链接