Сегодня у меня была та же проблема, и я нашел очень плохой и хакерский обходной путь для этой неприятной проблемы: я понял, что можно установить цвет фона / drawable на VideoView
, который смешивается с поверхностью видео и делает его полностью скрытым. Однако это работает только тогда, когда базовое видео все еще воспроизводится, а не когда оно остановлено (ни когда оно закончилось нормально, ни при вызове stopPlayback()
), иначе вы снова увидите черное мерцание. Фон также не должен быть установлен в начале, иначе видео будет полностью скрыто с самого начала.
Таким образом, единственным логическим шагом для меня было опубликовать отложенное событие непосредственно перед тем, как я начну видео — и, поскольку я знаю продолжительность видео, я позволяю этому событию произойти всего за несколько миллисекунд до того, как оно закончится нормально. Я сделал скриншот последнего кадра в VLC, а затем смешал его следующим образом:
private void startVideo()
{
introVideo.setBackgroundDrawable(null);
introVideo.postDelayed(new Runnable() {
public void run()
{
if (!introVideo.isPlaying())
return;
introVideo.setBackgroundResource(R.drawable.video_still_image);
// other stuff here, for example a custom transition to
// another activity
}
}, 7500); // the video is roughly 8000ms long
introVideo.start();
}
Однако этого было недостаточно, потому что, когда видео фактически закончилось, у меня все еще было короткое мерцание черного экрана, поэтому мне также пришлось установить неподвижное изображение в качестве фона контейнера, содержащего видео (в моем случае это был макет деятельность):
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/video_still_image">
<VideoView android:id="@+id/introVideo"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_alignParentRight="true"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_alignParentBottom="true"
android:layout_marginTop="-10dip" />
</RelativeLayout>
Это действие отображается в полноэкранном режиме, а видео (в основном) масштабируется до общего размера экрана (экран 1024x600, видео 960x640). Я говорю в основном, потому что по какой-то неизвестной причине фоновое изображение макета смешивается примерно на 10 пикселей сверху. Это был последний хак, который мне пришлось применить, чтобы заставить его работать — переместить видеоконтейнер -10dip
в пустоту сверху.
Теперь это выглядит потрясающе на моем Galaxy Tab, но я не осмеливаюсь тестировать его на телефоне SGS2...
person
Thomas Keller
schedule
29.07.2011