WebView中的视频应在android中的onShowCustomView()方法上显示全屏 [英] video in webview should display full screen on onShowCustomView() method in android

查看:184
本文介绍了WebView中的视频应在android中的onShowCustomView()方法上显示全屏的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

i want to display video full screen (that is full screen horizontally) landscape.. when onShowCustomView() method is called ,

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

what is happening in my case is that video is display in same orientation in which onShowCustomView() method is called ... that is is screen is in portrait and onShowCustomView() is called video is displayed vertically full screen , i want it should be displayed horizontally fullscreen

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();
    }
}

}

推荐答案

我刚刚遇到了您的问题,并且以另一种方式处理了该问题.

I just faced your problem and I deal with it in another way.

实际上,onShowCustomView返回的视图是VideoView或其父视图.由于您的设备方向是纵向,因此它是垂直的.因此,我们可以在全屏视图的容器上执行某些操作.只需将横向"布局作为容器即可.

Actually, the view returned by onShowCustomView is a VideoView or its father. It stands vertical because your device orientation is portrait. So we can do something on the fullscreen view's container. Just make a "landscape" layout as your container.

这是我的简单代码:

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度并在此处调整位置.

What the code above do is rotate its children by 90 degree and adjust there position.

这篇关于WebView中的视频应在android中的onShowCustomView()方法上显示全屏的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