金沙国际官网_金沙国际平台登录

因为这个金沙国际官网_金沙国际平台登录网站与很多的大型澳门赌场都有合作,金沙国际官网_金沙国际平台登录尽职尽责,高效执行,保持好奇心,不断学习,追求卓越,点击进入金沙国际官网_金沙国际平台登录马上体验吧,所以现在也正式地开始了营业。

您的位置:金沙国际官网 > web前端 > jQuery制作视频播放器完全指南,图像旋转与翻转

jQuery制作视频播放器完全指南,图像旋转与翻转

发布时间:2019-11-05 03:09编辑:web前端浏览(199)

    HTML5+CSS3+jQuery制作视频播放器完全指南

    2012/05/12 · HTML5 · 2 评论 · CSS3, HTML5

    英文原文:designmodo.com,编译:王然@CSDN

    导读:毫无疑问HTML5已经是大势所趋,知名视频网站YouTube在两年前就开始推广HTML5播放器来代替Flash。虽然国内还没有完全普及HTML5浏览器,但在各大本土浏览器厂商的努力下,支持HTML5的浏览器在中国浏览器市场的占有率也在不断增长中。本教程将会手把手地教你制作一个基于HTML5& CSS3& JavaScript 技术的视频播放器。

    1.下载MediaElement.js

    首先下载MediaElement.js脚本文件,这是一个开源的HTML5音、视频插件,解压后你会得到3个文件—— “flashmediaelement.swf”、 “mediaelement-and-player.min.js”和 “silverlightmediaelement.xap” ,分别是使用Flash、 JavaScript和 SilverLight实现视频播放,并且新建一个”js”文件夹并把它们放进去(当然本例中并不需要 “flashmediaelement.swf” 和 “silverlightmediaelement.xap” 两个文件,可以删去。)。

    2.HTML标记

    首先需要链接(link)一个jQuery库,这里使用的是Google托管的jQuery库。然后我们在链接”mediaelement-and-player.min.js”文件和CSS文件。

    XHTML

    <head> <title>Video Player</title> <script src="; <script src="js/mediaelement-and-player.min.js"></script> <link rel="stylesheet" href="css/style.css" media="screen"> </head>

    1
    2
    3
    4
    5
    6
    <head>
        <title>Video Player</title>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
        <script src="js/mediaelement-and-player.min.js"></script>
        <link rel="stylesheet" href="css/style.css" media="screen">
    </head>

    当然我们还需要添加一个HTML5 video标记来创建一个视频播放器,再添加一些属性将它初始化。(注:poster是指视频的预览图)

    XHTML

    <video width="640" height="267" poster="media/cars.png"> <source src="media/cars.mp4" type="video/mp4"> </video>

    1
    2
    3
    <video width="640" height="267" poster="media/cars.png">
        <source src="media/cars.mp4" type="video/mp4">
    </video>

    接下来我们再加入下面的代码来创建控制面板,需要添加的控制器或功能有:

    ● alwaysShowControls – “true”则设置video控制面板永远显示,”false”则在鼠标移走后隐藏。

    ● videoVolume – “horizontal”设置音量滑动控制器为水平

    ● 其它功能:暂停播放、前进播放、声音和全屏

    JavaScript

    <script type="text/javascript">// <![CDATA[ $(document).ready(function() { $('video').mediaelementplayer({ alwaysShowControls: true, videoVolume: 'horizontal', features: ['playpause','progress','volume','fullscreen'] }); }); // ]]></script>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <script type="text/javascript">// <![CDATA[
    $(document).ready(function() {
        $('video').mediaelementplayer({
            alwaysShowControls: true,
            videoVolume: 'horizontal',
            features: ['playpause','progress','volume','fullscreen']
        });
    });
    // ]]></script>

    更多设置请查阅MediaElement.js的设置文档。

    3.播放器基本样式设计

    先修改一下样式设置:

    CSS

    .mejs-inner, .mejs-inner div, .mejs-inner a, .mejs-inner span, .mejs-inner button, .mejs-inner img { margin: 0; padding: 0; border: none; outline: none; }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    .mejs-inner,
    .mejs-inner div,
    .mejs-inner a,
    .mejs-inner span,
    .mejs-inner button,
    .mejs-inner img {
        margin: 0;
        padding: 0;
        border: none;
        outline: none;
    }

    再给video container添加样式,下面的代码全部都是用来控制布局的,没有对播放器样式做任何修改。

    CSS

    .mejs-container { position: relative; background: #000000; } .mejs-inner { position: relative; width: inherit; height: inherit; } .me-plugin { position: absolute; } .mejs-container-fullscreen .mejs-mediaelement, .mejs-container-fullscreen video, .mejs-embed, .mejs-embed body, .mejs-mediaelement { width: 100%; height: 100%; } .mejs-embed, .mejs-embed body { margin: 0; padding: 0; overflow: hidden; } .mejs-container-fullscreen { position: fixed; left: 0; top: 0; right: 0; bottom: 0; overflow: hidden; z-index: 1000; } .mejs-background, .mejs-mediaelement, .mejs-poster, .mejs-overlay { position: absolute; top: 0; left: 0; } .mejs-poster img { display: block; }

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    .mejs-container {
        position: relative;
        background: #000000;
    }
     
    .mejs-inner {
        position: relative;
        width: inherit;
        height: inherit;
    }
     
    .me-plugin { position: absolute; }
     
    .mejs-container-fullscreen .mejs-mediaelement,
    .mejs-container-fullscreen video,
    .mejs-embed,
    .mejs-embed body,
    .mejs-mediaelement {
        width: 100%;
        height: 100%;
    }
     
    .mejs-embed,
    .mejs-embed body {
        margin: 0;
        padding: 0;
        overflow: hidden;
    }
     
    .mejs-container-fullscreen {
        position: fixed;
        left: 0;
        top: 0;
        right: 0;
        bottom: 0;
        overflow: hidden;
        z-index: 1000;
    }
     
    .mejs-background,
    .mejs-mediaelement,
    .mejs-poster,
    .mejs-overlay {
        position: absolute;
        top: 0;
        left: 0;
    }
     
    .mejs-poster img { display: block; }

     

    图片 1

    4.控制面板样式设置

    让我们先从添加“播放按钮”开始:

    CSS

    .mejs-overlay-play { cursor: pointer; } .mejs-inner .mejs-overlay-button { position: absolute; top: 50%; left: 50%; width: 50px; height: 50px; margin: -25px 0 0 -25px; background: url(../img/play.png) no-repeat; }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    .mejs-overlay-play { cursor: pointer; }
     
    .mejs-inner .mejs-overlay-button {
        position: absolute;
        top: 50%;
        left: 50%;
        width: 50px;
        height: 50px;
        margin: -25px 0 0 -25px;
        background: url(../img/play.png) no-repeat;
    }

    接下来再添加视频控制器布局:将它放在视频底部,高度为34px,再添加一个背景颜色,配合RGBA来设置透明度。最后给按钮添加基本样式和图元。

    CSS

    .mejs-container .mejs-controls { position: absolute; width: 100%; height: 34px; left: 0; bottom: 0; background: rgb(0,0,0); background: rgba(0,0,0, .7); } .mejs-controls .mejs-button button { display: block; cursor: pointer; width: 16px; height: 16px; background: transparent url(../img/controls.png); }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    .mejs-container .mejs-controls {
        position: absolute;
        width: 100%;
        height: 34px;
        left: 0;
        bottom: 0;
        background: rgb(0,0,0);
        background: rgba(0,0,0, .7);
    }
     
    .mejs-controls .mejs-button button {
        display: block;
        cursor: pointer;
        width: 16px;
        height: 16px;
        background: transparent url(../img/controls.png);
    }

     

    图片 2

    5.视频控制器

    这一步我们要做的只是将控制器居右放置。所以首先我们将所有的按钮放到控制面板上,之后再对它们的宽度、位置和背景图片做详细的调整。

    CSS

    .mejs-controls div.mejs-playpause-button { position: absolute; top: 12px; left: 15px; } .mejs-controls .mejs-play button, .mejs-controls .mejs-pause button { width: 12px; height: 12px; background-position: 0 0; } .mejs-controls .mejs-pause button { background-position: 0 -12px; } .mejs-controls div.mejs-volume-button { position: absolute; top: 12px; left: 45px; } .mejs-controls .mejs-mute button, .mejs-controls .mejs-unmute button { width: 14px; height: 12px; background-position: -12px 0; } .mejs-controls .mejs-unmute button { background-position: -12px -12px; } .mejs-controls div.mejs-fullscreen-button { position: absolute; top: 7px; right: 7px; } .mejs-controls .mejs-fullscreen-button button, .mejs-controls .mejs-unfullscreen button { width: 27px; height: 22px; background-position: -26px 0; } .mejs-controls .mejs-unfullscreen button { background-position: -26px -22px; }

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    .mejs-controls div.mejs-playpause-button {
        position: absolute;
        top: 12px;
        left: 15px;
    }
     
    .mejs-controls .mejs-play button,
    .mejs-controls .mejs-pause button {
        width: 12px;
        height: 12px;
        background-position: 0 0;
    }
     
    .mejs-controls .mejs-pause button { background-position: 0 -12px; }
     
    .mejs-controls div.mejs-volume-button {
        position: absolute;
        top: 12px;
        left: 45px;
    }
     
    .mejs-controls .mejs-mute button,
    .mejs-controls .mejs-unmute button {
        width: 14px;
        height: 12px;
        background-position: -12px 0;
    }
     
    .mejs-controls .mejs-unmute button { background-position: -12px -12px; }
     
    .mejs-controls div.mejs-fullscreen-button {
        position: absolute;
        top: 7px;
        right: 7px;
    }
     
    .mejs-controls .mejs-fullscreen-button button,
    .mejs-controls .mejs-unfullscreen button {
        width: 27px;
        height: 22px;
        background-position: -26px 0;
    }
     
    .mejs-controls .mejs-unfullscreen button { background-position: -26px -22px; }

     

    图片 3

    6.音量滑动控制器

    音量滑动控制器的设置也一样,设置好位置和大小,再添加一个圆角效果就可以了。

    CSS

    .mejs-controls div.mejs-horizontal-volume-slider { position: absolute; cursor: pointer; top: 15px; left: 65px; } .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total { width: 60px; background: #d6d6d6; } .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current { position: absolute; width: 0; top: 0; left: 0; } .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total, .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current { height: 4px; -webkit-border-radius: 2px; -moz-border-radius: 2px; border-radius: 2px; }

    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
    26
    27
    .mejs-controls div.mejs-horizontal-volume-slider {
        position: absolute;
        cursor: pointer;
        top: 15px;
        left: 65px;
    }
     
    .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total {
        width: 60px;
        background: #d6d6d6;
    }
     
    .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current {
        position: absolute;
        width: 0;
        top: 0;
        left: 0;
    }
     
    .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-total,
    .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current {
        height: 4px;
     
        -webkit-border-radius: 2px;
        -moz-border-radius: 2px;
        border-radius: 2px;
    }

     

    图片 4

    7.进度条

    进度条的设置也同样简单,将它紧贴在控制面板上方就可以了,之后就是设置不同状态(all和loaded状态)的背景颜色。现在将它初始化为零就可以在影片播放时自动改变了。(但是你看不出来。)

    CSS

    .mejs-controls div.mejs-time-rail { position: absolute; width: 100%; left: 0; top: -10px; } .mejs-controls .mejs-time-rail span { position: absolute; display: block; cursor: pointer; width: 100%; height: 10px; top: 0; left: 0; } .mejs-controls .mejs-time-rail .mejs-time-total { background: rgb(152,152,152); background: rgba(152,152,152, .5); } .mejs-controls .mejs-time-rail .mejs-time-loaded { background: rgb(0,0,0); background: rgba(0,0,0, .3); } .mejs-controls .mejs-time-rail .mejs-time-current { width: 0; }

    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
    26
    27
    28
    .mejs-controls div.mejs-time-rail {
        position: absolute;
        width: 100%;
        left: 0;
        top: -10px;
    }
     
    .mejs-controls .mejs-time-rail span {
        position: absolute;
        display: block;
        cursor: pointer;
        width: 100%;
        height: 10px;
        top: 0;
        left: 0;
    }
     
    .mejs-controls .mejs-time-rail .mejs-time-total {
        background: rgb(152,152,152);
        background: rgba(152,152,152, .5);
    }
     
    .mejs-controls .mejs-time-rail .mejs-time-loaded {
        background: rgb(0,0,0);
        background: rgba(0,0,0, .3);
    }
     
    .mejs-controls .mejs-time-rail .mejs-time-current { width: 0; }

     

    图片 5

    8.进度条控制器和时间提示框

    这一步就该给进度条添加一个进度条控制器和一个时间提示框,同样我们还是调整位置,设置宽度、高度和背景图片,再添加一些排版样式。

    CSS

    .mejs-controls .mejs-time-rail .mejs-time-handle { position: absolute; cursor: pointer; width: 16px; height: 18px; top: -3px; background: url(../img/handle.png); } .mejs-controls .mejs-time-rail .mejs-time-float { position: absolute; display: none; width: 33px; height: 23px; top: -26px; margin-left: -17px; background: url(../img/tooltip.png); } .mejs-controls .mejs-time-rail .mejs-time-float-current { position: absolute; display: block; left: 0; top: 4px; font-family: Helvetica, Arial, sans-serif; font-size: 10px; font-weight: bold; color: #666666; text-align: center; } .mejs-controls .mejs-time-rail .mejs-time-float-corner { display: none; }

    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
    26
    27
    28
    29
    30
    31
    32
    33
    .mejs-controls .mejs-time-rail .mejs-time-handle {
        position: absolute;
        cursor: pointer;
        width: 16px;
        height: 18px;
        top: -3px;
        background: url(../img/handle.png);
    }
     
    .mejs-controls .mejs-time-rail .mejs-time-float {
        position: absolute;
        display: none;
        width: 33px;
        height: 23px;
        top: -26px;
        margin-left: -17px;
        background: url(../img/tooltip.png);
    }
     
    .mejs-controls .mejs-time-rail .mejs-time-float-current {
        position: absolute;
        display: block;
        left: 0;
        top: 4px;
     
        font-family: Helvetica, Arial, sans-serif;
        font-size: 10px;
        font-weight: bold;
        color: #666666;
        text-align: center;
    }
     
    .mejs-controls .mejs-time-rail .mejs-time-float-corner { display: none; }

     

    图片 6

    9.绿色的已播放进度条

    本教程的最后一步就是在进度条和音量滑动条上添加绿色的已播放进度条和音量显示,这个也很简单。

    CSS

    .mejs-controls .mejs-time-rail .mejs-time-current, .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current { background: #82d344; background: -webkit-linear-gradient(top, #82d344 0%, #51af34 100%); background: -moz-linear-gradient(top, #82d344 0%, #51af34 100%); background: -o-linear-gradient(top, #82d344 0%, #51af34 100%); background: -ms-linear-gradient(top, #82d344 0%, #51af34 100%); background: linear-gradient(top, #82d344 0%, #51af34 100%); }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    .mejs-controls .mejs-time-rail .mejs-time-current,
    .mejs-controls .mejs-horizontal-volume-slider .mejs-horizontal-volume-current {
        background: #82d344;
        background: -webkit-linear-gradient(top, #82d344 0%, #51af34 100%);
        background: -moz-linear-gradient(top, #82d344 0%, #51af34 100%);
        background: -o-linear-gradient(top, #82d344 0%, #51af34 100%);
        background: -ms-linear-gradient(top, #82d344 0%, #51af34 100%);
        background: linear-gradient(top, #82d344 0%, #51af34 100%);
    }

     

    图片 7

    总结:虽然很简单,但这确实是一个很不错的开源(CC许可证3.0)视频播放器!经过设置还可以支持多种视频格式,所以它不仅仅可以被用来做网络视频播放器,如果你还愿意给它增加一些功能,甚至可以把它可以做成跨平台的本地视频播放器。

    Demo下载地址:

    ● 本地下载

    ● designmodo.com

     

    赞 3 收藏 2 评论

    图片 8

    canvas 图像旋转与翻转姿势解锁

    2017/05/26 · HTML5 · Canvas

    原文出处: 凹凸实验室   

    多图预警,数学不好可直接跳至文末小结。

    React Native基础&入门教程:调试React Native应用的一小步

    2018/07/04 · JavaScript · React Native

    原文出处: 葡萄城控件   

    React Native(以下简称RN)为传统前端开发者打开了一扇新的大门。其中,使用浏览器的调试工具去Debug移动端的代码,无疑是最吸引开发人员的特性之一。

    试想一下,当你在手机屏幕按下一个按钮,处理事件的代码就可以立即在浏览器的调试工具里进行断点调试,而且每当你对代码进行修改,界面便可以完成快速地重载,省去昂长的编译时间,这会是多么提高工作效率。

    传统的Web前端开发人员自然很熟悉浏览器的调试工具,但是对于如何将其在RN中使用以便和移动端结合起来,也许会相当陌生。这也成为了一些开发者跨入RN移动开发大门的第一道小门槛。

    本文是笔者一边参考官方文档,一边摸索RN调试过程的记录。希望能够帮助新手开发者走出一小步,更快地迈过这道门槛。

    在开始之前,你需要搭建好本地开发环境,并有一部Android 5.0版本以上的手机可供连接至电脑。

    首先,使用官方工具react-native-cli创建好一个初始化的工程,并安装好依赖。

    安装的命令为“react-native init DebugTest”(DebugTest为我们这次的项目名称)

    安装完成后,就会多出一个名为DebugTest项目文件夹,文件夹内结构如下:

    图片 9

    图1. 项目初始结构

    让我们把项目运行起来。我这里是在Windows下开发Android平台的应用,并且在此之前,已经用USB线连接好了一台Android版本7.1.1的真机。

    运行项目的方法,就是进入DebugTest项目目录,此时执行命令行react-native run-android。注意,这里启动时会新弹出另一个窗口,用于在8081端口启动一个叫做Metro Bundler的服务,这个窗口在开发时是需要保持运行着的。

    图片 10

    图2. Metro Bundler 窗口

    同时,可以看到原cmd命令行窗口,显示在真机上安装了apk,并自动对8081端口进行了某种映射,使真机上的应用和我们将要调试的代码建立了动态的关联。这个过程会比较消耗开发者电脑的系统资源,耐心等待一会儿就好。

    图片 11

    图3. 原cmd命令行窗口

    当Metro Bundler窗口显示index.js的映射进度达到100%时,手机上就可以看到默认的应用界面了。

    图片 12

    图4. 默认应用界面

    同时,我们也可以退出应用,在手机的桌面上找到这个安装好的应用。这里,它的名字就是DebugTest,图标是一个默认的安卓样子。

    我们进入这个应用,这时如果摇一摇手机,会弹出调试相关的设置:

    图片 13

    图5. 调试设置界面

    Reload就是重刷整个应用,类似于在浏览器的F5刷新。

    Debug JS Remotely这个我们先留一个悬念,待会再来看。

    先看看Enable Live Reload和Enable Hot Reloading。这两个都可以实现在代码保存时自动更新界面,它们区别是:Live Reload会重刷整个界面,相当于手动执行一次Reload。而Hot Reloading控制得更精准,它不会重刷整个界面,只会更新修改代码时影响的那个范围。官方文档里描述的是:This will allow you to persist the app’s state through reloads. 也就是说,Hot Reloading时整个应用的状态是不会改变的,页面也是不会整个重刷的。有趣的是,与Live Reload对比,Hot Reloading的Reloading这个正在进行时的语法,也似乎意味着Hot Reloading是当程序正在运行时去热乎乎地替换。

    也许是因为各种 Reloading过于强大,它有时会出一点问题,比如在开启Live Reload或者Hot Reloading后,偶尔代码错误时手机上弹出的红屏界面在代码修改好后仍然不能恢复,这种时候,就需要手动Reload界面才能解决。

    让我们只是Enable Live Reload,然后从react-native引入Button,在View里加上一个按钮。

    图片 14

    图6. 添加按钮

    这个时候,保存代码。手机界面确实立即就变化了!说明Live Reload确实生效了。

    不过,不是我们想要的界面,而是出现红屏错误提示。

    图片 15

    图7. 红屏错误提示

    不用怕,遇到问题很正常。这时,可以从头细心阅读错误提示,发现它指出The title prop of a Button must be a string,并且这个error is located at: in Button (at App.js:37)。根据这个线索,我们看到App.js的第37行,正是刚才添加的Button代码。

    查阅文档发现,在RN里,Button组件有许多属性,其中onPress和title这两个属性是required的,也就是必须要有。

    图片 16

    图8. 官方文档关于Button的节选

    所以我们修改代码,

    图片 17

    图9. 补全Button需要的属性

    保存,手机界面就刷新了,并显示出刚才添加的Button。

    图片 18

    图10. 正常运行

    这里还有一小点值得注意,如果只给Button里的title设了值,而没有给onPress设置,界面不会出红色错误,而是在最下面出现一条黄色警告。仔细看,会发现其实这两个属性的Type不一样。由此可知,当需要的类型是string而实际是undefined时,会报error,而需要的类型是function而实际是undefined时,只会报warnning。

    同时可以看到,在上面的代码中,当按钮按下时,会调用一个打log的事件。但是打出的log在哪儿可以看到呢?

    有两种方法。 第一种是在命令行显示,在项目当前目录(注意,一定要在项目当前目录)再启动一个新命令行窗口,输入

    图片 19

    就可以在最下面看到输出的内容了,它不仅可以实时反馈现有的输入,还保存了之前的输入。比如,下面三次输入,前两次输入是在之前还没有开启这个命令行窗口时按下的。

    图片 20

    也许你会想:我不是想在命令窗口看到输出,而是想能够在浏览器里那样看到输出,甚至断点调试。这就是查看log的第二种方法。

    回到本文的初衷。让我们回头再看看调试设置界面中的Debug JS Remotely选项,现在点击它。这时会弹出Chrome的一个标签(当然,本地需要预先安装有Chrome)。

    图片 21

    图11. 打开Remote JS Debugging后弹出的浏览器标签

    注意这里的Status:Debugger session #0 active就表示程序与该页面成功建立连接了。

    这个时候在浏览器开发者工具的调试窗口,也能看到打出的log。而且它还可以更进一步地进行断点调试。

    为更好地尝试调试功能,我们修改一下代码,添加一个sayHello方法输出log。

    图片 22

    图12. 重新绑定onPress事件

    保存,和预想的一样,页面刷新了,因为Live Reload。

    如同调试Web前端代码一样,我们打开浏览器的开发者工具,找到代码文件,并在sayHello函数里打一个断点。这个时候,按下手机上的Test按钮,可以看到程序执行到断点停下了,这与调试网页代码是多么相似:

    图片 23

    图13. 浏览器上的断点调试

    不过,与调试纯网页代码有两点不同。

    第一,浏览器的页面上看不到应用界面,只能在手机上看到界面。

    第二,手机上的界面在程序被断住的情况下,仍然可以接收事件。举个例子,就在此时,手机上该应用的界面表面上没什么反应,但是,如果你再多次按下Test按钮,事件都会被记住,到时候会挨个响应。只是现在程序断在了第一次按下按钮的时候。

    我们让程序继续(如果在断点期间多次按下按钮,会有多次被断住)。

    图片 24

    图14. 浏览器控制台输出

    我们按下了6次,调试工具下也显示出6次输出。这是与调试网页时的不同:当调试网页时,一旦执行到断点,浏览器的页面其实就不可点击了。

    到这一步,是不是觉得使用RN开发也没有那么难呢?

    至于Toggle Inspector, Show Perf Monitor, Start/Stop Sampling Profiler和Dev Settings,我们暂时可以不用管它们。

    目前已经知道了调试设置中Remote JS Debugging, Live Reload和 Hot Reloading。相信我们已经可以比较从容地Debug简单的 RN应用了。这里以Windows下的Android为例,其实在Mac下开发iOS也是相似的。

    希望本文的分享对尝试RN的新手朋友有所帮助。如果大家对下篇想讲的内容有自己的想法,请留言告诉我,我们一定会认真考虑。

     

    1 赞 收藏 评论

    图片 25

    需求背景

    从一个游戏需求说起:
    图片 26

    1. 技术选型:canvas
      上图所展示的游戏场景,“可乐瓶”里有多个“气泡”,需要设置不同的动画效果,且涉及 deviceOrientation 的交互,需要有大量计算改变元素状态。从性能方面考虑,canvas 是不二的选择。
    2. 技术点:canvas 绘制图像
      通过对游戏场景的进一步分析,可见场景中的“气泡”元素形状都是相同的,且不规则,通过 canvas 直接绘制形状实现成本较高,因此需要在 canvas 上绘制图像。
    3. 技术点:canvas 图像旋转与翻转
      虽然“气泡”元素是相同的,可以使用相同的图像,但图像需要多个角度/多个方向展示,因此需要对图像进行相应的旋转与翻转(镜像),这也是本文所要介绍的重点。

    后文代码以下图左侧绿框的“气泡”为示例,右侧展示了场景中用到的两个图像:
    图片 27

    认识 canvas 坐标系

    canvas 上图像的旋转和翻转,常见的做法是将 canvas 坐标系统进行变换。因此,我们需要先认识 canvas 坐标系统:
    图片 28
    由上图可得,canvas 2D 环境中坐标系统和 Web 的坐标系统是一致的,有以下几个特点:

    1. 坐标原点 (0,0) 在左上角
    2. X坐标向右方增长
    3. Y坐标向下方延伸

    回到上述需求中,我们获取 canvas 对象并设置相应的宽高:

    XHTML

    <canvas id='myCanvas'></canvas>

    1
    <canvas id='myCanvas'></canvas>

    JavaScript

    // 获取 canvas 对象 var canvas = document.getElementById('myCanvas') canvas.width = 750 canvas.height = 1054 // 获取 canvas 2D 上下文对象 var ctx = canvas.getContext('2d')

    1
    2
    3
    4
    5
    6
    // 获取 canvas 对象
    var canvas = document.getElementById('myCanvas')
    canvas.width = 750
    canvas.height = 1054
    // 获取 canvas 2D 上下文对象
    var ctx = canvas.getContext('2d')

    此时,canvas 的坐标系统如下图所示:
    图片 29

    在 canvas 上绘制图像

    在 canvas 上绘制图像,可以使用 drawImage() 方法,语法如下(详细用法参见 MDN):

    JavaScript

    void ctx.drawImage(image, dx, dy); void ctx.drawImage(image, dx, dy, dWidth, dHeight); void ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);

    1
    2
    3
    void ctx.drawImage(image, dx, dy);
    void ctx.drawImage(image, dx, dy, dWidth, dHeight);
    void ctx.drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight);

    需要注意的是,图像必须加载完毕,才能绘制到 canvas 上,否则会出现空白:

    JavaScript

    var img = new Image() img.src = 'xxxxxxx.png' img.onload = function() { // 绘制图像 ctx.drawImage(img, 512, 220, 160, 192); }

    1
    2
    3
    4
    5
    6
    var img = new Image()
    img.src = 'xxxxxxx.png'
    img.onload = function() {
    // 绘制图像
    ctx.drawImage(img, 512, 220, 160, 192);
    }

    此时,便可以 canvas 上看到一个未旋转/翻转的“气泡”图像,如下图所示:
    图片 30

    本文由金沙国际官网发布于web前端,转载请注明出处:jQuery制作视频播放器完全指南,图像旋转与翻转

    关键词: