Waft容器 1.6+ Waft前端框架 0.7+

使用

=1.6容器,video组件支持enableNative开启同层渲染
<1.5容器,video组件为异层渲染(和文档流不在一个层级),需要通过mix-mode属性来控制在上层还是下层。

组件演示

screenshot.png

axml

```html

play
pause
stop
seek
loop
autoplay
muted
enableNative
controls
属性信息:
play: {{play}}
pause: {{pause}}
stop: {{stop}}
seek: {{seek}}
autoplay: {{autoplay}}
loop: {{loop}}
controls: {{controls}}
muted: {{muted}}
enableNative: {{enableNative}}
onPlay: {{onPlay}}
onPause: {{onPause}}
onStop: {{onStop}}
onEnded: {{onEnded}}
onError: {{onError}}
onTimeUpdate: {{onTimeUpdate}}
视频上方

  1. <a name="IohQm"></a>
  2. #### css
  3. ```css
  4. .warpper {
  5. background-color:white;
  6. width:100%;
  7. height:100%;
  8. display:flex;
  9. flex-direction: column;
  10. justify-content: center;
  11. align-items: center;
  12. }
  13. .container{
  14. flex: 1;
  15. color: #999;
  16. line-height: 30rpx;
  17. font-size: 16rpx;
  18. width: 100vw;
  19. }
  20. .flex{
  21. display: flex;
  22. flex-direction: row;
  23. align-items: center;
  24. justify-content: flex-start;
  25. flex-wrap: wrap;
  26. }
  27. .buttons{
  28. padding-left: 20rpx;
  29. padding-right: 20rpx;
  30. margin-bottom: 20rpx;
  31. border-bottom: 1rpx solid darkgoldenrod;
  32. }
  33. .button{
  34. margin-bottom: 10rpx;
  35. margin-right: 20rpx;
  36. padding-left: 10rpx;
  37. padding-right: 10rpx;
  38. border-radius: 8rpx;
  39. background-color: #ccc;
  40. }
  41. .tip{
  42. margin-bottom: 20rpx;
  43. padding-left: 20rpx;
  44. padding-right: 20rpx;
  45. padding-bottom: 20rpx;
  46. background-color: #25b864;
  47. color: #fff;
  48. }
  49. .text{
  50. color: red;
  51. }
  52. .item{
  53. width: 25%;
  54. }
  55. .vodeo_outside{
  56. background-color: rgb(8, 100, 238);
  57. width: 80vw;
  58. height: 250rpx;
  59. margin: 0 auto;
  60. display: flex;
  61. align-items: center;
  62. justify-content: center;
  63. position: relative;
  64. }
  65. .video{
  66. width: 50vw;
  67. height: 200rpx;
  68. display: flex;
  69. align-items: center;
  70. justify-content: center;
  71. }
  72. .video_inside{
  73. background-color: rgb(117, 213, 8);
  74. height: 50rpx;
  75. width: 30vw;
  76. }

