在Android的视频启动画面中预加载WebView

时间:2017-03-16 11:25:35

标签: android webview splash-screen android-videoview

我正在使用Android应用,我想在webView加载网页时预加载启动画面但是我有一个本地.mp4视频而不是图片。

因此,一旦用户点击该应用,.mp4将开始播放(4秒)。在4秒内,当视频完成后,webView应预加载网页 SO 显示我的网页(如果网页已加载),否则请等待启动屏幕直到网页准备就绪,然后加载它。

这是我的MainActivity:

public class MainActivity extends AppCompatActivity {

    private WebView webView;
    public static final Object SPLASH_LOCK = new Object();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        String myURL = "https://www.testpage.com";

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        webView = (WebView) findViewById(R.id.webView);
        webView.getSettings().setAllowContentAccess(true);

        /** tell the webView to enable javascript execution */
        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);

        webView.getSettings().setDomStorageEnabled(true);
        webView.getSettings().setDatabaseEnabled(true);

        webSettings.getAllowFileAccessFromFileURLs();
        webSettings.getAllowUniversalAccessFromFileURLs();

        /** Load the HTML page */
        webView.loadUrl(myURL);

        /** Call the JavaScriptInterface within the WebView */
        webView.addJavascriptInterface(this, "jsinterface");

        startActivity(new Intent(this, AnimationScreenActivity.class));

        /** Enable Javascript in WebView
        / callback for browser events */
        webView.setWebViewClient(new WebViewClient(){

            @Override
            public void onPageFinished (WebView webView, String url) {
                synchronized (SPLASH_LOCK) {
                    SPLASH_LOCK.notifyAll();
                }
            }
        });  
    }
}

这是AnimationScreenActivity:

public class AnimationScreenActivity extends AppCompatActivity{

    private static String TAG = AnimationScreenActivity.class.getName();
    private static long MAX_SPLASH_TIME = 10000; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.animation_screen);

                try {
                    VideoView videoHolder = (VideoView) findViewById(R.id.videoView1);
                    Uri video = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.myvideo);
                    videoHolder.setVideoURI(video);

                    videoHolder.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                        public void onCompletion(MediaPlayer mp) {

                            jump();
                        }
                    });
                    videoHolder.start();
                } catch (Exception ex) { jump(); }

    }

    private void jump() {
        new Thread() {
            @Override
            public void run() {
                synchronized (MainActivity.SPLASH_LOCK) {
                    // wait for notify or time-out
                    try {
                        MainActivity.SPLASH_LOCK.wait(MAX_SPLASH_TIME);
                    } catch (InterruptedException ignored) {}
                }
                finish();
            }
        }.start();

    }
}

这是activity_main.xml:

    <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="test.test_android.MainActivity">

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>

这是animation_screen_activity.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/animation_screen"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="test.test.AnimationScreenActivity">

    <VideoView
        android:id="@+id/videoView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen"
        android:layout_alignParentRight="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true" />

</RelativeLayout>

最后是Manifest.xml,我将MainActivity设置为LAUNCHER:

<activity android:name=".MainActivity"
                  android:theme="@style/FullScreenTheme"
                  android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        </activity>

        <activity android:name=".AnimationScreenActivity"
                  android:theme="@style/FullScreenTheme"
                  android:screenOrientation="portrait"/>

所以我到现在为止,一旦用户启动应用程序,.mp4就会启动,当.mp4完成那么时,它会在AnimationScreenActivity中等待10秒,那么< / strong>它加载网页。

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:3)

通过使用ViewSwitcher(或ViewAnimator)在布局之间切换,您可以拥有一个包含2个活动的活动。 这也将不再需要SPLASH_LOCK对象。

加载时,将ViewSwitcher(或ViewAnimator)切换到视频布局,加载页面后,将其切换到WebView的布局。

我制作了一个简单的代码,可以更轻松地在视图之间切换。如果您愿意,可以使用它:

public static void setViewToSwitchTo(@NonNull final ViewAnimator viewAnimator, @NonNull final View viewToSwitchTo) {
    if (viewAnimator == null)
        return;
    if (viewAnimator.getCurrentView() == viewToSwitchTo)
        return;
    for (int i = 0; i < viewAnimator.getChildCount(); ++i)
        if (viewAnimator.getChildAt(i) == viewToSwitchTo) {
            viewAnimator.setDisplayedChild(i);
            break;
        }
}

public static void setViewToSwitchTo(@NonNull final ViewAnimator viewAnimator, @IdRes final int viewIdToSwitchTo) {
    if (viewAnimator == null)
        return;
    if (viewAnimator.getCurrentView().getId() == viewIdToSwitchTo)
        return;
    for (int i = 0; i < viewAnimator.getChildCount(); ++i)
        if (viewAnimator.getChildAt(i).getId() == viewIdToSwitchTo) {
            if (viewAnimator.getDisplayedChild() == i)
                return;
            viewAnimator.setDisplayedChild(i);
            return;
        }
}

