2017-03-16 72 views
1

我正在Android應用中工作,我想在webView加載網頁時預加載初始屏幕但是我有一個本地.mp4視頻而不是圖片。在Android的視頻初始屏幕期間預加載WebView

所以一旦用戶點擊應用程序,.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秒,然後加載網頁,然後再等待THEN

任何幫助將不勝感激!

回答

2

你可以有一個單一的活動,有你有2個活動什麼,由具有ViewSwitcher(或ViewAnimator)的佈局之間進行切換。 這也將消除對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,如下所示:

順便說一句,如果你在清單中改變方向,千萬注意,因爲你有一個web視圖,你將不得不考慮如何改變方向,因爲它不能很好地恢復狀態。


編輯:

這裏的佈局文件:

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

,這要到web視圖(當它已經完成加載,你的情況):

setViewToSwitchTo(viewSwitcher, R.id.webView); 
+0

感謝您的回答! 'onPageFinished'不會被多次調用。我在Manifest中改變方向的原因是因爲我希望它始終處於肖像模式。另外,如果我使用ViewSwitcher或ViewAnimator,這將如何解決飛濺(動畫)期間加載網頁的問題? 是否有可能提供我的代碼如何做到這一點? – Johny

+0

所以我必須使用你提供的兩個代碼之一?我如何在代碼中使用它? – Johny

+0

是的,它會正常工作。活動的佈局將ViewSwitcher作爲父視圖的父視圖:視圖之一和視頻之一。 –

0

我的建議是避免有2個活動,我懷疑這是你的問題之一。

在RelativeLayout中只有一個活動VideoViewWebView,以便VideoView位於WebView的上方。

當的WebView準備好了,只是VideoView.setVisibity(View.GONE)

+0

謝謝您的回答,但如果我不VideoView.setVisibity(View.GONE),它會在中間,在這裏我想它完成不管停止視頻什麼然後加載網頁。 另外,你的意思是有一個活動和一個佈局以及VideoView和WebView? – Johny

+0

@Johny我的意思是當視頻結束並加載WebView時,更改可見性。與您的代碼完全相同,但在單個活動中。 – neteinstein

+0

所以首先我必須只使用一個佈局,將有兩個VideoView和的WebView(而不是2個佈局)以及一個活動,將盡一切還視頻部分和網頁視圖。 我會試試這個,但有可能寫的代碼應該如何? – Johny

1

從@android開發了很多幫助後(非常感謝!)和計算器的帖子,我已經聯合兩種活動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; 
       } 
     } 
    } 
+0

工程就像一個魅力! – Steven

+1

真正的現場救星! – Steven

+1

很高興幫助你:) – Johny