ts

  1. import { JSON, JSONObject, JSONArray } from "waft-json";
  2. import { console, getDataSource, Page, Props, WaftBridge, MessageEvent, setTimeout, document } from "waft";
  3. let _this: Index;
  4. export class Index extends Page {
  5. constructor(props: Props){
  6. super(props);
  7. _this = this;
  8. // 设置默认的state
  9. this.setState(getDataSource());
  10. this.addEventListener('play', () => {
  11. console.log('=============onPlay==================')
  12. const newState = new JSONObject;
  13. newState.set('play', '点击了play按钮')
  14. newState.set('stop', '')
  15. newState.set('seek', '')
  16. newState.set('pause', '')
  17. _this.setState(newState)
  18. let props = new JSONArray();
  19. props.push(document.querySelector("#myVideo").props.componentId);
  20. WaftBridge.call("render.component.video", "play", props.toString());
  21. })
  22. this.addEventListener('pause', () => {
  23. console.log('=============pause==================')
  24. const newState = new JSONObject;
  25. newState.set('pause', "点击了pause按钮")
  26. newState.set('play', "")
  27. newState.set('stop', "")
  28. newState.set('seek', "")
  29. _this.setState(newState)
  30. let props = new JSONArray();
  31. props.push(document.querySelector("#myVideo").props.componentId);
  32. WaftBridge.call("render.component.video", "pause", props.toString());
  33. })
  34. this.addEventListener('stop', () => {
  35. console.log('=============stop==================')
  36. const newState = new JSONObject;
  37. newState.set('stop', "点击了stop按钮")
  38. newState.set('seek', "")
  39. newState.set('pause', "")
  40. newState.set('play', "")
  41. _this.setState(newState)
  42. let props = new JSONArray();
  43. props.push(document.querySelector("#myVideo").props.componentId);
  44. WaftBridge.call("render.component.video", "stop", props.toString());
  45. })
  46. this.addEventListener('seek', () => {
  47. console.log('=============seek==================')
  48. const newState = new JSONObject;
  49. newState.set('seek', "点击了seek按钮")
  50. newState.set('pause', "")
  51. newState.set('play', "")
  52. newState.set('stop', "")
  53. _this.setState(newState)
  54. let param = new JSONObject;
  55. param.set('position', 10000);
  56. let props = new JSONArray();
  57. props.push(document.querySelector("#myVideo").props.componentId);
  58. props.push(param);
  59. WaftBridge.call("render.component.video", "seek", props.toString());
  60. })
  61. this.addEventListener('loop', () => {
  62. console.log('=============loop==================')
  63. const newState = new JSONObject;
  64. newState.set('video', false)
  65. newState.set('play', '')
  66. newState.set('pause', '')
  67. newState.set('stop', '')
  68. newState.set('seek', '')
  69. newState.set('onPlay', '')
  70. newState.set('onPause', '')
  71. newState.set('onStop', '')
  72. newState.set('onEnded', '')
  73. newState.set('onError', '')
  74. newState.set('onTimeUpdate', '')
  75. _this.setState(newState)
  76. setTimeout(() => {
  77. const loop = _this.state.getBool('loop')
  78. const _newState = new JSONObject;
  79. _newState.set('loop', !loop)
  80. _newState.set('video', true)
  81. _this.setState(_newState)
  82. }, 10)
  83. })
  84. this.addEventListener('autoplay', () => {
  85. console.log('=============autoplay==================')
  86. const newState = new JSONObject;
  87. newState.set('video', false)
  88. newState.set('play', '')
  89. newState.set('pause', '')
  90. newState.set('stop', '')
  91. newState.set('seek', '')
  92. newState.set('onPlay', '')
  93. newState.set('onPause', '')
  94. newState.set('onStop', '')
  95. newState.set('onEnded', '')
  96. newState.set('onError', '')
  97. newState.set('onTimeUpdate', '')
  98. _this.setState(newState)
  99. setTimeout(() => {
  100. const autoplay = _this.state.getBool('autoplay')
  101. const _newState = new JSONObject;
  102. _newState.set('autoplay', !autoplay)
  103. _newState.set('video', true)
  104. _this.setState(_newState)
  105. }, 10)
  106. })
  107. this.addEventListener('muted', () => {
  108. console.log('=============muted==================')
  109. const newState = new JSONObject;
  110. newState.set('video', false)
  111. newState.set('play', '')
  112. newState.set('pause', '')
  113. newState.set('stop', '')
  114. newState.set('seek', '')
  115. newState.set('onPlay', '')
  116. newState.set('onPause', '')
  117. newState.set('onStop', '')
  118. newState.set('onEnded', '')
  119. newState.set('onError', '')
  120. newState.set('onTimeUpdate', '')
  121. _this.setState(newState)
  122. setTimeout(() => {
  123. const muted = _this.state.getBool('muted')
  124. const _newState = new JSONObject;
  125. _newState.set('muted', !muted)
  126. _newState.set('video', true)
  127. _this.setState(_newState)
  128. }, 10)
  129. })
  130. this.addEventListener('enableNative', () => {
  131. console.log('=============muted==================')
  132. const newState = new JSONObject;
  133. newState.set('video', false)
  134. newState.set('play', '')
  135. newState.set('pause', '')
  136. newState.set('stop', '')
  137. newState.set('seek', '')
  138. newState.set('onPlay', '')
  139. newState.set('onPause', '')
  140. newState.set('onStop', '')
  141. newState.set('onEnded', '')
  142. newState.set('onError', '')
  143. newState.set('onTimeUpdate', '')
  144. _this.setState(newState)
  145. setTimeout(() => {
  146. const enableNative = _this.state.getBool('enableNative')
  147. const _newState = new JSONObject;
  148. _newState.set('enableNative', !enableNative)
  149. _newState.set('video', true)
  150. _this.setState(_newState)
  151. }, 10)
  152. })
  153. this.addEventListener('controls', () => {
  154. console.log('=============muted==================')
  155. const newState = new JSONObject;
  156. newState.set('video', false)
  157. newState.set('play', '')
  158. newState.set('pause', '')
  159. newState.set('stop', '')
  160. newState.set('seek', '')
  161. newState.set('onPlay', '')
  162. newState.set('onPause', '')
  163. newState.set('onStop', '')
  164. newState.set('onEnded', '')
  165. newState.set('onError', '')
  166. newState.set('onTimeUpdate', '')
  167. _this.setState(newState)
  168. setTimeout(() => {
  169. const controls = _this.state.getBool('controls')
  170. const _newState = new JSONObject;
  171. _newState.set('controls', !controls)
  172. _newState.set('video', true)
  173. _this.setState(_newState)
  174. }, 10)
  175. })
  176. this.addEventListener('onPlay', () => {
  177. console.log('=============onPlay==================')
  178. const newState = new JSONObject;
  179. newState.set('onPlay', 'onPlay 被触发')
  180. newState.set('onPause', '')
  181. newState.set('onStop', '')
  182. newState.set('onEnded', '')
  183. newState.set('onError', '')
  184. _this.setState(newState)
  185. })
  186. this.addEventListener('onPause', () => {
  187. console.log('=============onPause==================')
  188. const newState = new JSONObject;
  189. newState.set('onPause', 'onPause 被触发')
  190. newState.set('onPlay', '')
  191. newState.set('onStop', '')
  192. newState.set('onEnded', '')
  193. newState.set('onError', '')
  194. _this.setState(newState)
  195. })
  196. this.addEventListener('onStop', () => {
  197. console.log('=============onPause==================')
  198. const newState = new JSONObject;
  199. newState.set('onStop', 'onStop 被触发')
  200. newState.set('onPlay', '')
  201. newState.set('onPause', '')
  202. newState.set('onEnded', '')
  203. newState.set('onError', '')
  204. _this.setState(newState)
  205. })
  206. this.addEventListener('onEnded', () => {
  207. console.log('=============onPause==================')
  208. const newState = new JSONObject;
  209. newState.set('onEnded', 'onEnded 被触发')
  210. newState.set('onStop', '')
  211. newState.set('onPlay', '')
  212. newState.set('onPause', '')
  213. newState.set('onError', '')
  214. _this.setState(newState)
  215. })
  216. this.addEventListener('onError', () => {
  217. console.log('=============onPause==================')
  218. const newState = new JSONObject;
  219. newState.set('onEnded', '')
  220. newState.set('onStop', '')
  221. newState.set('onPlay', '')
  222. newState.set('onPause', '')
  223. newState.set('onError', 'onError 被触发')
  224. _this.setState(newState)
  225. })
  226. this.addEventListener('onTimeUpdate', (event) => {
  227. const detail = event.toJSONObject().get('detail')
  228. // console.log('=============onTimeUpdate=================='+detail.toString())
  229. const newState = new JSONObject;
  230. newState.set('onTimeUpdate', detail.toString())
  231. _this.setState(newState)
  232. })
  233. }
  234. onShow(): void{
  235. // 页面显示
  236. console.log('page onShow');
  237. }
  238. onLoad(query: JSONObject): void{
  239. // 页面加载后
  240. console.log('page onLoad:' + JSON.stringify(query));
  241. }
  242. onMessage(event: MessageEvent): void{
  243. // 信息推送更新
  244. console.log('page onMessage:' + JSON.stringify(event.data));
  245. }
  246. }
  • 调用API ```typescript import { VideoElement } from ‘waft’;

const video = document.querySelector(“#myVideo”) as VideoElement; // 播放 video.play(); // 暂停 video.pause(); ```

