最初はVideoView
を非表示にしており、ビデオが読み込まれるとVideoView
が表示されます。ただし、最初にonPrepared
がVideoView
である場合、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);
}
});
}
ビデオビューのアルファチャンネルを0または0に近い値に設定してみてください。
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();
}
ばっちり成功!
これらのトリックの1つによって達成することができます
ビデオが準備されるまでVideoView
の高さと幅を1px
に設定し、プロパティをmatch parent
に変更して全画面に切り替えることができます。
@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) {
}
より簡単な回避策:
parentview
のvideoview
を変更する代わりに、visiblity
にダミーのparentview
を追加し、そのvisibility
にvideoview
を設定するだけです。 var] _自体。