Draggable Panel顶部视频片段Resize问题及横竖屏切换应用冻结故障
解决Draggable Panel视频大小异常与横竖屏切换冻结问题
我来帮你拆解这两个问题,结合你给出的代码片段,咱们一步步排查解决:
问题1:Draggable Panel顶部视频片段调整大小异常
你代码里注释掉了draggablePanel.setTopFragmentResize(true);,这很可能是问题的核心。这个方法是用来允许DraggablePanel的顶部Fragment自动调整大小的,如果关闭这个设置,直接硬设setTopViewHeight(getScreenHeight())就会和DraggablePanel自身的布局逻辑冲突,导致视频片段大小异常。
修复建议:
- 取消注释
draggablePanel.setTopFragmentResize(true);,让DraggablePanel接管顶部Fragment的大小调整逻辑 - 避免直接给播放器的root View硬设屏幕高度,改用
MATCH_PARENT,让它跟随DraggablePanel的顶部容器自适应:
videoPlayerFragment.getPlayerImpl().root.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT;
问题2:横竖屏切换时应用冻结、播放器控件失效
直接在配置变更时硬设高度+修改DraggablePanel参数,很可能因为主线程布局重绘阻塞、播放器状态未正确处理导致ANR或者控件失效。这里有几个关键修复点:
1. 正确处理配置变更
在AndroidManifest.xml中给对应的Activity添加配置变更声明,避免系统重建Activity(这会导致状态丢失和卡顿):
<activity android:name=".YourVideoActivity" android:configChanges="orientation|screenSize|smallestScreenSize" />
2. 在onConfigurationChanged中安全更新布局
不要直接在配置变更的代码块里做密集操作,而是通过DraggablePanel的API配合播放器状态管理来处理:
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (videoPlayerFragment.getPlayerImpl() == null || draggablePanel == null) { return; } if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { // 开启顶部Fragment自适应 draggablePanel.setTopFragmentResize(true); // 设置顶部视图为全屏高度 draggablePanel.setTopViewHeight(ViewGroup.LayoutParams.MATCH_PARENT); // 处理播放器状态,避免卡顿 videoPlayerFragment.getPlayerImpl().pause(); videoPlayerFragment.getPlayerImpl().root.getLayoutParams().height = ViewGroup.LayoutParams.MATCH_PARENT; videoPlayerFragment.getPlayerImpl().root.requestLayout(); videoPlayerFragment.getPlayerImpl().play(); } else { // 竖屏时恢复原有高度(可根据你的需求调整) int portraitHeight = getResources().getDimensionPixelSize(R.dimen.video_portrait_height); draggablePanel.setTopViewHeight(portraitHeight); draggablePanel.setTopFragmentResize(false); videoPlayerFragment.getPlayerImpl().root.getLayoutParams().height = portraitHeight; videoPlayerFragment.getPlayerImpl().root.requestLayout(); } }
3. 额外注意事项
- 横竖屏切换时一定要暂停/恢复播放器,避免视频渲染线程和UI线程冲突导致冻结
- 不要直接硬设
getScreenHeight(),因为不同设备的屏幕高度计算可能包含导航栏、状态栏,用MATCH_PARENT更可靠 - 调用
requestLayout()触发布局重绘,确保修改的LayoutParams生效
内容的提问来源于stack exchange,提问作者pallavi richhariya
相关产品推荐
相关产品推荐

