1、原理
利用 WebChromeClient 中的 onShowCustomView 和 onHideCustomView 方法來實現(xiàn)全屏功能
2搂根、創(chuàng)建一個activity_web_view.xml 文件 里面放一個WebView 和 Fragment
<?xml version="1.0" encoding="UTF-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
tools:context=".ui.activity.WebViewActivity"
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android">
<WebView
android:layout_height="match_parent"
android:layout_width="match_parent"
app:layout_constraintVertical_bias="0.0"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintHorizontal_bias="0.0"
android:orientation="vertical"
android:id="@+id/view"/>
<FrameLayout
android:id="@+id/frameLayout"
android:layout_width="match_parent"
android:layout_height="match_parent">
</FrameLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
3陕贮、創(chuàng)建一個WebViewActivity.java文件提岔,獲取WebView和Fragment波岛,并實現(xiàn)WebView相關(guān)方法
public class WebViewActivity extends AppCompatActivity{
private View mCustomView;
private FrameLayout mFrameLayout;
private WebChromeClient.CustomViewCallback mCustomViewCallback;
private WebView mWebView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_web_view);
mWebView = findViewById(R.id.view);
mFrameLayout = findViewById(R.id.frameLayout);
setWebView();
//這里使用是騰訊視頻的鏈接
mWebView.load("https://v.qq.com/x/cover/mzc00200k1qzwd5/k0046p8c271.html");
}
privte void setWebView(){
WebSettings webSettings = mWebView.getSettings();
//必須設(shè)置否則荐健,無法執(zhí)行js函數(shù)
webSettings.setJavaScriptEnabled(true);
mWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onShowCustomView(View view, CustomViewCallback callback) {
super.onShowCustomView(view, callback);
//點擊視頻中的全屏按鈕暖璧,會執(zhí)行當(dāng)前方法
//然后將frameLayout顯示隱藏WebView控件便可實現(xiàn)全屏案怯,并橫豎屏切換
if (mCustomView != null) {
callback.onCustomViewHidden();
return;
}
mCustomView = view;
mFrameLayout.addView(mCustomView);
mCustomViewCallback = callback;
setVisibility(View.GONE);
//切換橫屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
}
@Override
public void onHideCustomView() {
setVisibility(View.VISIBLE);
//當(dāng)退出全屏?xí)r會執(zhí)行當(dāng)前方法
//然后將frameLayout隱藏顯示W(wǎng)ebView就可以了,記得切換豎屏
if (mCustomView == null) {
return;
}
mCustomView.setVisibility(View.GONE);
mFrameLayout.removeView(mCustomView);
mCustomViewCallback.onCustomViewHidden();
mCustomView = null;
//切換豎屏
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
super.onHideCustomView();
}
}
}
}
4澎办、橫豎屏切換時處理狀態(tài)欄
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {// 橫屏
//狀態(tài)欄沉浸式樣式處理
} else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {// 豎屏
//狀態(tài)欄默認(rèn)樣式處理
}
}