Android中关于ScrollView中有视频播放器VideoView时问题的总结
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时问题的总结相关推荐
- android中使用SurfaceView做视频播放器--视频切换无缝连接
Android中的视频用到的有view.SurfaceHolder和view.SurfaceView,还有就是用到了MediaPlayer.OnBufferingUpdateListener和Medi ...
- android中怎么播放本地视频播放器,安卓之播放本地视频讲解
第一种形式:(网络的URL) Intent it = new Intent(); it.setAction(Intent.ACTION_VIEW); it.setData(Uri.parse(&quo ...
- 【Android视频 之 阿里云视频播放器 二】
说明一下:写文章时,我用的最新sdk版本是 4.7.0 哦,这里也只贴出关键代码,更多详细代码在文章末尾有地址链接的. [Android视频 之 阿里云视频播放器 一] 1 视频试看功能的实现 效果图 ...
- Android VR Player(全景视频播放器) [7]:视频列表的实现-网络视频
Android VR Player(全景视频播放器) [7]:视频列表的实现-网络视频 前期准备 在之前的博文,Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频 ...
- Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频
Android VR Player(全景视频播放器) [6]:视频列表的实现-本地视频 (本篇博客参考<Android第一行代码(第二版)>中关于RecyclerView的部分) 列表的实 ...
- 【Android视频 之 阿里云视频播放器 一】
说到视频,现在短视频,小视频真是火的不行,抖音,快手,更是很多人手机上必会安装的一款app.那如何开发一款类似于抖音,集视频播放,直播,点播,拍摄,滤镜于一体的app呢,想想那都是相当的复杂.说到这里 ...
- Android中插件开发篇之----类加载器
前言 关于插件,已经在各大平台上出现过很多,eclipse插件.chrome插件.3dmax插件,所有这些插件大概都为了在一个主程序中实现比较通用的功能,把业务相关或者让可以让用户自定义扩展的功能不附 ...
- android动态设置错误页面,Android中替换WebView加载网页失败时的页面
我们用webView去请求一个网页链接的时候,如果请求网页失败或无网络的情况下,它会返回给我们这样一个页面,如下图所示: 上面这个页面就是系统自带的页面,你觉得是不是很丑?反正小编本人觉得非常丑,很难 ...
- Android中当一行显示两个TextView时,第一个可“…”,而第二个必须显示全部
在Android中当一行显示两个TextView时,第一个可"-",而第二个必须全部显示这种布局时: <RelativeLayout android:layout_width ...
最新文章
- matlab 填充 多边形,algorithm – 如何在MATLAB中从无序边数据创建填充多边形?
- 【C++】explicit关键字
- 基因组重复序列注释-RepeatMasker安装和使用
- python中日期和时间格式化输出的方法小结_Python 时间操作例子和时间格式化参数小结...
- Error: Cannot find module ‘webpack-cli/bin/config-yargs‘
- You must provide a username via either --os-username or env[OS_USERNAME]
- repeater 的解释说明 用法
- CSS深入理解流体特性和BFC特性下多栏自适应布局
- ACE线程管理机制-并发控制
- python 之 linecache 用法记录
- 机器学习的重新思考:人工智能如何学习“失忆”?
- 内存条上面参数详解_价格极低的国产颗粒内存条:光威弈系列Pro评测,超频表现超稳定...
- 高通:2 亿像素手机 2020 年诞生!
- linux malloc和free解析
- 常用计算机设备有哪几种,简述输入、输出设备功能,计算机中常用的输入、输出设备有哪几种?...
- log4j2漏洞各大厂应对措施
- 【机房重构】一步一步往上爬——数据库设计
- Tiktok 网络、网络
- PPT之ppt动画的基本设置
- loadrunner 运行脚本-Run-time Settings之Miscellaneous设置-(转载)