ProgressBar поверх FrameLayout - PullRequest
       0

ProgressBar поверх FrameLayout

1 голос
/ 27 октября 2011

У меня странная ситуация. Я использую NexPlayer для рендеринга потокового видео в режиме openGL. Поверх области рендеринга для потокового видео (разметка кадра) я отображаю ProgressBar в неопределенном режиме всякий раз, когда видеоплеер выполняет буферизацию - сравнимо с тем, что делает приложение youtube.

Это прекрасно работает до того момента, когда игрок прекращает буферизацию, и я пытаюсь убрать индикатор выполнения с экрана. Индикатор выполнения прекращает анимацию, но остается на экране, как если бы он был водяным знаком на видео. Я пытаюсь удалить его, изменив видимость индикатора выполнения; Я пробовал и 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. Я уверен, что их вызывают, так как я получаю вывод в логах.

1 Ответ

2 голосов
/ 28 октября 2011

Хорошо, я понял это. Обратный вызов, который я получал от платформы NexPlayer, не был в потоке пользовательского интерфейса. Как ни странно, это не вызвало никаких трассировок стека в журнале, поэтому я не заметил этого, пока не подключил отладчик и не добавил точку останова, которая приостанавливается при любом исключении.

Я исправил это, создавая runnables, которые делают то же самое, что и код выше, и отправляя их в мой обработчик.

(Это по-прежнему бьет меня, почему ProgressBar появился в первую очередь, хотя, поскольку он также был сделан видимым в неправильном потоке: /)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...