HTML5 API(上)-Canvas

<h2>一、Canvas</h2>
Canvas本质上是一个位图画步。

canvas.png

提示:
(1)Canvas的宽和高只能用属性方式声明!若使用样式来声明则无效。
(2)Canvas的本意是“画布/画板”,可以盛放绘制的内容;真正执行绘图任务的是“画笔/绘图上下文对象”——Context
(3)每一个画布,有且只有一个画笔对象:
<pre>var ctx = canvas.getContext( '2d' );</pre>
(4)画笔/绘图上下文对象的成员——小难点:
<pre>

  1. fillStyle:"#000000" 填充颜色
  2. font:"10px sans-serif" 字体
  3. globalAlpha:1 全局透明度
  4. lineCap:"butt" 线的端点样式
  5. lineJoin:"miter" 线的连接处样式
  6. lineWidth:1 线条的宽度
  7. shadowBlur:0 阴影部分模糊距离
  8. shadowColor:"rgba(0, 0, 0, 0)" 阴影部分颜色
  9. shadowOffsetX:0 阴影水平偏移量
  10. shadowOffsetY:0 阴影竖直偏移量
  11. strokeStyle:"#000000" 轮廓/描边颜色

  1. arc:arc() 绘制一个弧线
  2. beginPath:beginPath() 开始绘制路径
  3. clearRect:clearRect() 清除一个矩形范围
  4. clip:clip() 裁切
  5. closePath:closePath() 闭合一条路径
  6. createLinearGradient:createLinearGradient() 创建一个线性渐变色
  7. createRadialGradient:createRadialGradient() 创建一个径向渐变色
  8. drawImage:drawImage() 绘制一幅图像
  9. ellipse:ellipse() 绘制一个椭圆
  10. fill:fill() 填充一条路径
  11. fillRect:fillRect() 填充一个矩形区域
  12. fillText:fillText() 填充一段文本
  13. lineTo:lineTo() 绘制一条直线
  14. measureText:measureText() 测量一段文本,得到宽度
  15. moveTo:moveTo() 移动画笔到指定点
  16. rect:rect() 绘制一个矩形路径
  17. rotate:rotate() 旋转
  18. scale:scale() 缩放
  19. stroke:stroke() 对一条路径描边
  20. strokeRect:strokeRect() 对一个矩形进行描边
  21. strokeText:strokeText() 对一段文本进行描边
  22. translate:translate() 进行位移
    </pre>


    QQ截图20170328092438.png

    (1)绘制矩形(长方形)——矩形以自己的左上角作定位点
    (2)绘制文本——文字以自己的坐下角作定位点

html结构:
<pre>
<canvas id="diagonal" style="1px solid" width:"200" height:"200"></canvas>
</pre>
JavaScript代码:
<pre>
function drawDiagonal(){
//取的canvas元素及其绘图上下文
var canvas=document.getElementById("diagonal");
var context=canvas.getContext('2d');
//用绝对坐标来创建一条路径
context.beginPath();
context.moveTo(70,140);
context.lineTo(140,70);
//将这条线绘制到canvas上
context.stroke();
}
window.addEventListener('load',drawDiagonal(),true);
</pre>
练习:绘制一个左右来回移动的矩形
经典的碰撞反弹效果
<pre>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML5新特性——Canvas绘图技术</title>
<style>
canvas {
background: #efefef;
}
</style>
</head>
<body>
<canvas id="c1" width="500" height="400">
您的浏览器不支持Canvas标签!
</canvas>

<script>
//在画布上绘图需要使用画笔(绘图上下文)
var ctx = c1.getContext('2d'); //二维绘图对象

//练习:绘制一个左右来回移动的矩形
//经典的碰撞反弹效果

var x = 0;
var y = 0;
var xDirection = 1; //1表正向 -1表负向
setInterval(function(){
//清除已有内容
ctx.clearRect(0,0, 500,400);
ctx.fillRect(x,y, 50,40);
x += 5*xDirection;

if(x>=500-50){
  xDirection = -1;
}else if(x<=0){
  xDirection = 1;
}

}, 42);

</script>
</body>
</html>
</pre>
对于web API可以不用记住:可以查询Mozilla开发者网络API:https://developer.mozilla.org/
<h5>①第一步:Web API & DOM</h5>

QQ截图20170327181617.png

<h5>②第二步:Web API接口一览表</h5>

QQ截图20170328085704.png

<h5>③第三步:找到Canvas API</h5>

QQ截图20170328090333.png

<h5>④第四步:绘制矩形、文本,线型、文本样式、填充和描边样式、渐变和图案、图像等</h5>
<h2>二、Audio和Video</h2>
HTML5中的多媒体支持<video></video>、<audio></audio>
<pre>
<audio id="clickSound">
<source src="a.ogg">
<source src="b.mp3">
</audio>
<button id="toggle" onclick="toggleSound()">play</button>
</pre>

