首先再AndroidManifest.xml中配置权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- 硬件加速对X5视频播放非常重要,建议开启 -->
<uses-permission android:name="android.permission.GET_TASKS" />
再application中设置属性再启动程序的时候或再Activity中设置硬件加速
android:hardwareAccelerated="true"
<activity android:name=".activity.LearningSkillsWebActivity"
android:configChanges="orientation|screenSize|keyboardHidden"
android:windowSoftInputMode="stateHidden|adjustResize"
android:hardwareAccelerated="true"
android:screenOrientation="portrait"
/>
xml布局
FrameLayout是用来全屏的时候调用
<com.example.zyshop.myapplication.View.SimpleWebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_below="@+id/progressBar1"
android:layout_height="match_parent">
</com.example.zyshop.myapplication.View.SimpleWebView>
<FrameLayout
android:id="@+id/fl_web_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#000"
android:visibility="gone">
</FrameLayout>
自定义SimpleWebView
public class SimpleWebView extends WebView {
private WebViewClient client = new WebViewClient() {
/**
* 防止加载网页时调起系统浏览器
*/
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
};
@SuppressLint("SetJavaScriptEnabled")
public SimpleWebView(Context arg0, AttributeSet arg1) {
super(arg0, arg1);
this.setWebViewClient(client);
// this.setWebChromeClient(chromeClient);
// WebStorage webStorage = WebStorage.getInstance();
initWebViewSettings();
this.getView().setClickable(true);
}
private void initWebViewSettings() {
WebSettings webSetting = this.getSettings();
webSetting.setDefaultTextEncodingName("utf-8") ;//这句话去掉也没事。。只是设置了编码格式
webSetting.setJavaScriptEnabled(true);
webSetting.setJavaScriptCanOpenWindowsAutomatically(true);
webSetting.setAllowFileAccess(true);
webSetting.setLayoutAlgorithm(WebSettings.LayoutAlgorithm.NARROW_COLUMNS);
webSetting.setSupportZoom(true);
webSetting.setBuiltInZoomControls(true);
webSetting.setUseWideViewPort(true);
webSetting.setSupportMultipleWindows(true);
// webSetting.setLoadWithOverviewMode(true);
webSetting.setAppCacheEnabled(true);
// webSetting.setDatabaseEnabled(true);
webSetting.setDomStorageEnabled(true);
webSetting.setGeolocationEnabled(true);
webSetting.setAppCacheMaxSize(Long.MAX_VALUE);
// webSetting.setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);
webSetting.setPluginState(WebSettings.PluginState.ON_DEMAND);
// webSetting.setRenderPriority(WebSettings.RenderPriority.HIGH);
webSetting.setCacheMode(WebSettings.LOAD_NO_CACHE);
// this.getSettingsExtension().setPageCacheCapacity(IX5WebSettings.DEFAULT_CACHE_CAPACITY);//extension
// settings 的设计
}
public SimpleWebView(Context arg0) {
super(arg0);
setBackgroundColor(85621);
}
}
AppCompatActivity中代码
public class LearningSkillsWebActivity extends AppCompatActivity{
private SimpleWebView browser;
private AVLoadingIndicatorView av_loading;
private Toolbar toolbar;
private LinearLayout state_layout_error;
private Button state_layout_error_bt;
private ProgressBar progressBar1;
private FrameLayout fl_web_view;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.learning_skills_web);
toolbar=findViewById(R.id.toolbar);
setSupportActionBar(toolbar);
toolbar.setNavigationOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(browser.canGoBack()){
browser.goBack();
}else {
finish();
}
}
});
browser=findViewById(R.id.webView);
fl_web_view=findViewById(R.id.fl_web_view);
getWindow().setFormat(PixelFormat.TRANSLUCENT);//(这个对宿主没什么影响,建议声明)
getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
browser.setDrawingCacheEnabled(true);
initHardwareAccelerate();
av_loading=findViewById(R.id.av_loading);
state_layout_error=findViewById(R.id.state_layout_error);
state_layout_error.setVisibility(View.GONE);
state_layout_error_bt=findViewById(R.id.state_layout_error_bt);
progressBar1=findViewById(R.id.progressBar1);
// browser.loadUrl("https://v.youku.com/v_show/id_XMzg4NTAzMDI4NA==.html?f=49479408");
browser.loadUrl(BasicsUtil.URL+"index.php?m=zyvideo&c=index&a=init&userid=20");
/**
* 这里需要根据不同的分辨率设置不同的比例,比如
* 5寸手机设置190 屏幕宽度 > 650 180
* 4.5寸手机设置170 屏幕宽度> 500 小于 650 160
* 4寸手机设置150 屏幕宽度> 450 小于 550 150
* 3 屏幕宽度> 300 小于 450 120
* 小于 300 100
* 320×480 480×800 540×960 720×1280
*/
WindowManager wm = (WindowManager) LearningSkillsWebActivity.this.getSystemService(Context.WINDOW_SERVICE);
int width = wm.getDefaultDisplay().getWidth();
if (width>650){
browser.setInitialScale(190);
}else if (width>520){
browser.setInitialScale(160);
}else if (width>450){
browser.setInitialScale(140);
}else if (width>300){
browser.setInitialScale(120);
}else{
browser.setInitialScale(100);
}
browser.setWebViewClient(new com.tencent.smtt.sdk.WebViewClient(){
@Override
public boolean shouldOverrideUrlLoading(com.tencent.smtt.sdk.WebView webView, String url) {
//使得打开网页时不调用系统浏览器, 而是在本WebView中显示
if(url.startsWith("intent")||url.startsWith("youku")){
return true;
}else{
return super.shouldOverrideUrlLoading(webView, url);
}
}
});
browser.setWebChromeClient(new com.tencent.smtt.sdk.WebChromeClient(){
Bitmap mVideoPoster=null;
View mVideoLoadingView=null;
View mFullScreenView;
/**
* 设置默认的视频海报,也就是当html Video元素初始化完成后,默认显示在video窗口上的图片
* @return
*/
@Override
public Bitmap getDefaultVideoPoster() {
if(mVideoPoster==null){
mVideoPoster= BitmapFactory.decodeResource(getResources(),R.drawable.kgd);
}
return mVideoPoster;
}
// /**
// * 设置Html video元素的视频加载进度View
// * @return
// */
@Override
public View getVideoLoadingProgressView() {
if(mVideoLoadingView==null){
mVideoLoadingView=getLayoutInflater().inflate(R.layout.view_webview_loading,null);
}
return mVideoLoadingView;
}
private void showCustomView(View view,IX5WebChromeClient.CustomViewCallback callback){
mFullScreenView=view;
fl_web_view.setVisibility(View.VISIBLE);
AnimationHelper.alphaAnimation(fl_web_view, 0, 1, 500, new Runnable() {
@Override
public void run() {
fl_web_view.addView(mFullScreenView);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);//横屏
}
});
}
/**
* 要想让html video元素支持全屏播放,必须重载这个函数,当用户点击video元素上的全屏按钮时,WebView会调用这个函数来全屏显示视频
* @param view
* @param callback
*/
@Override
public void onShowCustomView(View view, IX5WebChromeClient.CustomViewCallback callback) {
super.onShowCustomView(view, callback);
showCustomView(view,callback);
}
/**
* 当WebView需要关闭全屏窗口的时候,回调这个函数,必须要重载这个函数,否则视频全屏播放窗口无法关闭
*/
@Override
public void onHideCustomView() {
super.onHideCustomView();
if(mFullScreenView==null) return;
fl_web_view.removeView(mFullScreenView);
AnimationHelper.alphaAnimation(fl_web_view, 1, 0, 500, new Runnable() {
@Override
public void run() {
fl_web_view.setVisibility(View.GONE);
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);//竖屏
}
});
}
@Override
public void onProgressChanged(com.tencent.smtt.sdk.WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if (newProgress==100){
progressBar1.setVisibility(View.GONE);
}else{
progressBar1.setVisibility(View.VISIBLE);
progressBar1.setProgress(newProgress);
}
}
});
// browser.setWebChromeClient(new com.tencent.smtt.sdk.WebChromeClient(){
// @Override
// public void onProgressChanged(com.tencent.smtt.sdk.WebView webView, int i) {
// super.onProgressChanged(webView, i);
// if (i==100){
// progressBar1.setVisibility(View.GONE);
// }else{
// progressBar1.setVisibility(View.VISIBLE);
// progressBar1.setProgress(i);
// }
// }
// });
browser.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK&&event.getRepeatCount()==0){
if (browser!=null&&browser.canGoBack()){
browser.goBack();
return true;
}
}
return false;
}
});
}
/**
* 启用硬件加速
*/
private void initHardwareAccelerate() {
try {
if (Integer.parseInt(android.os.Build.VERSION.SDK) >= 11) {
getWindow()
.setFlags(
android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
android.view.WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
}
} catch (Exception e) {
}
}
/**
* 返回键返回上一网页
*/
@Override
public void onBackPressed() {
super.onBackPressed();
if(browser.canGoBack()){
browser.goBack();
}else {
finish();
}
}
/**
* 返回键监听
* @param keyCode
* @param event
* @return
*/
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
if (browser != null && browser.canGoBack()) {
browser.goBack();
return true;
} else {
return super.onKeyDown(keyCode, event);
}
}
return super.onKeyDown(keyCode, event);
}
@Override
protected void onDestroy() {
//释放资源
if (browser != null)
browser.destroy();
super.onDestroy();
}
}
SimpleAnimatorListener
public class SimpleAnimatorListener implements AnimatorListener {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
}
AnimationHelper
public class AnimationHelper {
public static void alphaAnimation(View view, float start, float end, long duration, final Runnable endAnimationRunnable)
{
Animator animator= ObjectAnimator.ofFloat(view, "alpha", start,end);
animator.setDuration(duration);
animator.setInterpolator(new AccelerateInterpolator());
animator.addListener(new SimpleAnimatorListener()
{
@Override
public void onAnimationEnd(Animator animation) {
super.onAnimationEnd(animation);
if(endAnimationRunnable!=null)
endAnimationRunnable.run();
}
});
animator.start();
}
}
我这也是再网上参考别人的博客写的,链接找不到了