Skip to content
贾俊辉 edited this page Jul 7, 2018 · 2 revisions

BaseVideoView、WindowVideoView、RelationAssist、AVPlayer用哪个合适?

  • BaseVideoView用于最普通的播放,类似于系统的VideoView。
  • WindowVideoView用于window模式的播放,VideoView的window形式。
  • RelationAssist用于带有无缝切播功能的播放组件,比如列表切全屏、跨页面无缝续播等。
  • AVPlayer单纯的解码器,适合用于音乐播放器。

PlayerEvent、ReceiverEvent、ProducerEvent、GroupValue使用场景及使用技巧

  • PlayerEvent主要来自解码器的事件,DataProvider的事件也会在其中体现。
  • ReceiverEvent均发自BaseReceiver的子类,用户自定义的Cover和Receiver发出的事件均为ReceiverEvent。
  • ProducerEvent事件生产者(EventProducer)所发出的事件,比如框架内部的NetworkEventProducer。
  • GroupValue一个带监听数据变更的共享数据池,用于Receiver组件间的数据通信。

ReceiverEvent和GroupValue都可用于Receiver之间通信,用哪个合适?

  • 通知型事件

只是某个动作或操作触发的临时事件,并不需要记录其状态的,选用ReceiverEvent比较合适。

  • 数据型事件

某个配置变更或者数据变化需要通知其他Receiver或外部时,选择GroupValue比较合适。 GroupValue会存储你所放置的数据。

注意: 如果通知时的数据并不需要存储只是一个临时事件,请尽量使用ReceiverEvent。

Receiver中如何获取到播放进度、总时长、缓冲进度?

  • 被动获取

被动获取这些数据需要Receiver实现OnTimerUpdateListener接口,框架会自动把数据回调到onTimerUpdate(...)方法中,定时器会每秒回调一次,定时器可随时中断与唤醒。中断时回调即终止,再次唤醒则回调继续。

  • 主动获取

在Receiver内部可以调用getPlayerStateGetter()方法获取到PlayerStateGetter,通过PlayerStateGetter可以获取到当前播放进度、总时长以及缓冲进度等信息。

注意: PlayerStateGetter仅在Receiver的bind()生命周期后与unbind()生命周期前生效,所以调用时需要判空处理。

Cover视图放置到容器时的层级如何精细控制?

比如我要确保Error视图是在最上方的,Error出现时所有其他视图均不可见。

类似于这种需求,我们就需要对视图的优先级有精确的区分,Cover被定义了三种层级,Low、Medium、High。

Low在视图的最底层,Medium在中间,High在最上方。

每种层级下均可以指定其具体的优先级,比如LoadingCover和ControllerCover如果都在Low层级下,但是我需要Loading总是在Controller的上方,我们可以对两种Cover分别指定不同的priority进行区分,调用levelLow(int priority)方法并将该方法返回值通过getCoverLevel()返回即可。

priority的值较大就会被放置于上方,较小就会被放置于下方。

如下:

public class LoadingCover extends BaseCover{
    //....
    public int getCoverLevel(){
        return levelLow(2);
    }
}

public class ControllerCover extends BaseCover{
    //....
    public int getCoverLevel(){
        return levelLow(0);
    }
}

注意: priority的取值范围为0-31