Android layout Exoplayer2是否总是导致至少调用onSurfaceSizeChanged()两次?

Android layout Exoplayer2是否总是导致至少调用onSurfaceSizeChanged()两次?,android-layout,exoplayer2.x,Android Layout,Exoplayer2.x,我的应用程序使用一个自定义框架布局,其中包含一个PlayerView和另一个自定义框架布局(“DrawView”)。目标是在显示在正在播放的视频顶部的FrameLayout上绘制自定义形状 在布局中,首先是PlayerView,然后是DrawView: <!-- customized FrameLayout encompassing ViewPager2 and DrawView, which implements that capability of detecting

我的应用程序使用一个自定义框架布局,其中包含一个PlayerView和另一个自定义框架布局(“DrawView”)。目标是在显示在正在播放的视频顶部的FrameLayout上绘制自定义形状

在布局中,首先是PlayerView,然后是DrawView:

<!-- customized FrameLayout encompassing ViewPager2 and DrawView, which implements that capability of
         detecting taps -->
<com.reddragon.intouch.utils.ViewPager2Host
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:id="@+id/viewpager2host"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000"
    tools:context=".ui.MediaPlayerActivity">

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/activity_media_player_viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </androidx.viewpager2.widget.ViewPager2>

    <com.reddragon.intouch.ui.drawview.DrawView
        android:id="@+id/drawView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

这里是我的问题-
onSurfaceSizeChanged()
被多次调用,我只想为
DrawView
计算一次大小和位置。从我的测试中可以看出,只要
ViewPager2Host
父级不更改维度,那么
onSurfaceSizeChanged()
就会被调用两次,第二次是“最终”维度

有人能证实这一点吗?或者,是否存在这样的情况—可能是父维度与SurfaceSizeChanged()
上只调用一次的视频表面视图维度完全匹配

或者是否有某种方法可以知道曲面大小何时为“最终”


我正在尝试实现某种“如果视频正在初始化,那么”逻辑,这样只有在所有布局完成并且视频表面rect完成之后,我需要计算DrawView的大小和位置。

对于我最初的问题,简单的答案似乎是:否-除了至少调用一次之外,无法保证在正常渲染管道中调用了多少次

经过进一步测试,也很明显,即使在使用STATE_READY调用onPlayerStateChanged()之后,视频大小仍然不稳定(我已经多次看到,即使在调用STATE_READY之后,onSurfaceSizeChanged()也会使用更新的值调用)

因此,我最初的想法是在播放后处理onPlayerStateChanged()中的所有内容,而现在看来这并不是一个好的答案

仍在寻找我如何能告诉视频表面已经安定下来的大小,它认为是“最终”播放视频

作为复习,我的自定义FrameLayout有三个“层”(每个层完全填满与当前ViewPager2适配器关联的支架):

  • 媒体显示(图像的Glide实现或媒体的ExoPlayer2 PlayerView)
  • DrawView(自定义框架布局,可容纳顶部绘制的各种形状)
  • FrameLayout(当来自Internet的视频媒体需要一段时间才能缓冲时,会显示一个不确定的进度条和文本)
  • 我的解决方案是(当ViewPager2 recyclerview中的“下一个”项准备好显示视频时):

  • 最初隐藏DrawView和媒体显示层
  • 显示“正在加载”组件
  • 在ExoPlayer上设置PlayerWhenReady(true)
  • 准备(mediaDataSource)
  • 在我的活动实现的ExoPlayer的onPlayerStateChanged()回调中,测试playWhenReady是否为TRUE,PlayBackState是否为STATE_READY,然后
  • 删除“加载”视图
  • 将ExoPlayer视图设置为可见
  • 根据ExoPlayer的videoSurfaceView尺寸和位置,计算DrawView中的各种绘图小部件
  • 将DrawView设置为可见
  • 我不知道为什么,但它似乎覆盖了其他回调,比如那些来自VideoListener的回调,没有“点动”视图以正确地绘制它们自己。我看到过很多这样的情况,DrawView类的onDraw()将被调用,但widgets的onDraw或DrawView类的onDispatchDraw都不会被调用