前段时间比较忙,没有来得及写完如何将X5WEBVIEW分享功能和缓存功能屏蔽,下面直接来干货,上代码。

1.首先在布局文件中增加一个全屏的布局,

 <!-- 视频全屏-->
<FrameLayout
android:id="@+id/video_fullView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/black"
android:visibility="gone"> </FrameLayout>

2.其次初始化x5webview的时候务必要配置为标准全屏

if (webView.getX5WebViewExtension() != null) {
Bundle data = new Bundle();
data.putBoolean("standardFullScreen", true);// true表示标准全屏,false表示X5全屏;不设置默认false,
data.putBoolean("supportLiteWnd", false);// false:关闭小窗;true:开启小窗;不设置默认true,
data.putInt("DefaultVideoScreen", 1);// 1:以页面内开始播放,2:以全屏开始播放;不设置默认:1
webView.getX5WebViewExtension().invokeMiscMethod("setVideoParams", data);
}

3.设置进入和退出全屏的事件

            // 拦截全屏调用的方法
@Override
public void onShowCustomView(View view, IX5WebChromeClient.CustomViewCallback callback) {
super.onShowCustomView(view, callback);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
webView.setVisibility(View.INVISIBLE);
// 如果一个视图已经存在,那么立刻终止并新建一个
if (xCustomView != null) {
callback.onCustomViewHidden();
return;
}
try {
            //下面为了兼容部分手机顶部白色区域块
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN|View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
view.setVisibility(View.VISIBLE);
video_fullView.addView(view);
            
xCustomView = view;
xCustomView.setVisibility(View.VISIBLE);
xCustomViewCallback = callback;
video_fullView.setVisibility(View.VISIBLE);
//下面切勿改动,如果x5webview出现改动,下面代码将不能生效,需要重新分析, if(view instanceof ViewGroup && ((ViewGroup) view).getChildCount() > 1){
View root_child1 = (((ViewGroup) view).getChildAt(1));
if(root_child1 instanceof ViewGroup && ((ViewGroup) root_child1).getChildCount() > 2){
View root_child1_child1 = ((((ViewGroup) (((ViewGroup) view).getChildAt(1))).getChildAt(1)));
View root_child1_child2 = ((((ViewGroup) (((ViewGroup) view).getChildAt(1))).getChildAt(2)));
if(root_child1_child1 instanceof ViewGroup && ((ViewGroup) root_child1_child1).getChildCount() > 1){
View root_child1_child1_child1 = (((ViewGroup) ((((ViewGroup) (((ViewGroup) view).getChildAt(1))).getChildAt(1)))).getChildAt(1));
if(root_child1_child1_child1 instanceof ViewGroup && ((ViewGroup) root_child1_child1_child1).getChildCount() > 5){
((ViewGroup) (((ViewGroup) ((((ViewGroup) (((ViewGroup) view).getChildAt(1))).getChildAt(1)))).getChildAt(1))).getChildAt(3).setVisibility(View.GONE);
((ViewGroup) (((ViewGroup) ((((ViewGroup) (((ViewGroup) view).getChildAt(1))).getChildAt(1)))).getChildAt(1))).getChildAt(5).setVisibility(View.GONE);
}
}
if(root_child1_child2 instanceof ViewGroup && ((ViewGroup) root_child1_child2).getChildCount() > 1){
View root_child1_child2_child1 = (((ViewGroup) ((((ViewGroup) (((ViewGroup) view).getChildAt(1))).getChildAt(2)))).getChildAt(1));
if(root_child1_child2_child1 instanceof ViewGroup && ((ViewGroup) root_child1_child2_child1).getChildCount() > 5){
((ViewGroup) (((ViewGroup) ((((ViewGroup) (((ViewGroup) view).getChildAt(1))).getChildAt(2)))).getChildAt(1))).getChildAt(3).setVisibility(View.GONE);
((ViewGroup) (((ViewGroup) ((((ViewGroup) (((ViewGroup) view).getChildAt(1))).getChildAt(2)))).getChildAt(1))).getChildAt(5).setVisibility(View.GONE);
}
}
//处理x5webview播放器上横竖屏按钮事件
View root_child1_child3 = ((((ViewGroup) (((ViewGroup) view).getChildAt(1))).getChildAt(3)));
if(root_child1_child3 instanceof ViewGroup && ((ViewGroup) root_child1_child3).getChildCount() > 0){
View root_child1_child3_child0 = (((ViewGroup) ((((ViewGroup) (((ViewGroup) view).getChildAt(1))).getChildAt(3)))).getChildAt(0));
if(root_child1_child3_child0 instanceof ViewGroup && ((ViewGroup) root_child1_child3_child0).getChildCount() > 4){
((ViewGroup) root_child1_child3_child0).getChildAt(4).setVisibility(View.INVISIBLE);
((ViewGroup) root_child1_child3_child0).getChildAt(4).setEnabled(false);
((ViewGroup) root_child1_child3_child0).getChildAt(4).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else if(getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
} }
});
}
}
                 //处理x5webview播放器上横竖屏按钮事件