用法:

setViewToSwitchTo(viewSwitcher, R.id.webViewLayout);

或:

setViewToSwitchTo(viewSwitcher, webViewLayout);

使用“inAnimation”和“outAnimation”属性在视图之间切换时甚至可以制作动画。

而且,如果代码太大,您可以使用片段而不是视图。一个用于WebView,另一个用于视频。

关于多次调用onPageFinished,您需要检查它们中哪一个是您认为实际完成的那个。由于每个网站都不同,并且可以有多个框架,因此您必须添加此逻辑。如果需要,可以监视onPageStarted,如下所示:

顺便说一句,如果你改变清单中的方向,请注意,因为你有一个WebView,你将不得不考虑如何处理方向改变,因为它不能很好地恢复它的状态。

编辑:

这是布局文件:

<ViewSwitcher xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/viewSwitcher"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="test.test_android.MainActivity">

    <VideoView
        android:id="@+id/videoView1"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:theme="@android:style/Theme.NoTitleBar.Fullscreen" />

</ViewSwitcher>
在onCreate中

,使用您的两个活动的代码,并添加它以转到视频:

setViewToSwitchTo(viewSwitcher, R.id.videoView1);

这将转到webView(在你的情况下完成加载时):

setViewToSwitchTo(viewSwitcher, R.id.webView);

答案 1 :(得分:1)

经过@android开发人员的大量帮助(非常感谢!)和stackoverflow帖子,我将两项活动MainActivityAnimationScreenActivity合并到一个活动中(MainActivity)。

以下是代码:

    public class MainActivity extends AppCompatActivity {
        private String myURL = "https://www.testpage.com";
        VideoView videoView;
        ViewSwitcher viewSwitcher;
        private WebView webView;
        private boolean hasFinishedLoadingPage;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            try {
                viewSwitcher = (ViewSwitcher) findViewById(R.id.viewSwitcher);
                final VideoView videoView = (VideoView) findViewById(R.id.videoView1);
                Uri video = Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.myvideo);
                videoView.setVideoURI(video);

                videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
                    @Override
                    public void onCompletion(MediaPlayer mp) {
                        if (hasFinishedLoadingPage)
                            setViewToSwitchTo(viewSwitcher, webView);

                       // else webView.reload();

                    setViewToSwitchTo(viewSwitcher, webView);

                    }
                });

                videoView.start();
            } catch (Exception ex) {
            }

            webView = (WebView) findViewById(R.id.webView);
            webView.getSettings().setAllowContentAccess(true);
            WebSettings webSettings = webView.getSettings();
            webSettings.setJavaScriptEnabled(true);
            webView.getSettings().setDomStorageEnabled(true);
            webView.getSettings().setDatabaseEnabled(true);
            webSettings.getAllowFileAccessFromFileURLs();
            webSettings.getAllowUniversalAccessFromFileURLs();

            webView.setWebViewClient(new WebViewClient() {

                boolean isRedirected;

                @Override
                public boolean shouldOverrideUrlLoading(WebView view, String url) {
                    return false;
                }

                @Override
                public void onPageStarted(WebView view, String url, Bitmap favicon) {
                    super.onPageStarted(view, url, favicon);
                    if (!isRedirected) {
                        setViewToSwitchTo(viewSwitcher, videoView);
                    }
                    isRedirected = true;
                }

                @Override
                public void onPageFinished(WebView webView, String url) {
                    super.onPageFinished(webView, url);
                    hasFinishedLoadingPage = true;
                }
            });

            /** Callback for web events */
            webView.setWebChromeClient(new WebChromeClient() {
            });
            webView.loadUrl(myURL);
        }

        public static void setViewToSwitchTo(@NonNull final ViewAnimator viewAnimator, @NonNull final View viewToSwitchTo) {
            if (viewAnimator == null)
                return;
            if (viewAnimator.getCurrentView() == viewToSwitchTo)
                return;
            for (int i = 0; i < viewAnimator.getChildCount(); ++i)
                if (viewAnimator.getChildAt(i) == viewToSwitchTo) {
                    viewAnimator.setDisplayedChild(i);
                    break;
                }
        }
    }

答案 2 :(得分:0)

我的建议是避免进行2项活动,我怀疑这是你的一个问题。

在RelativeLayout中只有一个VideoViewWebView的活动,以便VideoView位于WebView之上。

当WebView准备就绪时,只需VideoView.setVisibity(View.GONE)