使用
=1.6容器,video组件支持enableNative开启同层渲染
<1.5容器,video组件为异层渲染(和文档流不在一个层级),需要通过mix-mode属性来控制在上层还是下层。组件演示
axml
```html
属性信息: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}} 视频上方
<a name="IohQm"></a>#### css```css.warpper {background-color:white;width:100%;height:100%;display:flex;flex-direction: column;justify-content: center;align-items: center;}.container{flex: 1;color: #999;line-height: 30rpx;font-size: 16rpx;width: 100vw;}.flex{display: flex;flex-direction: row;align-items: center;justify-content: flex-start;flex-wrap: wrap;}.buttons{padding-left: 20rpx;padding-right: 20rpx;margin-bottom: 20rpx;border-bottom: 1rpx solid darkgoldenrod;}.button{margin-bottom: 10rpx;margin-right: 20rpx;padding-left: 10rpx;padding-right: 10rpx;border-radius: 8rpx;background-color: #ccc;}.tip{margin-bottom: 20rpx;padding-left: 20rpx;padding-right: 20rpx;padding-bottom: 20rpx;background-color: #25b864;color: #fff;}.text{color: red;}.item{width: 25%;}.vodeo_outside{background-color: rgb(8, 100, 238);width: 80vw;height: 250rpx;margin: 0 auto;display: flex;align-items: center;justify-content: center;position: relative;}.video{width: 50vw;height: 200rpx;display: flex;align-items: center;justify-content: center;}.video_inside{background-color: rgb(117, 213, 8);height: 50rpx;width: 30vw;}
ts
import { JSON, JSONObject, JSONArray } from "waft-json";import { console, getDataSource, Page, Props, WaftBridge, MessageEvent, setTimeout, document } from "waft";let _this: Index;export class Index extends Page {constructor(props: Props){super(props);_this = this;// 设置默认的statethis.setState(getDataSource());this.addEventListener('play', () => {console.log('=============onPlay==================')const newState = new JSONObject;newState.set('play', '点击了play按钮')newState.set('stop', '')newState.set('seek', '')newState.set('pause', '')_this.setState(newState)let props = new JSONArray();props.push(document.querySelector("#myVideo").props.componentId);WaftBridge.call("render.component.video", "play", props.toString());})this.addEventListener('pause', () => {console.log('=============pause==================')const newState = new JSONObject;newState.set('pause', "点击了pause按钮")newState.set('play', "")newState.set('stop', "")newState.set('seek', "")_this.setState(newState)let props = new JSONArray();props.push(document.querySelector("#myVideo").props.componentId);WaftBridge.call("render.component.video", "pause", props.toString());})this.addEventListener('stop', () => {console.log('=============stop==================')const newState = new JSONObject;newState.set('stop', "点击了stop按钮")newState.set('seek', "")newState.set('pause', "")newState.set('play', "")_this.setState(newState)let props = new JSONArray();props.push(document.querySelector("#myVideo").props.componentId);WaftBridge.call("render.component.video", "stop", props.toString());})this.addEventListener('seek', () => {console.log('=============seek==================')const newState = new JSONObject;newState.set('seek', "点击了seek按钮")newState.set('pause', "")newState.set('play', "")newState.set('stop', "")_this.setState(newState)let param = new JSONObject;param.set('position', 10000);let props = new JSONArray();props.push(document.querySelector("#myVideo").props.componentId);props.push(param);WaftBridge.call("render.component.video", "seek", props.toString());})this.addEventListener('loop', () => {console.log('=============loop==================')const newState = new JSONObject;newState.set('video', false)newState.set('play', '')newState.set('pause', '')newState.set('stop', '')newState.set('seek', '')newState.set('onPlay', '')newState.set('onPause', '')newState.set('onStop', '')newState.set('onEnded', '')newState.set('onError', '')newState.set('onTimeUpdate', '')_this.setState(newState)setTimeout(() => {const loop = _this.state.getBool('loop')const _newState = new JSONObject;_newState.set('loop', !loop)_newState.set('video', true)_this.setState(_newState)}, 10)})this.addEventListener('autoplay', () => {console.log('=============autoplay==================')const newState = new JSONObject;newState.set('video', false)newState.set('play', '')newState.set('pause', '')newState.set('stop', '')newState.set('seek', '')newState.set('onPlay', '')newState.set('onPause', '')newState.set('onStop', '')newState.set('onEnded', '')newState.set('onError', '')newState.set('onTimeUpdate', '')_this.setState(newState)setTimeout(() => {const autoplay = _this.state.getBool('autoplay')const _newState = new JSONObject;_newState.set('autoplay', !autoplay)_newState.set('video', true)_this.setState(_newState)}, 10)})this.addEventListener('muted', () => {console.log('=============muted==================')const newState = new JSONObject;newState.set('video', false)newState.set('play', '')newState.set('pause', '')newState.set('stop', '')newState.set('seek', '')newState.set('onPlay', '')newState.set('onPause', '')newState.set('onStop', '')newState.set('onEnded', '')newState.set('onError', '')newState.set('onTimeUpdate', '')_this.setState(newState)setTimeout(() => {const muted = _this.state.getBool('muted')const _newState = new JSONObject;_newState.set('muted', !muted)_newState.set('video', true)_this.setState(_newState)}, 10)})this.addEventListener('enableNative', () => {console.log('=============muted==================')const newState = new JSONObject;newState.set('video', false)newState.set('play', '')newState.set('pause', '')newState.set('stop', '')newState.set('seek', '')newState.set('onPlay', '')newState.set('onPause', '')newState.set('onStop', '')newState.set('onEnded', '')newState.set('onError', '')newState.set('onTimeUpdate', '')_this.setState(newState)setTimeout(() => {const enableNative = _this.state.getBool('enableNative')const _newState = new JSONObject;_newState.set('enableNative', !enableNative)_newState.set('video', true)_this.setState(_newState)}, 10)})this.addEventListener('controls', () => {console.log('=============muted==================')const newState = new JSONObject;newState.set('video', false)newState.set('play', '')newState.set('pause', '')newState.set('stop', '')newState.set('seek', '')newState.set('onPlay', '')newState.set('onPause', '')newState.set('onStop', '')newState.set('onEnded', '')newState.set('onError', '')newState.set('onTimeUpdate', '')_this.setState(newState)setTimeout(() => {const controls = _this.state.getBool('controls')const _newState = new JSONObject;_newState.set('controls', !controls)_newState.set('video', true)_this.setState(_newState)}, 10)})this.addEventListener('onPlay', () => {console.log('=============onPlay==================')const newState = new JSONObject;newState.set('onPlay', 'onPlay 被触发')newState.set('onPause', '')newState.set('onStop', '')newState.set('onEnded', '')newState.set('onError', '')_this.setState(newState)})this.addEventListener('onPause', () => {console.log('=============onPause==================')const newState = new JSONObject;newState.set('onPause', 'onPause 被触发')newState.set('onPlay', '')newState.set('onStop', '')newState.set('onEnded', '')newState.set('onError', '')_this.setState(newState)})this.addEventListener('onStop', () => {console.log('=============onPause==================')const newState = new JSONObject;newState.set('onStop', 'onStop 被触发')newState.set('onPlay', '')newState.set('onPause', '')newState.set('onEnded', '')newState.set('onError', '')_this.setState(newState)})this.addEventListener('onEnded', () => {console.log('=============onPause==================')const newState = new JSONObject;newState.set('onEnded', 'onEnded 被触发')newState.set('onStop', '')newState.set('onPlay', '')newState.set('onPause', '')newState.set('onError', '')_this.setState(newState)})this.addEventListener('onError', () => {console.log('=============onPause==================')const newState = new JSONObject;newState.set('onEnded', '')newState.set('onStop', '')newState.set('onPlay', '')newState.set('onPause', '')newState.set('onError', 'onError 被触发')_this.setState(newState)})this.addEventListener('onTimeUpdate', (event) => {const detail = event.toJSONObject().get('detail')// console.log('=============onTimeUpdate=================='+detail.toString())const newState = new JSONObject;newState.set('onTimeUpdate', detail.toString())_this.setState(newState)})}onShow(): void{// 页面显示console.log('page onShow');}onLoad(query: JSONObject): void{// 页面加载后console.log('page onLoad:' + JSON.stringify(query));}onMessage(event: MessageEvent): void{// 信息推送更新console.log('page onMessage:' + JSON.stringify(event.data));}}
- 调用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
