1.横竖屏切换问题
问题描述:
网上很多封装的视频播放器,也有横竖屏切换,但是发现在Scrollview中时横屏的高度会无效,因为Scrollview是可滚动控件
解决方案:
1)在切换前记录原始播放器的高度传给播放器如(videoPlayer),并告诉影响播放器全屏显示的其它控件列表(List)和播放器所在的父控件
2)竖屏切横屏,设置播放器的LayoutParams的宽高为屏幕的高宽,Gone掉其它控件,播放器的父控件的margin和padding设置为0
3)横屏切竖屏,恢复保存的原始宽高,显示其它控件,恢复父控件的margin和padding
实例代码如下:

/*** 竖屏转横屏*/
public void portrait2landscape(boolean isAuto) {changeScreen(isFullScreen);ViewGroup.LayoutParams params = this.getLayoutParams();params.width = DisplayUtil.getScreenHeight(mContext);params.height = DisplayUtil.getScreenWidth(mContext);this.setLayoutParams(params);if (!isAuto) {//强制横屏mContext.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);mContext.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);}changeScreenBtn.setImageResource(R.drawable.ic_player_suoxiao);rlTitile.setVisibility(VISIBLE);
}/*** 横屏转竖屏*/
public void landscape2portrait(boolean isAuto) {changeScreen(isFullScreen);ViewGroup.LayoutParams params = this.getLayoutParams();if (initHeight != 0) {params.height = initHeight;} else {params.height = 405;}params.width = ViewGroup.LayoutParams.MATCH_PARENT;this.setLayoutParams(params);if (!isAuto) {mContext.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);}//start-恢复状态栏显示WindowManager.LayoutParams attr = mContext.getWindow().getAttributes();attr.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN);mContext.getWindow().setAttributes(attr);mContext.getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS);//endchangeScreenBtn.setImageResource(R.drawable.ic_player_quanping);rlTitile.setVisibility(GONE);
}

2.横屏切竖屏后如何恢复Scrollview到原来滚动的位置
问题描述:横屏切竖屏后,Scrollview原来的位置恢复到顶部了,导致本来可见的视频播放器不可见了
解决方案:
1)要实时监控ScrollView的滚动情况,这个网上有很多一般是自定义一个ObserableScrollView
2)在点击横竖屏切换前(准备切换,但是还没有切换的时候)记录滚动的位置,为什么要强调时机呢?因为当完成横竖屏切换时也会调用onScrollChanged方法
而此时的滚动的x,y坐标会为0.所以我们要在切换前记录下原始位置。
3)在横屏切回竖屏后调用ScrollView的scrollTo(x,y)回到原始位置
4)注意:scrollTo要通过异步的方式调用,否则充值的ScrollView还没有完全成型你调用这个压根不起作用。
实例代码:

public interface OnScreenChangeListener {void beforeChange(boolean isFullScreen);void afterChange(boolean isFullScreen);
}
isFullScreen = !isFullScreen;
if (mOnScreenChangeListener != null) {mOnScreenChangeListener.beforeChange(isFullScreen);
}
if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_PORTRAIT) {portrait2landscape(false);
} else if (this.getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) {landscape2portrait(false);
}
if (mOnScreenChangeListener != null) {mOnScreenChangeListener.afterChange(isFullScreen);
}videoPlayer.setmOnScreenChangeListener(new VideoPlayer.OnScreenChangeListener() {@Overridepublic void beforeChange(boolean isFullScreen) {if(isFullScreen){//记录之前的位置vpScrollX = imScrollX;vpScrollY = imScrollY;}}@Overridepublic void afterChange(boolean isFullScreen) {//恢复之前的位置if(!isFullScreen){Handler handler = new Handler();handler.postDelayed(new Runnable() {@Overridepublic void run() {svContent.scrollTo(vpScrollX,vpScrollY);}},1);}}
});

3.如何实现当ScrollView滚动时,播放器可见和不可见时能自动暂定和恢复播放
问题描述:当ScrollView滚动时,如果不处理播放器将一直播,会造成一种恐怖的现象,我压根没看视频,单背后总有声音。
解决方案:
1)要确定是在滚动过程中实现,就要时刻监控ScrollView的滚动情况,这个上面已有提及
2)如果把控播放器的可见于不可见的时机,经过网络搜索与无脑尝试,最后可以通过一个工具静态方法实现,其思路利用View的getLocalVisbleRect
来实现,其参数就是屏幕的矩形 new Rect(0,0,screenWidth,screenHeight)
实例代码:

public static Boolean checkIsVisible(Context context, View view) {// 如果已经加载了,判断广告view是否显示出来,然后曝光int screenWidth = getScreenWidth(context);int screenHeight = getScreenHeight(context);Rect rect = new Rect(0, 0, screenWidth, screenHeight);int[] location = new int[2];view.getLocationInWindow(location);if (view.getLocalVisibleRect(rect)) {return true;} else {//view已不在屏幕可见区域;return false;}
}
svContent.setScrollViewListener(new ScrollViewListener() {@Overridepublic void onScrollChanged(ObservableScrollView scrollView, int x, int y, int oldx, int oldy) {if(svContent == scrollView){imScrollX = x;imScrollY = y;}if(null != videoPlayer){if(DisplayUtil.checkIsVisible(mContext,videoPlayer)){videoPlayer.reStartPlay();}else{videoPlayer.onPausePlayer();}}}
});