if(root_child1_child2 instanceof ViewGroup && ((ViewGroup) root_child1_child2).getChildCount() > 1){
View root_child1_child2_child0 = (((ViewGroup) ((((ViewGroup) (((ViewGroup) view).getChildAt(1))).getChildAt(2)))).getChildAt(0));
if(root_child1_child2_child0 instanceof ViewGroup && ((ViewGroup) root_child1_child2_child0).getChildCount() > 4){
((ViewGroup) (((ViewGroup) ((((ViewGroup) (((ViewGroup) view).getChildAt(1))).getChildAt(2)))).getChildAt(0))).getChildAt(4).setVisibility(View.INVISIBLE);
((ViewGroup) (((ViewGroup) ((((ViewGroup) (((ViewGroup) view).getChildAt(1))).getChildAt(2)))).getChildAt(0))).getChildAt(4).setEnabled(false);
((ViewGroup) (((ViewGroup) ((((ViewGroup) (((ViewGroup) view).getChildAt(1))).getChildAt(2)))).getChildAt(0))).getChildAt(4).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {if(getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
} else if(getRequestedOrientation() == ActivityInfo.SCREEN_ORIENTATION_PORTRAIT){
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
}
});
}
}
}
}
} catch (Exception exception) {
exception.printStackTrace();
} finally {
}
} @Override
public void onHideCustomView() {
super.onHideCustomView();
if (xCustomView == null) {
// 不是全屏播放状态
return;
}try {
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_VISIBLE);
StatusBarCompat.setStatusBarColor(NewsContentViewActivityV3.this, getResources().getColor(R.color.article_statusbar));
xCustomView.setVisibility(View.GONE);
video_fullView.removeView(xCustomView);
xCustomView = null;
video_fullView.setVisibility(View.GONE);
xCustomViewCallback.onCustomViewHidden();
webView.setVisibility(View.VISIBLE);
} catch (Exception exception) {
exception.printStackTrace();
} finally {
}
}

主要的思路:使用自定义全屏,可以监听到进入和退出全屏的事件,并且拿到对应的view,这样就可以进行相关的处理。并且通过对x5webview内核的分析,可以精准对相关的按钮和动作进行设置,屏蔽比如分享和缓存功能,按照需要可以添加横竖屏的相应动作。

总结:如果x5webview本身就处理好了标准全屏,就没我们啥事了。

