Component是什么?
Component是为sdk提供扩展显示组件的模块,例如播放器等。 如果SDK默认提供的组件无法满足需求,可以通过自定义的方式实现自己的功能,例如自己的UI组件。
如何自定义?
自定义功能需要注意一下几点:
- Component实现IEsComponent接口
- View实现IEsComponentView接口
- 方法必须是public方法,且同一个Component中不允许同名方法
- 方法的第一个参数必须是自定义的View本身
- 属性方法必须使用EsComponentAttribute的注解
- 注解可设置index来决定属性设置的优先级,值越小,优先级越高,取值范围0~100,默认值100
- 参数支持类型:
- 基本数据类型:
int
,String
,boolean
- 数组类型:
EsMap
,EsArray
- 回调类型:
EsPromise
Android端代码:
点击查看源码
// 创建View // 实现IEsComponentView接口
public final class VideoPlayerView extends FrameLayout implements IEsComponentView {
public VideoPlayerView(Context context) {
super(context);
}
}
//将View与Component关联 实现IEsComponent接口
public class MyVideoComponent implements IEsComponent<VideoComponent.VideoPlayerView> {
@Override
public VideoPlayerView createView(Context context) {
return new VideoPlayerView(context);
}
// 对应vue标签的属性 <video-player ref="video" :autoPlay=false />
@EsComponentAttribute(index = 0) // 如果各属性之间存在顺序执行问题,可指定属性调用顺序
public void autoPlay(VideoPlayerView view, boolean auto){
view.autoPlay(auto);
}
// 对应vue标签的属性 <video-player ref="video" :src=videoUrl />
@EsComponentAttribute
public void src(VideoPlayerView view, String url) {
view.setUrl(url);
}
// 对应vue标签的方法 this.$refs.video.pause()
@Override
public void dispatchFunction(VideoPlayerView view, String eventName, EsArray params, @Nullable EsPromise promise) {
switch (eventName){
case "play":
String url = params.getString("url");
break;
case "pause":
break;
case "getPosition": // 获取播放进度
if(promise != null) {
promise.resolve(view.getCurrentPlayPositioin());
}
break;
}
}
// 对应vue标签的回调 <video-player @player-status-changed="onPlayerStatusChanged" />
@Override
public void onPlayerStatusChanged(int playerStatus) throws RemoteException {
EsMap esMap = new EsMap();
esMap.pushInt("playerStatus", playerStatus);
//sendUIEvent方法:向UI控件发送事件
EsProxy.get().sendUIEvent(view.getId(), "onPlayerStatusChanged", esMap);
}
@Override
public void destroy(VideoView view) {
}
}
注册
1. SDK注册方式
InitConfig initConfig = InitConfig.getDefault();
initConfig.setAppId("注册的APPID")
.setSdkInitCallback(new EsKitInitCallback() { //使用EsKitInitCallback监听 注册你需要的自定义模块
@Override
public void onEsKitInitSuccess() {
// 注册到SDK
EsManager.get().registerComponent(MyVideoComponent.class.getName());
}
});
2. Vue注册方式
点击查看源码
//vue3注册方式
/**
* 播放器view
*/
function registerMyVideoPlayerViewComponent(app: ESApp) {
const videoViewComponent = {
component: {
name: 'MyVideoComponent',
processEventData(evtData, nativeEventParams: {
position: number
}) {
const {handler: event, __evt: nativeEventName} = evtData;
switch (nativeEventName) {
//------------------播放进度回调-----------------------
case 'onPlayerPositionChanged':
event.position = nativeEventParams.position;
break;
default:
}
return event;
},
},
}
registerElement('MyVideoComponent', videoViewComponent);
//
const VideoViewImpl = defineComponent({
emits: [
'player-position-changed',
//需要自己添加 名字自拟
],
setup(props, context) {
const videoPlayerViewComponentRef = ref()
const start = (progress: number): void => {
console.log('-------ESVideoPlayerViewComponent--------start-------->>>>')
Native.callUIFunction(videoPlayerViewComponentRef.value, 'start', [progress], (res) => {
//console.log('res-------->>>>' , res)
});
}
const seekTo = (progress: number): void => {
Native.callUIFunction(videoPlayerViewComponentRef.value, 'seekTo', [progress], (res) => {
//console.log('res-------->>>>' , res)
});
}
const pause = (): void => {
console.log('-------ESVideoPlayerViewComponent--------pause-------->>>>')
Native.callUIFunction(videoPlayerViewComponentRef.value, 'pause', (res) => {
//console.log('res-------->>>>' , res)
});
}
const getCurrentPosition = (): void => {
Native.callUIFunction(videoPlayerViewComponentRef.value, 'getCurrentPosition',
(res) => {
//console.log('res-------->>>>' , res)
});
}
const getDuration = (): void => {
Native.callUIFunction(videoPlayerViewComponentRef.value, 'getDuration',
(res) => {
//console.log('res-------->>>>' , res)
});
}
return () => {
return h(
'MyVideoComponent', {
ref: videoPlayerViewComponentRef,
onPlayerPositionChanged: (evt) => {
context.emit('player-status-changed', evt.position);
},
},
)
}
},
})
app.component('VideoPlayer', VideoViewImpl);
}
Vue2注册方式
//vu2注册方式
function ESAndroidPlayerViewComponent() {
Vue.registerElement('MyVideoComponent', {
component: {
name: 'MyVideoComponent',
}
}),
Vue.component('VideoPlayer', {
methods: {
pause(){
Vue.Native.callUIFunction(this.$refs.player, 'pause', [], (res) => {
console.log('res', res)
});
},
seekTo(position){
Vue.Native.callUIFunction(this.$refs.player, 'seekTo', [position], (res) => {
console.log('res', res)
});
},
getCurrentPositoin(callback){
Vue.Native.callUIFunction(this.$refs.player, 'getCurrentPosition', [],
(res) => {
callback(res)
});
},
}
})
}
Vue调用
点击查看源码
<video-player
ref="video"
class="video"
:autoPlay="false"
:src='videoUrl'
@player-status-changed='onPlayerStatusChanged'
/>
function onPlayerStatusChanged(e) {
const playerStatus = e.playerStatus;
console.log(`接收到的播放状态:${ playerStatus}`);
}
this.$refs.video.seekTo(1000)
this.$refs.video.pause()