4.ScrollView中有ListView时起始位置为ListView底部的问题解决方案(无代码不编程)。注意调用时机是在listview数据填充后哦

mlvInfo.setFocusable(false);
if(null != svContent){svContent.smoothScrollTo(0,0);
}

以上是本猴实战中遇到的坑,特此记录以便应付日益渐摔的记忆,如有疑问可留言,原与君共学习同进步

Android中关于ScrollView中有视频播放器VideoView时问题的总结相关推荐

  1. android中使用SurfaceView做视频播放器--视频切换无缝连接

    Android中的视频用到的有view.SurfaceHolder和view.SurfaceView,还有就是用到了MediaPlayer.OnBufferingUpdateListener和Medi ...

  2. android中怎么播放本地视频播放器,安卓之播放本地视频讲解

    第一种形式:(网络的URL) Intent it = new Intent(); it.setAction(Intent.ACTION_VIEW); it.setData(Uri.parse(&quo ...

  3. 【Android视频 之 阿里云视频播放器 二】

    说明一下:写文章时,我用的最新sdk版本是 4.7.0 哦,这里也只贴出关键代码,更多详细代码在文章末尾有地址链接的. [Android视频 之 阿里云视频播放器 一] 1 视频试看功能的实现 效果图 ...

  4. Android VR Player(全景视频播放器) [7]:视频列表的实现-网络视频

    Android VR Player(全景视频播放器) [7]:视频列表的实现-网络视频 前期准备 在之前的博文,Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频 ...

  5. Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频

    Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频 (本篇博客参考<Android第一行代码(第二版)>中关于RecyclerView的部分) 列表的实 ...

  6. 【Android视频 之 阿里云视频播放器 一】

    说到视频,现在短视频,小视频真是火的不行,抖音,快手,更是很多人手机上必会安装的一款app.那如何开发一款类似于抖音,集视频播放,直播,点播,拍摄,滤镜于一体的app呢,想想那都是相当的复杂.说到这里 ...

  7. Android中插件开发篇之----类加载器

    前言 关于插件,已经在各大平台上出现过很多,eclipse插件.chrome插件.3dmax插件,所有这些插件大概都为了在一个主程序中实现比较通用的功能,把业务相关或者让可以让用户自定义扩展的功能不附 ...

  8. android动态设置错误页面,Android中替换WebView加载网页失败时的页面

    我们用webView去请求一个网页链接的时候,如果请求网页失败或无网络的情况下,它会返回给我们这样一个页面,如下图所示: 上面这个页面就是系统自带的页面,你觉得是不是很丑?反正小编本人觉得非常丑,很难 ...

  9. Android中当一行显示两个TextView时,第一个可“…”,而第二个必须显示全部

    在Android中当一行显示两个TextView时,第一个可"-",而第二个必须全部显示这种布局时: <RelativeLayout android:layout_width ...

最新文章

  1. matlab 填充 多边形,algorithm – 如何在MATLAB中从无序边数据创建填充多边形?
  2. 【C++】explicit关键字
  3. 基因组重复序列注释-RepeatMasker安装和使用
  4. python中日期和时间格式化输出的方法小结_Python 时间操作例子和时间格式化参数小结...
  5. Error: Cannot find module ‘webpack-cli/bin/config-yargs‘
  6. You must provide a username via either --os-username or env[OS_USERNAME]
  7. repeater 的解释说明 用法
  8. CSS深入理解流体特性和BFC特性下多栏自适应布局
  9. ACE线程管理机制-并发控制
  10. python 之 linecache 用法记录
  11. 机器学习的重新思考:人工智能如何学习“失忆”?
  12. 内存条上面参数详解_价格极低的国产颗粒内存条:光威弈系列Pro评测,超频表现超稳定...
  13. 高通:2 亿像素手机 2020 年诞生!
  14. linux malloc和free解析
  15. 常用计算机设备有哪几种,简述输入、输出设备功能,计算机中常用的输入、输出设备有哪几种?...
  16. log4j2漏洞各大厂应对措施
  17. 【机房重构】一步一步往上爬——数据库设计
  18. Tiktok 网络、网络
  19. PPT之ppt动画的基本设置
  20. loadrunner 运行脚本-Run-time Settings之Miscellaneous设置-(转载)

热门文章

  1. 【Matlab多目标优化求解】粒子群算法求解智能微电网多目标优化问题【含源码 383期】
  2. 高斯-勒让德积分——MATLABPython混合实现
  3. Nand flash相关概念介绍
  4. Yolo系列学习笔记
  5. 解析:百度算法之飓风算法3.0
  6. Art of Illusion 一款免费的开源 3D 建模和渲染软件
  7. 【weblogic】超省事weblogic域迁移
  8. 网格顶点方向的计算(一种新的面积加权方法)
  9. WEB前端(7)—— 简单的 HTML+CSS 导航栏案例
  10. 汽车中的前置箱SGA是怎么进行内存管理的?