2011-10-27 34 views
1

我有一個奇怪的情況。我正在使用NexPlayer在OpenGL模式下渲染流式視頻。在流式視頻的渲染區域(framelayout)之上,每當視頻播放器緩衝時,我都會以不確定模式顯示ProgressBar - 與YouTube應用的功能相當。FrameLayout之上的ProgressBar

這可以正常工作,玩家停止緩衝,我嘗試從屏幕上移除進度條。進度條停止動畫,但仍保留在屏幕上,就好像它是視頻上的水印一樣。 我嘗試刪除它的方式是通過更改進度條的可見性;我已經嘗試了View.INVISIBLE和View.GONE,但都不起作用。 我也嘗試在另一個佈局中包裝進度條並更改該容器的可見性,但無濟於事。

我注意到當我旋轉設備時,進度條消失。

以下是玩家活動的xml佈局。那裏的表面視圖僅用於設備不支持OpenGL 2.0的情況。

有沒有人有任何想法如何擺脫這個ProgressBar?

在此先感謝!

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/RelativeLayout01" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" > 

<FrameLayout 
    android:id="@+id/gl_container" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" > 
</FrameLayout> 

<SurfaceView 
    android:id="@+id/surface" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:layout_centerInParent="true" > 
</SurfaceView> 

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/controlContainer" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:layout_alignParentBottom="true" 
    android:background="#aa000000" 
    android:orientation="vertical" 
    android:padding="10dp" > 

    <LinearLayout 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:gravity="center" 
     android:orientation="horizontal" > 

     <ToggleButton 
      android:id="@+id/buttonPausePlay" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="@drawable/selector_play_pause" 
      android:textOff="" 
      android:textOn="" /> 

     <ImageButton 
      android:id="@+id/buttonStop" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:background="#00000000" 
      android:src="@drawable/ic_media_stop" /> 
    </LinearLayout> 

    <ProgressBar 
     android:id="@+id/seekbar" 
     style="@android:style/Widget.ProgressBar.Horizontal" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:enabled="false" 
     android:indeterminate="false" /> 
</LinearLayout> 

<LinearLayout 
    android:id="@+id/loadingContainer" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerInParent="true" 
    android:gravity="center" 
    android:orientation="vertical" > 

    <ProgressBar 
     android:id="@+id/loading" 
     style="@android:style/Widget.ProgressBar.Large.Inverse" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:indeterminate="true" /> 

</LinearLayout> 

</RelativeLayout> 

編輯:改變視圖的可視性代碼:

@Override 
public void onBuffering(int progress_in_percent) { 
    Log.d(TAG, "Buffering " + progress_in_percent + " %"); 
} 

@Override 
public void onBufferingBegin() { 
    Log.d(TAG, "Buffering begin"); 
    loadingContainer.setVisibility(View.VISIBLE); 
} 

@Override 
public void onBufferingEnd() { 
    Log.d(TAG, "Buffering end"); 
    loadingContainer.setVisibility(View.GONE); 
} 

這些方法得到從NexPlayer框架內調用。我確信他們確實被調用,因爲我在日誌中獲得輸出。

+0

你能張貼您使用顯示和嘗試的代碼隱藏進度條? – Craigy

+0

我添加了代碼。感謝您的期待! – Mopper

回答

2

對,我想通了。我從NexPlayer框架獲得的回調不在UI線程中。奇怪的是,這並沒有在日誌中引起任何堆棧跟蹤,所以我沒有注意到這一點,直到我附加了我的調試器並添加了一個暫停於任何異常的斷點。

我通過創建與上面的代碼完全相同的事情並將它們發佈到我的處理程序的runnable來解決此問題。

(它仍然是打我爲什麼進度擺在首位出現了,雖然,因爲它也正在取得明顯錯誤的線程上:/)