【发布时间】:2020-11-13 15:58:48
【问题描述】:
我的应用使用了一个自定义 FrameLayout,其中包含一个 PlayerView 和另一个自定义 FrameLayout(“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"/>
DrawView 组件用于在视频顶部绘制形状和文本,因此我需要调整它的大小以匹配代表视频播放位置的矩形的大小和位置。
我已经正确实现了执行此操作的逻辑,并且我已经实现了 VideoListener 并将此逻辑放在 onSurfaceSizeChanged() 中。
这工作正常 - 正如您从屏幕截图中看到的那样,红线(代表封闭父 ViewPager2Host 的边界)和绿线(代表我在运行时为此计算的视频表面视图的边界/位置特定视频)是正确的:
这是我的问题 - onSurfaceSizeChanged() 被多次调用,我只想为 DrawView 计算一次大小和位置。从我的测试看来,只要 ViewPager2Host 父级不改变维度,那么 onSurfaceSizeChanged() 就会被调用两次,第二次是“最终”维度。
任何人都可以确认是这种情况吗?或者是否存在某些情况 - 也许父尺寸与 onSurfaceSizeChanged() 只会被调用一次的视频表面视图尺寸完全匹配?
或者有什么方法可以知道什么时候表面尺寸是“最终的”?
我正在尝试实现某种“如果视频正在初始化然后”逻辑,以便只有在所有布局完成并且视频表面矩形已完成之后,我才计算 DrawView 的大小和位置。
【问题讨论】:
标签: android-layout exoplayer2.x