VideoView Animation - PullRequest
       12

VideoView Animation

7 голосов
/ 19 июля 2011

Я использую videoview с анимацией (video.setAnimation (slideinRight);) Все работает нормально, за исключением того, что при переходе анимируется только макет видео-просмотра, а не видео.Когда происходит анимация перевода, я вижу, как окно перемещается и маскирует мое видео, но видео никогда не перемещается вместе с ним.Я в растерянности, что мне теперь делать.

Ответы [ 3 ]

5 голосов
/ 01 августа 2011

В настоящее время я пытаюсь разместить анимацию в VideoView.

Если вы посмотрите на исходный код Android, VideoView - это в основном SurfaceView в сочетании с MediaPlayer с базовым управлением конечным автоматом игрока.

На самом деле, настоящая работа по рисованию, кажется, выполняется нативными методами в mediaPlayer (например, реальной реализацией движка плеера на вашем устройстве Android)

Мы протестировали анимацию на разных устройствах и обнаружили, что поведение / реализация видеоплеера, лежащая в основе VideoView, не одинакова для разных устройств Android:

  • некоторые устройства корректно обрабатывают анимацию вида игрока
  • другие НЕ делают, а просто отображают размытие, черный экран или глючный дисплей ...

Кроме того, VideoView, кажется, записывается непосредственно в память, поэтому любой «обходной путь» (например, создание непрозрачного вида спереди и настройка анимации для этого вида), похоже, не работает.

Я был бы рад получить от других отзывы об этом:)

2 голосов
/ 08 февраля 2012

Извините, что ответил на это довольно поздно, но за то, что это стоит.и если вы хотите использовать только анимацию слайдов.Попробуйте поместить видеовид в макет и анимировать макет.

То, как я настроил его в моем коде, таково:

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

Тогда вы хотите анимировать видеообзор для слайда;

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

Обратите внимание, что это система анимации 3.1.

Не уверен, что классический способ анимации 2.1 будет работать так, но он должен служитьто же самое.

Такие вещи, как вращение / масштабирование макета не будут работать.Похоже, панорамирование макета вокруг и его затухание - единственное, что работает.

1 голос
/ 14 декабря 2015

Просто используйте TextureView :

Дополнительные сведения о TextureView здесь .

Я сделал Увеличение - ZoomOut анимация TextureView .

Добавление анимации xml в Res -> anim .

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) {

    }
}

Готово

...