web-dev-qa-db-ja.com

VideoViewが非表示の場合、VideoViewonPreparedは呼び出されません

最初はVideoViewを非表示にしており、ビデオが読み込まれるとVideoViewが表示されます。ただし、最初にonPreparedVideoViewである場合、invisibleが呼び出されることはありません。ただし、onPreparedが表示されている場合は、VideoViewが適切に呼び出されます。ビデオがロードされるまでvideoViewを非表示にする方法はありますか。どんな助けでもいただければ幸いです。ありがとう!

activity_main.xml

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent" >


<VideoView
        Android:id="@+id/video"
        Android:layout_width="match_parent"
        Android:layout_height="match_parent"
        Android:layout_alignParentBottom="true"
        Android:layout_alignParentLeft="true"
        Android:layout_alignParentRight="true"
        Android:layout_alignParentTop="true"
        Android:visibility="invisible" />

</RelativeLayout>

MainActivity.Java

public class MainActivity extends Activity {

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

        VideoView videoView = (VideoView) findViewById(R.id.video);
        Uri videoUri = Uri.parse(url);
        videoView.setVideoURI(videoUri);
        videoView.requestFocus();

        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {

            @Override
            public void onPrepared(MediaPlayer mp) {
                Toast.makeText(mActivity, "on prepared", Toast.LENGTH_SHORT).show();


                 videoView.setVisibility(View.VISIBLE);


            }
        });


}
21
Abhishek V

ビデオビューのアルファチャンネルを0または0に近い値に設定してみてください。

9
FDIM

VideoView自体ではなくレイアウトを非表示にすることで解決しました。 @ J.Kowalskiに感謝します。

レイアウト:

<FrameLayout
    Android:id="@+id/layout_video_view"
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content">
    <VideoView
        Android:id="@+id/video_view"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:clickable="false"
        Android:scrollbars="none"/>
</FrameLayout>

<ProgressBar
    Android:id="@+id/progress"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_gravity="center"
    Android:visibility="gone"
    />

OnPreparedListenerを設定します。

videoView.setOnPreparedListener(this);

準備ができる前にプログレスバーを表示する:

@Override
public void showProgress() {
    progress.setVisibility(View.VISIBLE);
    layoutVideoView.setVisibility(View.INVISIBLE);
}

ビデオURIのロード:

@Override
public void loadVideo(Uri uri) {
    videoView.setVideoURI(uri);
}

準備ができると、onPreparedが呼び出されます。

@Override
public void onPrepared(MediaPlayer mp) {
    Log.d("debug", "onPrepared");
    iStepPreviewPresenter.onVideoViewReady();
}

最後にレイアウトを表示してビデオを開始します。

@Override
public void hideProgress() {
    progress.setVisibility(View.INVISIBLE);
    layoutVideoView.setVisibility(View.VISIBLE);
}

@Override
public void startVideo() {
    videoView.start();
}

ばっちり成功!

4
Jiawei Dai

これらのトリックの1つによって達成することができます

  1. ビデオが準備されるまでVideoViewの高さと幅を1pxに設定し、プロパティをmatch parentに変更して全画面に切り替えることができます。

  2. @FDIMが彼の回答で述べたように、ビデオが準備されるまで、ビューのアルファ値を0に設定できます。ただし、 TextureView を使用してビデオをロードする場合にのみ機能します。通常のVideoViewでは機能しません。これは、デフォルトのTextureView実装を模倣したVideoVideoを拡張するカスタムVideoViewです。このクラスはxmlファイルで直接使用でき、アルファを0に設定してビデオを非表示にすることができます。

    public class TextureVideoView extends TextureView  implements SurfaceTextureListener                {
    
    private MediaPlayer mMediaPlayer;
    
    public TextureVideoView(Context context) {
        super(context);
        init();
    }
    
    public TextureVideoView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }
    
    private void init() {
        mMediaPlayer = new MediaPlayer();
        this.setSurfaceTextureListener(this);
    }
    
    public void seekTo(int msec) {
        mMediaPlayer.seekTo(msec);
    }
    
    public void setVideoPath(final String path) throws IOException {
        mMediaPlayer.reset();
        mMediaPlayer.setDataSource(path);
        mMediaPlayer.prepare();
    }
    
    public void setVideoPath(FileDescriptor fd, long offset, long length) throws IOException {
        mMediaPlayer.reset();
        mMediaPlayer.setDataSource(fd, offset, length);
        mMediaPlayer.prepare();
    }
    
    public void setVideoURI(Context context, Uri uri) throws IOException {
        mMediaPlayer.reset();
        mMediaPlayer.setDataSource(context, uri);
    }
    
    public void setOnPreparedListener(OnPreparedListener onPreparedListener) {
        mMediaPlayer.setOnPreparedListener(onPreparedListener);
    }
    
    public void setOnCompletionListener(OnCompletionListener onCompletionListener) {
        mMediaPlayer.setOnCompletionListener(onCompletionListener);
    }
    
    public void setOnErrorListener(OnErrorListener onErrorListener) {
        mMediaPlayer.setOnErrorListener(onErrorListener);
    }
    
    public void start() {
        mMediaPlayer.start();
    }
    
    public void pause() {
        mMediaPlayer.pause();
    }
    
    public void setVolume(float leftVolume, float rightVolume ) {
        mMediaPlayer.setVolume(leftVolume, rightVolume);
    }
    
    public boolean isPlaying() {
        return mMediaPlayer.isPlaying();
    }
    
    public void stopPlayback() {
        mMediaPlayer.stop();
    }
    
    public void reset() {
        mMediaPlayer.reset();
    }
    
    public void release() {
        mMediaPlayer.release();
    }
    
    
    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width,
            int height) {
    
        mMediaPlayer.setSurface(new Surface(surface));
    }
    
    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        return false;
    }
    
    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width,
            int height) {
    
    }
    
    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
    
    }
    
3
Abhishek V

より簡単な回避策:

parentviewvideoviewを変更する代わりに、visiblityにダミーのparentviewを追加し、そのvisibilityvideoviewを設定するだけです。 var] _自体。

0
Thiagesh thg