2013-07-11 13 views
8

Mam do czynienia z dziwnym problemem migotania przy użyciu VideoView. Po rozpoczęciu aktywności powoduje nieznaczne migotanie ułamka na sekundę. Następnie rozpoczyna się wideo. Pokazuje 2 czarne linie na górze i na dole wideo. Zobacz poniższy snap-shot.Problem z migającym VideoView

check snap shot

Ja testowałem mój wniosek na 2 urządzeniach

1) Samsung n-8000 (tablet)

2) Lenovo-800

video.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:background="#ffffff" 
android:gravity="center"> 

<VideoView 
    android:id="@+id/vvSplash" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:background="#00ffffff"> 
</VideoView> 

</LinearLayout> 

Kod aktywny:

private VideoView vd; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    getWindow().requestFeature(Window.FEATURE_NO_TITLE); 
    setContentView(R.layout.video); 
    vd = (VideoView) findViewById(R.id.vvSplash); 
    playVideo(); 
} 

private void playVideo() { 
    Uri uri = Uri.parse("android.resource://" + getPackageName() +"/"+ R.raw.intro); 
    vd.setVideoURI(uri); 
    vd.setMediaController(null); 
    vd.start();  
} 

Każda pomoc będzie mile widziane. Dziękuję Ci.

+0

@Piotr Chojnacki dzięki dla edytowanej pytanie .. :) – TheFlash

+0

Jesteś mile widziany! –

+0

Mam również do czynienia z tym samym problemem, co twój. Jak rozwiązałeś ten problem? – VickyS

Odpowiedz

8

Jak śmieszne, jak to brzmi, ale odpowiedź jest tutaj:

Powtarzam rozwiązanie , kudos tym, którzy dowiedzieli się:

<SurfaceView 
    android:layout_width="0px" 
    android:layout_height="0px" 
    android:visibility="gone" /> 

Jest BARDZO WAŻNE że dodasz widok powierzchni do widoku głównego w swojej działalności, a nie bezpośredniego rodzica. W przeciwnym razie to nie zadziała.

+0

U r right..going to accept .. :) – TheFlash

+2

To nie rozwiązuje problemu w systemie Android 5.1. – user2966445

+0

To już nie działa. –

2

Mam też do czynienia z tym samym problemem, ale rozwiązałem go, zmieniając parametr układu wideoview z zawartości wrap do dopasowania rodzica. Musisz również usunąć właściwość tła widoku wideo z XML. Mam nadzieję, że zadziała dla ciebie

+0

dziękuję za odpowiedź. Będę próbował i zaakceptować, jeśli to działa .. :) – TheFlash

+0

Testowałem to, co powiedziałeś, ale nie działa. w każdym razie dzięki i +1 ode mnie. – TheFlash

+0

Grałem w wideo, a po zakończeniu umieszczałem miniaturę na filmie, ale otrzymywałem te czarne migotanie, kiedy wideo się zaczęło i skończyło, po przeczytaniu tego posta, próbowałem ustawić tło filmu na miniatura i POOF, nie ma więcej problemów. Dzięki, +1. – Korebian

0

Po prostu usuń poniższy wiersz z twojego xml.

android:background="#00ffffff" 

To pomoże :)

+0

Rozwiązałem mój problem. W każdym razie dziękuję za odpowiedź. – TheFlash

1

Dla ludzi w przyszłości: Ten brzydki błąd wydaje się być rozwiązany w Marshmallow. W mojej pracy rozwijamy się z Xamarinem (więc zasadniczo wszystkie widoki są dodawane programowo). Mamy sporo urządzeń testowych i pracowałem głównie nad urządzeniem Marshmallow, więc nigdy nie zauważyłem tego czarnego migotania podczas budowania strony, nad którą pracowałem. Po ostatecznym przetestowaniu urządzenia Lollipop zauważyłem to migotanie.

Niestety nie mam rozwiązania. Potrzebujemy, aby nasza aplikacja była jak najbardziej wieloplatformowa, dlatego używanie xml układu jest odradzane/smutne.

+1

Można to zrobić w kodzie Java. Zobacz moją odpowiedź, http://stackoverflow.com/a/37966446/38557. – noamtm

0

Dla każdego, kto nadal boryka się z problemem i nie rozumiem, jak użyć powyższej odpowiedzi. Po prostu kopiuje ten kod i wkleja go do głównego schematu działania, w którym używasz videoview w ramach głównego (pierwszego) układu.

<SurfaceView 
    android:layout_width="0px" 
    android:layout_height="0px" 
    android:visibility="gone" /> 

w moim przypadku

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/Mainframlayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/facebookbgcolor" > 
<SurfaceView 
    android:layout_width="0px" 
    android:layout_height="0px" 
    android:visibility="gone" /> 
.....rest of the layout 
0

adaptowany rozwiązanie oparte na XML z https://stackoverflow.com/a/27307286/38557 używać zamiast kodu Java. Umieścić to we fragmencie za onCreateView(), zanim pompowania układ:

// Add a SurfaceView to prevent flickering when the video is loaded later. 
SurfaceView surfaceView = new SurfaceView(getActivity()); 
surfaceView.setVisibility(View.GONE); 
container.addView(surfaceView, new ViewGroup.LayoutParams(0, 0)); 

Czyni to samo, i może być stosowany, gdy nie mogą lub nie chcą zmieniać plików XML.

1

Jeśli problem jest VideoViewmigotanie, gdy przycisk jest wciśnięty z powrotem, po prostu ustawić widoczność VideoView do INVISIBLE lub GONE w sposobie swojej działalności onBackPressed() przed wywołaniem super wykonanie.

Jeżeli użytkownik może również pozostawić przez przycisku „w górę”, przechwytują android.R.home poz opcja ukryć VideoView.

Oto przykład w Kotlin:

override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) { 
    android.R.id.home -> super.onOptionsItemSelected(item).also { 
     video_view.visibility = GONE // Hide videoView before leaving to avoid flickering 
    } 
    R.id.action_share -> consume { shareVideo() } // Your regular menu options 
    else -> super.onOptionsItemSelected(item) 
} 

override fun onBackPressed() { 
    video_view.visibility = GONE // Hide videoView before leaving to avoid flickering 
    super.onBackPressed() 
} 
Powiązane problemy