1

したがって、私のアプリでは MediaPlayer は次のように拡張することで SurfaceView に基づいています。

public class VideoView extends SurfaceView  {}

現在、内部でMediaPlayerを使用しており、達成したいのは、画面の開始色を黒ではなく白にすることです。VideoView は、単独で白背景レイアウトに配置されます。それは白ですが、ビデオの再生を開始すると、VideoView が一瞬黒くなります。ビデオ自体の背景は白で、最初のフレームは黒ではないため、MediaPlayer に関するものだと思います。再生を開始すると、デフォルトで画面が黒くなります。次のようなトランジションを使用できると推測していました。

TransitionDrawable transition = new TransitionDrawable(new Drawable[]{new ColorDrawable(Color.WHITE), new ColorDrawable(Color.TRANSPARENT)});

if(Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN)
    this.setBackgroundDrawable(transition);
else
    this.setBackground(transition);

transition.setCrossFadeEnabled(true);
transition.startTransition(1000);

ただし、これはあまり役に立ちません。私の目標を達成する方法はありますか?
ローカル ビデオ ファイル (SD カードから) が再生されていることを忘れていました。したがって、黒い画面は、長い HTTP セッションの確立やその他のストリーム関連のものではありません。そして、準備は次の方法で行われますprepareAsync();

4

1 に答える 1

0

だから私は最終的に厄介な解決策を見つけました。まあ、何もないよりはましです:

private TransitionDrawable transition;
private Animation videoViewFadeInAnimation;
@SuppressWarnings("deprecation")
public void start() {

    if (videoViewFadeInAnimation == null){
        videoViewFadeInAnimation = new AlphaAnimation(0, 1);
        videoViewFadeInAnimation.setDuration(600);
        videoViewFadeInAnimation.setFillAfter(true);
        videoViewFadeInAnimation.setAnimationListener(new AnimationListener() {
            @Override
            public void onAnimationStart(Animation arg0) {}
            @Override
            public void onAnimationRepeat(Animation arg0) {}

            @Override
            public void onAnimationEnd(Animation arg0) {
                if (DeviceInfo.hasAPI11())
                    setAlpha(1);
            }
        });

    }

    if (transition == null){
        transition = new TransitionDrawable(new Drawable[]{new ColorDrawable(Color.WHITE), new ColorDrawable(Color.TRANSPARENT)});
        transition.setCrossFadeEnabled(true);

        if(DeviceInfo.hasAPI16())
            this.setBackground(transition);
        else
            this.setBackgroundDrawable(transition);
    }

    if (isInPlaybackState()) {
        if (mCurrentState!=STATE_PAUSED){
            startAnimation(videoViewFadeInAnimation);
            transition.startTransition(1);
        }
        hideVideoControls();
        mMediaPlayer.start();
        mCurrentState = STATE_PLAYING;
    }
    mTargetState = STATE_PLAYING;
}

ビデオの再生を開始する VideoView のメソッドです。基本的に、VideoView のアルファを 0 にし、1 ミリ秒の白い背景を作成し (背景の遷移なしでは機能しません)、アルファを 600 ミリ秒で 0 から 1 にアニメーション化します。値を lt 600 にすると、煩わしい黒い画面が目立ちます。ただし、600 ミリ秒のビデオが表示されないことも、視覚的にオーディオが早く開始されるため、最善の方法ではありません。この解決策は常に機能するとは限らず、その理由もわかりません。

于 2013-09-05T12:59:29.133 に答える