Android中关于ScrollView中有视频播放器VideoView时问题的总结
来源:互联网 发布:广东省网络问政 编辑:程序博客网 时间:2024/06/15 22:11
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); //end changeScreenBtn.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() { @Override public void beforeChange(boolean isFullScreen) { if(isFullScreen){ //记录之前的位置 vpScrollX = imScrollX; vpScrollY = imScrollY; } } @Override public void afterChange(boolean isFullScreen) { //恢复之前的位置 if(!isFullScreen){ Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public 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() { @Override public 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时问题的总结
- 关于ScrollView中加入VideoView的问题
- Android中自定义VideoView视频播放器
- 关于视频播放VideoView的一些总结
- VideoView中实现循环播放视频的问题
- 在Android中使用VideoView播放视频
- 在Android中使用VideoView播放视频
- 在Android中使用VideoView播放视频
- android中VideoView无法播放此视频
- android中使用VideoView播放视频
- Android VideoView播放视频遇到的问题
- 关于VideoView播放视频问题
- Android中VideoView播放视频不能充满屏幕以及视频上的view与视频不同步显示的问题
- Android视频播放项目总结之 使用VideoView定义自己的视频播放器
- Android 视频播放器VideoView
- Android中VideoView及SurfaceView视频播放实现
- android VideoView播放工程raw下的视频+全屏问题
- android VideoView播放完视频一直黑屏的问题
- 递归1,2,5=100
- 卡尔曼滤波和matlab实现
- JAVAse——核心
- Java实现动态代理
- C4top-玩转二叉树(根据前序中序镜像反转后层次遍历)
- Android中关于ScrollView中有视频播放器VideoView时问题的总结
- 15. 3Sum
- 数字时钟
- vsftpd安装,匿名上传、下载、删除
- 解决Web部署 svg/woff/woff2字体 404错误
- 3月18日,CardLayoutDemo,每日20行。
- 正确的4种挂马方式(属于比较简单的)
- 链接点击前后的颜色设置以及消除链接下划线
- Centos7安装Apache Http服务器无法访问如何解决