属性说明

属性 类型 描述
src String 要播放视频的资源地址
loop Boolean 是否循环播放
默认值:false
autoplay Boolean 是否自动播放
默认值:false
muted Boolean 是否静音
默认值:false
controls Boolean 是否显示默认播放控件(底部工具条,包括播放/暂定按钮、播放进度、时间)
默认值:false
poster String 视频封面图的url。如果不传的话,默认取视频的首帧图作为封面图
scale-type String 当视频、封面大小和容器大小不一致时,表现形式
- fit-center/fitCenter
- center-crop/centerCrop
- fit-xy/fitXY

默认值:fitCenter | | enableNative(1.6以上支持) | Boolean | 是否启动Native同层渲染播放器
默认值:false | | mix-mode(1.6以上废弃) | String | 显示层次,可设置:
underlay,置于底层(非enableNative下异层渲染,可能会被遮住)
normal:置于顶层 | | onPlay | EventHandle | 当开始/继续播放时触发play事件 | | onPause | EventHandle | 当暂停播放时触发pause事件 | | onEnded | EventHandle | 当播放到末尾时触发ended事件 | | onStop | EventHandle | 视频播放终止,恢复到视频首帧,点击播放按钮可以继续播放 | | onError | EventHandle | 当视频播放出错时触发,{“errorCode”:”int 错误码”} | | onTimeUpdate | EventHandle | 当播放进度变化时触发,{“currentTime”:’’int 当前进度”, “videoDuration”:”int 视频总时长”} |

API

moduleName: video

API 参数 描述
play String viewId;组件的唯一标志 开始播放/继续播放
pause String viewId;组件的唯一标志 暂停播放
stop String viewId;组件的唯一标志 停止播放,回到初始状态

附录

  • 如何切换视频
    通过修改src属性
  • 事件触发的情况说明(目前小程序模拟器事件不能正常触发,如果后续需要行为可以看齐)
    • 如果是循环播放:在重新播之前会触发onEnded和onPlay
    • 如果是非循环播放:在播放结束会触发onEnded和onStop