Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
r15132706585
uni-app
提交
62facd69
U
uni-app
项目概览
r15132706585
/
uni-app
与 Fork 源项目一致
Fork自
DCloud / uni-app
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-app
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
62facd69
编写于
4月 18, 2019
作者:
fxy060608
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat(h5): canvas 高清处理
上级
849687ff
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
623 addition
and
443 deletion
+623
-443
src/core/view/components/canvas/hidpi.js
src/core/view/components/canvas/hidpi.js
+168
-0
src/core/view/components/canvas/index.vue
src/core/view/components/canvas/index.vue
+455
-443
未找到文件。
src/core/view/components/canvas/hidpi.js
0 → 100644
浏览文件 @
62facd69
const
pixelRatio
=
(
function
()
{
const
canvas
=
document
.
createElement
(
'
canvas
'
)
const
context
=
canvas
.
getContext
(
'
2d
'
)
const
backingStore
=
context
.
backingStorePixelRatio
||
context
.
webkitBackingStorePixelRatio
||
context
.
mozBackingStorePixelRatio
||
context
.
msBackingStorePixelRatio
||
context
.
oBackingStorePixelRatio
||
context
.
backingStorePixelRatio
||
1
return
(
window
.
devicePixelRatio
||
1
)
/
backingStore
})()
const
forEach
=
function
(
obj
,
func
)
{
for
(
let
key
in
obj
)
{
if
(
obj
.
hasOwnProperty
(
key
))
{
func
(
obj
[
key
],
key
)
}
}
}
const
ratioArgs
=
{
'
fillRect
'
:
'
all
'
,
'
clearRect
'
:
'
all
'
,
'
strokeRect
'
:
'
all
'
,
'
moveTo
'
:
'
all
'
,
'
lineTo
'
:
'
all
'
,
'
arc
'
:
[
0
,
1
,
2
],
'
arcTo
'
:
'
all
'
,
'
bezierCurveTo
'
:
'
all
'
,
'
isPointinPath
'
:
'
all
'
,
'
isPointinStroke
'
:
'
all
'
,
'
quadraticCurveTo
'
:
'
all
'
,
'
rect
'
:
'
all
'
,
'
translate
'
:
'
all
'
,
'
createRadialGradient
'
:
'
all
'
,
'
createLinearGradient
'
:
'
all
'
,
'
setTransform
'
:
[
4
,
5
]
}
if
(
pixelRatio
!==
1
)
{
const
proto
=
CanvasRenderingContext2D
.
prototype
forEach
(
ratioArgs
,
function
(
value
,
key
)
{
proto
[
key
]
=
(
function
(
_super
)
{
return
function
()
{
if
(
this
.
__ignore__
)
{
return
_super
.
apply
(
this
,
arguments
)
}
let
args
=
Array
.
prototype
.
slice
.
call
(
arguments
)
if
(
value
===
'
all
'
)
{
args
=
args
.
map
(
function
(
a
)
{
return
a
*
pixelRatio
})
}
else
if
(
Array
.
isArray
(
value
))
{
for
(
let
i
=
0
;
i
<
value
.
length
;
i
++
)
{
args
[
value
[
i
]]
*=
pixelRatio
}
}
return
_super
.
apply
(
this
,
args
)
}
})(
proto
[
key
])
})
proto
.
stroke
=
(
function
(
_super
)
{
return
function
()
{
if
(
this
.
__ignore__
)
{
return
_super
.
apply
(
this
,
arguments
)
}
this
.
lineWidth
*=
pixelRatio
_super
.
apply
(
this
,
arguments
)
this
.
lineWidth
/=
pixelRatio
}
})(
proto
.
stroke
)
proto
.
fillText
=
(
function
(
_super
)
{
return
function
()
{
if
(
this
.
__ignore__
)
{
return
_super
.
apply
(
this
,
arguments
)
}
const
args
=
Array
.
prototype
.
slice
.
call
(
arguments
)
args
[
1
]
*=
pixelRatio
args
[
2
]
*=
pixelRatio
this
.
font
=
this
.
font
.
replace
(
/
(\d
+
)(
px|em|rem|pt
)
/g
,
function
(
w
,
m
,
u
)
{
return
(
m
*
pixelRatio
)
+
u
}
)
_super
.
apply
(
this
,
args
)
this
.
font
=
this
.
font
.
replace
(
/
(\d
+
)(
px|em|rem|pt
)
/g
,
function
(
w
,
m
,
u
)
{
return
(
m
/
pixelRatio
)
+
u
}
)
}
})(
proto
.
fillText
)
proto
.
strokeText
=
(
function
(
_super
)
{
return
function
()
{
if
(
this
.
__ignore__
)
{
return
_super
.
apply
(
this
,
arguments
)
}
var
args
=
Array
.
prototype
.
slice
.
call
(
arguments
)
args
[
1
]
*=
pixelRatio
// x
args
[
2
]
*=
pixelRatio
// y
this
.
font
=
this
.
font
.
replace
(
/
(\d
+
)(
px|em|rem|pt
)
/g
,
function
(
w
,
m
,
u
)
{
return
(
m
*
pixelRatio
)
+
u
}
)
_super
.
apply
(
this
,
args
)
this
.
font
=
this
.
font
.
replace
(
/
(\d
+
)(
px|em|rem|pt
)
/g
,
function
(
w
,
m
,
u
)
{
return
(
m
/
pixelRatio
)
+
u
}
)
}
})(
proto
.
strokeText
)
proto
.
drawImageByCanvas
=
(
function
(
_super
)
{
return
function
(
canvas
,
srcx
,
srcy
,
srcw
,
srch
,
desx
,
desy
,
desw
,
desh
,
isScale
)
{
if
(
this
.
__ignore__
)
{
return
_super
.
apply
(
this
,
arguments
)
}
srcx
*=
pixelRatio
srcy
*=
pixelRatio
srcw
*=
pixelRatio
srch
*=
pixelRatio
desx
*=
pixelRatio
desy
*=
pixelRatio
desw
=
isScale
?
desw
*
pixelRatio
:
desw
desh
=
isScale
?
desh
*
pixelRatio
:
desh
_super
.
call
(
this
,
canvas
,
srcx
,
srcy
,
srcw
,
srch
,
desx
,
desy
,
desw
,
desh
)
}
})(
proto
.
drawImage
)
proto
.
drawImage
=
(
function
(
_super
)
{
return
function
()
{
if
(
this
.
__ignore__
)
{
return
_super
.
apply
(
this
,
arguments
)
}
this
.
scale
(
pixelRatio
,
pixelRatio
)
_super
.
apply
(
this
,
arguments
)
this
.
scale
(
1
/
pixelRatio
,
1
/
pixelRatio
)
}
})(
proto
.
drawImage
)
}
export
function
wrapper
(
canvas
)
{
canvas
.
style
.
height
=
canvas
.
height
+
'
px
'
canvas
.
style
.
width
=
canvas
.
width
+
'
px
'
canvas
.
width
*=
pixelRatio
canvas
.
height
*=
pixelRatio
console
.
log
(
canvas
.
width
)
console
.
log
(
canvas
.
height
)
}
src/core/view/components/canvas/index.vue
浏览文件 @
62facd69
...
...
@@ -6,13 +6,10 @@
<canvas
ref=
"canvas"
width=
"300"
height=
"150"
/>
height=
"150"
/>
<div
style=
"position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden;"
>
<slot
/>
<slot
/>
</div>
<v-uni-resize-sensor
ref=
"sensor"
@
resize=
"_resize"
/>
</uni-canvas>
</
template
>
<
script
>
...
...
@@ -20,6 +17,10 @@ import {
subscriber
}
from
'
uni-mixins
'
import
{
wrapper
}
from
'
./hidpi
'
function
resolveColor
(
color
)
{
color
=
color
.
slice
(
0
)
color
[
3
]
=
color
[
3
]
/
255
...
...
@@ -69,7 +70,8 @@ export default {
eventHandler
.
push
((
$event
)
=>
{
this
.
$trigger
(
event
,
Object
.
assign
({},
$event
,
{
touches
:
processTouches
(
$event
.
currentTarget
,
$event
.
touches
),
changedTouches
:
processTouches
(
$event
.
currentTarget
,
$event
.
changedTouches
)
changedTouches
:
processTouches
(
$event
.
currentTarget
,
$event
.
changedTouches
)
}))
})
}
...
...
@@ -87,8 +89,8 @@ export default {
},
mounted
()
{
this
.
_resize
({
width
:
this
.
$
refs
.
sensor
.
$el
.
offsetWidth
,
height
:
this
.
$
refs
.
sensor
.
$el
.
offsetHeight
width
:
this
.
$
el
.
offsetWidth
,
height
:
this
.
$
el
.
offsetHeight
})
},
methods
:
{
...
...
@@ -101,12 +103,16 @@ export default {
method
(
data
)
}
},
_resize
({
width
,
height
})
{
_resize
({
width
,
height
})
{
var
canvas
=
this
.
$refs
.
canvas
if
(
canvas
.
width
!==
width
||
canvas
.
height
!==
height
)
{
canvas
.
width
=
width
canvas
.
height
=
height
}
wrapper
(
canvas
)
},
_touchmove
(
event
)
{
event
.
preventDefault
()
...
...
@@ -165,7 +171,8 @@ export default {
LinearGradient
.
addColorStop
(
offset
,
color
)
})
}
else
if
(
data
[
0
]
===
'
pattern
'
)
{
let
loaded
=
this
.
checkImageLoaded
(
data
[
1
],
actions
.
slice
(
index
+
1
),
callbackId
,
function
(
image
)
{
let
loaded
=
this
.
checkImageLoaded
(
data
[
1
],
actions
.
slice
(
index
+
1
),
callbackId
,
function
(
image
)
{
if
(
image
)
{
c2d
[
method1
]
=
c2d
.
createPattern
(
image
,
data
[
2
])
}
...
...
@@ -217,9 +224,11 @@ export default {
var
url
=
dataArray
[
0
]
var
otherData
=
dataArray
.
slice
(
1
)
self
.
_images
=
self
.
_images
||
{}
if
(
!
self
.
checkImageLoaded
(
url
,
actions
.
slice
(
index
+
1
),
callbackId
,
function
(
image
)
{
if
(
!
self
.
checkImageLoaded
(
url
,
actions
.
slice
(
index
+
1
),
callbackId
,
function
(
image
)
{
if
(
image
)
{
c2d
.
drawImage
.
apply
(
c2d
,
[
image
].
concat
([...
otherData
.
slice
(
4
,
8
)],
[...
otherData
.
slice
(
0
,
4
)]))
c2d
.
drawImage
.
apply
(
c2d
,
[
image
].
concat
([...
otherData
.
slice
(
4
,
8
)],
[...
otherData
.
slice
(
0
,
4
)]))
}
}))
return
'
break
'
}())
...
...
@@ -327,7 +336,8 @@ export default {
sefl
.
_images
[
src
].
src
=
src
}
else
{
// 解决 PLUS-APP(wkwebview)以及 H5 图像跨域问题(H5图像响应头需包含access-control-allow-origin)
if
(
window
.
plus
&&
src
.
indexOf
(
'
http://
'
)
!==
0
&&
src
.
indexOf
(
'
https://
'
)
!==
0
)
{
if
(
window
.
plus
&&
src
.
indexOf
(
'
http://
'
)
!==
0
&&
src
.
indexOf
(
'
https://
'
)
!==
0
)
{
loadFile
(
src
)
}
else
if
(
/^data:
[
a-z-
]
+
\/[
a-z-
]
+;base64,/
.
test
(
src
))
{
sefl
.
_images
[
src
].
src
=
src
...
...
@@ -413,7 +423,8 @@ export default {
if
(
!
height
)
{
height
=
Math
.
round
(
data
.
length
/
4
/
width
)
}
this
.
$refs
.
canvas
.
getContext
(
'
2d
'
).
putImageData
(
new
ImageData
(
new
Uint8ClampedArray
(
data
),
width
,
height
),
x
,
y
)
this
.
$refs
.
canvas
.
getContext
(
'
2d
'
).
putImageData
(
new
ImageData
(
new
Uint8ClampedArray
(
data
),
width
,
height
),
x
,
y
)
}
catch
(
error
)
{
UniViewJSBridge
.
publishHandler
(
'
onCanvasMethodCallback
'
,
{
callbackId
,
...
...
@@ -434,17 +445,18 @@ export default {
}
</
script
>
<
style
>
uni-canvas
{
uni-canvas
{
width
:
300px
;
height
:
150px
;
display
:
block
;
position
:
relative
;
}
uni-canvas
>
canvas
{
}
uni-canvas
>
canvas
{
position
:
absolute
;
top
:
0
;
left
:
0
;
width
:
100%
;
height
:
100%
;
}
}
</
style
>
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录