webview中的视频应该在android中的onShowCustomView()方法上全屏显示

时间:2016-12-23 11:37:41

标签: android video webview android-webview

我想全屏显示视频(水平全屏)景观.. 当调用onShowCustomView()方法时,

在我的情况下发生的事情是视频以相同的方向显示,其中onShowCustomView()方法被调用...即屏幕是纵向和onShowCustomView()被称为视频垂直全屏显示,我想要它应该水平全屏显示

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.Window;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;
import android.widget.Toast;

public class Main26Activity extends Activity {
private WebView view6;

@Override
protected void onCreate(Bundle savedInstanceState) {
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main26);



    String url6 = "https://www.youtube.com/watch?v=MPK43O87atA";
    view6=(WebView)findViewById(R.id.webView6);
    view6.getSettings().setJavaScriptEnabled(true);
    view6.setWebViewClient(new WebViewClient());
    view6.setWebViewClient(new Browser());
    view6.setWebChromeClient(new MyWebClient());
    if (savedInstanceState != null)
    {
        view6.restoreState(savedInstanceState);
    }
    else
    {
        view6.loadUrl(url6);
    }

    Context context = getApplicationContext();
    CharSequence text = "please wait while episodes are loaded";
    int duration = Toast.LENGTH_LONG;

    Toast toast = Toast.makeText(context, text, duration);
    toast.show();
}
public void onPause()
{
    view6.onPause();
    super.onPause();
}
class Browser
        extends WebViewClient
{
    Browser() {}

    public boolean shouldOverrideUrlLoading(WebView paramWebView, String paramString)
    {
        paramWebView.loadUrl(paramString);
        return true;
    }
}

public class MyWebClient
        extends WebChromeClient
{
    private View mCustomView;
    private WebChromeClient.CustomViewCallback mCustomViewCallback;
    protected FrameLayout mFullscreenContainer;
    private int mOriginalOrientation;
    private int mOriginalSystemUiVisibility;

    public MyWebClient() {}

    public Bitmap getDefaultVideoPoster()
    {
        if (Main26Activity.this == null) {
            return null;
        }
        return BitmapFactory.decodeResource(Main26Activity.this.getApplicationContext().getResources(), 2130837573);
    }

    public void onHideCustomView()
    {
        ((FrameLayout)Main26Activity.this.getWindow().getDecorView()).removeView(this.mCustomView);
        this.mCustomView = null;
        Main26Activity.this.getWindow().getDecorView().setSystemUiVisibility(this.mOriginalSystemUiVisibility);
        Main26Activity.this.setRequestedOrientation(this.mOriginalOrientation);
        this.mCustomViewCallback.onCustomViewHidden();
        this.mCustomViewCallback = null;
    }

    public void onShowCustomView(View paramView, WebChromeClient.CustomViewCallback paramCustomViewCallback)
    {
        if (this.mCustomView != null)
        {
            onHideCustomView();
            return;
        }
        this.mCustomView = paramView;
        this.mOriginalSystemUiVisibility = Main26Activity.this.getWindow().getDecorView().getSystemUiVisibility();
        this.mOriginalOrientation = Main26Activity.this.getRequestedOrientation();
        this.mCustomViewCallback = paramCustomViewCallback;
        ((FrameLayout)Main26Activity.this.getWindow().getDecorView()).addView(this.mCustomView, new FrameLayout.LayoutParams(-1, -1));
        Main26Activity.this.getWindow().getDecorView().setSystemUiVisibility(3846);
    }
}
@Override
protected void onSaveInstanceState(Bundle outState )
{
    super.onSaveInstanceState(outState);
    view6.saveState(outState);
}

@Override
protected void onRestoreInstanceState(Bundle savedInstanceState)
{
    super.onRestoreInstanceState(savedInstanceState);
    view6.restoreState(savedInstanceState);
}
public void onBackPressed() {
    if (view6.canGoBack()) {
        view6.goBack();
    } else {
        super.onBackPressed();
    }
}

}

1 个答案:

答案 0 :(得分:1)

我刚遇到你的问题,我以另一种方式处理它。

实际上,onShowCustomView返回的视图是VideoView或其父亲。它是垂直的,因为您的设备方向是纵向。所以我们可以在全屏视图的容器上做一些事情。只需将“横向”布局作为容器即可。

这是我的简单代码:

public class LandscapeFrameLayout extends FrameLayout {

    public LandscapeFrameLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(heightMeasureSpec, widthMeasureSpec);
        setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec));
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        //Attention: The arithmetic below is based on padding == 0.
        final int count = getChildCount();
        for (int i = 0; i < count; i++) {
            View child = getChildAt(i);
            if (child != null) {
                child.setRotation(90);
                int width = right - left;
                int height = bottom - top;
                child.setTranslationX((width - height) / 2);
                child.setTranslationY((height - width) / 2);
            }
        }
        super.onLayout(changed, 0, 0, bottom, right);
    }
}

上面的代码是将孩子旋转90度并调整位置。