<pre>function toggleSound() {
var music = document.getElementById('clickSound');
var toggle = document.getElementById('toggle');
if(music.paused){
music.play();
toggle.innerHTML = 'Pause';
}else{
music.pause();
toggle.innerHTML = 'Play';
}
}</pre>
<video>标签可用的属性:
(1) src:待播放的资源的URL
(2) width:播放区域的宽度
(3) height:播放区域的高度
(4) controls:是否显示播放控件,默认不显示 false
(5) autoplay:是否自动播放,默认不自动播放 false
(6) loop:是否循环播放,默认不循环 false
(7) preload:如何预加载视频,可以赋值为
“none”:不预加载
“metadata”:只预加载元数据,如影片宽、高、大小、时长
“auto”:(默认值)自动预加载元数据以及部分影片数据
(8) poster:影片播放之前显示的“电影海报”
<pre>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>演示:video对象成员的使用</title>
<style>
.container {
text-align: center;
position: relative;
border: 1px solid #aaa;
}
.mask {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
background: rgba(0,0,0, .5);
}
.mask img {
margin-top: 200px;
cursor: pointer;
border: 1px solid #aaa;
border-radius: 50%;
background: rgba(255,255,255,0.2);
}
</style>
</head>
<body>

<div class="container">
<video id="player" src="resource/birds.mp4" >
您的浏览器不支持VIDEO标签
</video>

QQ截图20170328095727.png

</div>
</pre>
<pre>
<script>
//当点击“播放|暂停”按钮时,开始播放/暂停影片
playOrPause.onclick = function(){
if(player.paused === true){ //当前处于暂停状态
player.play(); //播放影片
playOrPause.src = 'resource/pause.png';
}else { //当前处于播放状态
player.pause();
playOrPause.src = 'resource/play.png';
}
}

//当影片暂停时,遮罩层中显示一个广告
player.onpause = function(){
ad.style.display = 'inline-block';
}
//当影片播放时,去除遮罩层中的广告
player.onplay = function(){
ad.style.display = 'none';
}
</script>
</pre>
<h2>三、Geolocation</h2>
HTML5 Geolocation API 用于获得用户的地理位置。
鉴于该特性可能侵犯用户的隐私,除非用户同意,否则用户位置信息是不可用的。
浏览器获得地理定位数据的原理:
手机: GPS、基站、IP反向解析
PC: IP反向解析
①使用 getCurrentPosition() 方法来获得用户的位置。
简单的地理定位实例,可返回用户位置的经度和纬度。

<pre>
<!DOCTYPE html>
<html>
<body>
<p id="demo">点击这个按钮,获得您的坐标:</p>
<button onclick="getLocation()">试一下</button>
<script>
var x=document.getElementById("demo");
function getLocation()
{
if (navigator.geolocation)
{
navigator.geolocation.getCurrentPosition(showPosition);
}
else{x.innerHTML="Geolocation is not supported by this browser.";}
}
function showPosition(position)
{
x.innerHTML="Latitude: " + position.coords.latitude +
"<br />Longitude: " + position.coords.longitude;
}
</script>
</body>
</html>
</pre>
例子解释:

检测是否支持地理定位
如果支持,则运行 getCurrentPosition() 方法。如果不支持,则向用户显示一段消息。
如果getCurrentPosition()运行成功,则向参数showPosition中规定的函数返回一个coordinates对象
showPosition() 函数获得并显示经度和纬度

上面的例子是一个非常基础的地理定位脚本,不含错误处理。
②处理错误和拒绝
getCurrentPosition() 方法的第二个参数用于处理错误。它规定当获取用户位置失败时运行的函数:
<pre>
function showError(error)
{
switch(error.code)
{
case error.PERMISSION_DENIED:
x.innerHTML="User denied the request for Geolocation."
break;
case error.POSITION_UNAVAILABLE:
x.innerHTML="Location information is unavailable."
break;
case error.TIMEOUT:
x.innerHTML="The request to get user location timed out."
break;
case error.UNKNOWN_ERROR:
x.innerHTML="An unknown error occurred."
break;
}
}
</pre>
错误代码:

Permission denied - 用户不允许地理定位
Position unavailable - 无法获取当前位置
Timeout - 操作超时

<h6>getCurrentPosition() 方法 - 返回数据</h6>
若成功,则 getCurrentPosition() 方法返回对象。始终会返回 latitude、longitude 以及 accuracy 属性。如果可用,则会返回其他下面的属性。

QQ截图20170328104949.png

Geolocation 对象 - 其他有趣的方法

watchPosition() - 返回用户的当前位置,并继续返回用户移动时的更新位置(就像汽车上的 GPS)。

clearWatch() - 停止 watchPosition() 方法

下面的例子展示 watchPosition() 方法。您需要一台精确的 GPS 设备来测试该例(比如 iPhone):
实例
<pre>
<script>
var x=document.getElementById("demo");
function getLocation()
{
if (navigator.geolocation)
{
navigator.geolocation.watchPosition(showPosition);
}
else{x.innerHTML="Geolocation is not supported by this browser.";}
}
function showPosition(position)
{
x.innerHTML="Latitude: " + position.coords.latitude +
"<br />Longitude: " + position.coords.longitude;
}
</script></pre>
<h6>百度地图</h6>
官网:http://lbsyun.baidu.com/
使用步骤:
(1)注册新用户,或者使用QQ、微博、微信账号登陆
https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http://lbsyun.baidu.com/

注册百度账号.png

(2)登录
https://passport.baidu.com/v2/?login&fr=old&login&u=http://lbsyun.baidu.com/
(3)查看开发者手册
http://lbsyun.baidu.com/index.php?title=jspopular

开发手册API.png

(4)每个使用百度地图API的应用必须申请一个唯一的AccessKey(AK)
http://lbsyun.baidu.com/apiconsole/key

1.png
2.png

3.png

(5)调用百度地图API
1)在地图上以某点为中心进行显示
2)添加地图控件
3)在地图上标记某点
DEMO地址: http://developer.baidu.com/map/jsdemo.htm#a1_2

demo.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容