2011-07-19 25 views
7

Używam wideoview z animacją (video.setAnimation (slideinRight);) Wszystko działa dobrze, z wyjątkiem tego, że podczas przejścia, tylko układ wideo jest animowany, a nie wideo. Kiedy pojawia się animacja tłumaczenia, widzę ruchy i maski na moim filmie, ale film nigdy się z nim nie porusza. Nie mam pojęcia, co teraz zrobić.VideoView Animacja

Odpowiedz

2

Przepraszam za odpowiedzi to dość późno, ale za to, co warto. i jeśli chcesz tylko użyć animacji "przesuń". Spróbuj umieścić widok wideo w układzie i animować układ.

Sposób w jaki ustawiłem to w moim kodzie;

AbsoluteLayout Animationlayout = (AbsoluteLayout)findViewById(R.string.frontlayout); 
VideoView pvv = new VideoView(getApplicationContext()); 
pvv.getHolder().addCallback(this); 
Animationlayout.addView(pvv); 
// load video data in pvv. 

To miejsce, w którym chcesz animować swój widok wideo, aby przesuwać;

Animationlayout.animate().xBy(25).setDuration(500).setInterpolator(new BounceInterpolator()); 

Należy pamiętać, że jest to system animacji 3.1.

Nie wiem, czy klasyczny sposób 2.1 animacji będzie działał w ten sposób, ale powinien służyć tak samo.

Rzeczy takie jak obracanie/skalowanie układu nie będą działać. Przesuwanie układu wokół i blaknięcie wydaje się być jedynymi nielicznych rzeczy, które działają.

5

Obecnie próbuję umieścić animacje na VideoView.

Jeśli spojrzeć na kod źródłowy Androida, VideoView jest w zasadzie a SurfaceView, w połączeniu z MediaPlayer, z podstawowym zarządzaniem automatu stanu gracza.

Faktycznie, prawdziwa „wyciągnąć” praca wydaje się być obsługiwane za pomocą metod natywnych w MediaPlayer (aka wykonania silnika Real Player na urządzeniu Android)

Przetestowaliśmy animacje na różnych urządzeniach, a okazało się, że VideoView użytkownika bazowy zachowanie odtwarzacz wideo/realizacja nie jest taka sama między różnymi urządzeniami z systemem Android:

  • niektóre urządzenia obsługiwać oglądać animacje gracza poprawnie
  • inni nie, a tylko wyświetlać rozmycie, czarny ekran lub monitor buggy ..

Ponadto wydaje się, że VideoView jest zapisywany bezpośrednio w pamięci, więc każde "obejście" (jak umieszczenie nieprzejrzystego widoku z przodu i ustawienie animacji w tym widoku) wydaje się nie działać.

byłbym zadowolony Czy inni opinię na temat tego :)

+0

Czy znalazłeś rozwiązanie tego problemu? –

+0

Nie, musieliśmy zaimplementować inny projekt dla naszej aplikacji (nie przesuwając wideoView, ale przenosząc inne części :-) Jednak zastanawiam się, jak kod ewoluował w systemie Android 4.0. Powinienem to obejrzeć ... – Vinzzz

+0

Myślę, że ponieważ niektóre urządzenia nie mają poprawnej obsługi OpenGL. W takim przypadku urządzenie wyświetla rozmycie lub czarny ekran –

1

Wystarczy użyć TextureView:

Więcej odniesienia na TextureView here.

Zrobiłem zoomin - zoomout animację na TextureView.

Dodaj animacji xml w Res ->anim folderu.

zoom_in_out.xml:

<?xml version="1.0" encoding="utf-8"?> 
<set xmlns:android="http://schemas.android.com/apk/res/android" 
    android:shareInterpolator="false"> 
    <scale 
     android:duration="1000" 
     android:fillAfter="false" 
     android:fromXScale="1.0" 
     android:fromYScale="1.0" 
     android:interpolator="@android:anim/accelerate_decelerate_interpolator" 
     android:pivotX="50%" 
     android:pivotY="50%" 
     android:toXScale="1.2" 
     android:toYScale="1.2" /> 
    <set android:interpolator="@android:anim/decelerate_interpolator"> 
     <scale 
      android:duration="1000" 
      android:fillBefore="false" 
      android:fromXScale="1.2" 
      android:fromYScale="1.2" 
      android:pivotX="50%" 
      android:pivotY="50%" 
      android:startOffset="500" 
      android:toXScale="1.0" 
      android:toYScale="1.0" /> 

    </set> 
</set> 

texture_layout.xml:

<?xml version="1.0" encoding="utf-8"?> 
<TextureView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/textureView" 
    android:layout_margin="50dp" 
    android:background="@android:color/darker_gray" 
    android:layout_width="wrap_content" android:layout_height="wrap_content"> 

</TextureView> 

TextureViewActivity.java:

import android.graphics.SurfaceTexture; 
import android.media.MediaPlayer; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.view.Surface; 
import android.view.TextureView; 
import android.view.View; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import java.io.IOException; 


public class TextureViewActivity extends AppCompatActivity implements TextureView.SurfaceTextureListener { 

    private TextureView textureView; 
    private MediaPlayer mMediaPlayer; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.texture_layout); 

     textureView = (TextureView)findViewById(R.id.textureView); 
     textureView.setSurfaceTextureListener(this); 

     textureView.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Animation zoomAnimation = AnimationUtils.loadAnimation(TextureViewActivity.this, R.anim.zoom_in_out); 
       textureView.startAnimation(zoomAnimation); 
      } 
     }); 


    } 

    private String getVideoPath(){ 
     return "android.resource://" + getPackageName() + "/" + R.raw.promovideo; 
    } 


    @Override 
    public void onSurfaceTextureAvailable(SurfaceTexture surfaceTexture, int width, int height) { 
     Surface surface = new Surface(surfaceTexture); 
     try { 
      mMediaPlayer= new MediaPlayer(); 
      mMediaPlayer.setDataSource(TextureViewActivity.this, Uri.parse(getVideoPath())); 
      mMediaPlayer.setSurface(surface); 
      mMediaPlayer.prepare(); 
      mMediaPlayer.start(); 
      mMediaPlayer.setLooping(true); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (SecurityException e) { 
      e.printStackTrace(); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) { 

    } 

    @Override 
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) { 
     return false; 
    } 

    @Override 
    public void onSurfaceTextureUpdated(SurfaceTexture surface) { 

    } 
} 

Wykonane