X5webview完美去掉分享功能和缓存功能(2)的更多相关文章

  1. X5webview去掉分享功能和缓存功能

    x5webview比原生的webview适配更好,加载更快,对音视频的兼容性更好,具备独特的优势 1) 速度快:相比系统webview的网页打开速度有30+%的提升: 2) 省流量:使用云端优化技术使 ...

  2. Nginx 之四: Nginx服务器的压缩功能和缓存功能

    在Nginx服务器配置文件中可以通过配置Gzip的使用,可以配置在http块,server 块或者location块中设置,Nginx服务器可以通过ngx_http_gzip_module模块.ngx ...

  3. nginx的反向代理功能和缓存功能

    html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...

  4. 使用Redis做预定库存缓存功能

    最近在自己的工作中,把其中一个PHP项目的缓存从以前的APC缓存逐渐切换到Redis中,并且根据Redis所支持的数据结构做了库存维护功能.缓存是在业务层做的,准确讲应该是在MVC模型中Model的O ...

  5. iOS开发 - Swift实现清除缓存功能

    前言: 开发移动应用时,请求网络资源是再常见不过的功能.如果每次都去请求,不但浪费时间,用户体验也会变差,所以移动应用都会做离线缓存处理,其中已图片缓存最为常见. 但是时间长了,离线缓存会占用大量的手 ...

  6. Android记录20-获取缓存大小和清除缓存功能

    Android开发记录20-获取缓存大小和清除缓存功能 转载请注明:IT_xiao小巫 博客地址:http://blog.csdn.net/wwj_748 前言 本篇博客要给大家分享的如何获取应用缓存 ...

  7. iOS缓存功能

    之前做缓存,没有考虑过这个具体的实现. 移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所 ...

  8. iOS开发-清理缓存功能的实现

    移动应用在处理网络资源时,一般都会做离线缓存处理,其中以图片缓存最为典型,其中很流行的离线缓存框架为SDWebImage. 但是,离线缓存会占用手机存储空间,所以缓存清理功能基本成为资讯.购物.阅读类 ...

  9. JMessage是让App 同时集成 Push 功能与 IM 功能最完美的方案

    历经几个月的沉寂,以及兄弟们的奋战,极光推送的兄弟产品诞生了:极光IM,英文名 JMessage. 极光IM 是我们团队基于大量客户的需求反馈,在很多客户的殷切期盼下所开发的.团队成员一方面要支撑极光 ...

随机推荐

  1. struts2.5动态方法绑定问题

    <global-allowed-methods>regex:.*</global-allowed-methods> <?xml version="1.0&quo ...

  2. 关于Matlab里面的四个取整(舍入)函数:Floor, Ceil, Fix, Round的解释(转)

    转自http://blog.sina.com.cn/s/blog_48ebd4fb010009c2.html   floor:朝负无穷方向舍入 B = floor(A) rounds the elem ...

  3. 解决Failed to load the JNI shared library xxx/xxx/jvm.dll 错误

    原因:jdk发生变化(新装了32位jdk),eclipse在启动时使用了 系统环境变量中的jdk路径(32位). 解决:只要把旧的64位的jre路径指定给eclipse启动文件即可. 在eclipse ...

  4. Hadoop HBase概念学习系列之HBase里的长表VS宽表VS窄表(十五)

    有时候啊,HBase表的设计方案通常,还会考虑如下一些因素,当然,这只是考虑范围里的部分呢. 更多的行还是更多的版本?后者使用了HBase自带的功能.但是需要在列簇中定义最大版本数,这样做可能有风险. ...

  5. October 03rd 2017 Week 40th Tuesday

    Don't make promises you can't keep. But those are the best kind. 不要许下做不到的承诺,但是我们做不到的承诺往往是最好的. The be ...

  6. PHP SPL神器实现堆排序

    之前学习过内部排序的八大算法,也一一写过代码实现.其中堆排序的原理是 将一颗二叉树初始化为堆 依次将最后一个结点与堆顶结点交换.然后调整堆顶元素位置,重置堆. 将二叉树初始化为堆可以看做从最后一个非叶 ...

  7. Java 持久化发展历程

  8. UVa 1642 - Magical GCD(数论)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. 理解Flux架构

    本文摘自<Flux架构入门教程>和<谈一谈我对 React Flux 架构的理解>.也有自己的观点和总结.转载请注明出处. 一.Flux架构描述 1. Flux是什么 Flux ...

  10. break,continue,return和exit的区别

    1.break break语句的使用场合主要是switch语句和循环结构. 在循环结构中使用break语句,就退出循环,接着执行循环结构下面的第一条语句. 如果在多重嵌套循环中使用break语句,当执 ...