Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Exoplayer暂停按钮最初不会出现_Android_Exoplayer - Fatal编程技术网

Android Exoplayer暂停按钮最初不会出现

Android Exoplayer暂停按钮最初不会出现,android,exoplayer,Android,Exoplayer,因此,所有的设置,工作精细。我正在播放m3u8视频。没有问题。但是当我点击play时,play按钮并没有被pause按钮替换。它只是消失了,但当我进入全屏时,暂停按钮出现了。奇数不 顺便说一句,这是在react-native组件中,这是因为在react-native中嵌入Android本机视图时出现了一些渲染问题。使用Android studio中的布局检查器,我发现按钮大小为0。因此,每当玩家状态改变时,重新测量并调用视图上的布局应该可以解决这个问题 有如下重新测量和布局的方法: privat

因此,所有的设置,工作精细。我正在播放m3u8视频。没有问题。但是当我点击play时,play按钮并没有被pause按钮替换。它只是消失了,但当我进入全屏时,暂停按钮出现了。奇数不


顺便说一句,这是在react-native组件中,这是因为在react-native中嵌入Android本机视图时出现了一些渲染问题。使用Android studio中的布局检查器,我发现按钮大小为0。因此,每当玩家状态改变时,重新测量并调用视图上的布局应该可以解决这个问题

有如下重新测量和布局的方法:

private fun reLayout(controlView: View?, controlViewsParent: View?) {
    controlView?.measure(MeasureSpec.makeMeasureSpec(controlViewsParent.measuredWidth, MeasureSpec.EXACTLY),
            MeasureSpec.makeMeasureSpec(controlViewsParent.measuredHeight, MeasureSpec.EXACTLY))
    controlView?.layout(view.left, view.top, view.measuredWidth, view.measuredHeight)
}
Player.EventListener
添加到exoplayer实例
此侦听器应提供以下重写方法,在这些方法中调用
relayat()
。每当ExoPlayer状态更改时,以及当您暂停并播放时,都会调用这两个重写的方法。因此,重新测量和渲染视图修复了按钮问题

override fun onPlaybackStateChanged(state: Int) {
    relayout(controlView, controlViewsParent)
}

override fun onIsPlayingChanged(isPlaying: Boolean) {
    relayout(controlView, controlViewsParent)
}
我的暂停和播放按钮位于框架布局内,如:

<FrameLayout
        android:id="@+id/exo_play_pause_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center">

        <ImageButton
            android:id="@id/exo_play"
            style="@style/ExoMediaButton.Play" />

        <ImageButton
            android:id="@id/exo_pause"
            style="@style/ExoMediaButton.Pause" />
</FrameLayout>


这里我的
controlView
exo\u play\u pause\u container
controlViewsParent
是这个布局文件的根。

这是因为在react Native中嵌入安卓本机视图时出现了一些渲染问题。使用Android studio中的布局检查器,我发现按钮大小为0。因此,每当玩家状态改变时,重新测量并调用视图上的布局应该可以解决这个问题

有如下重新测量和布局的方法:

private fun reLayout(controlView: View?, controlViewsParent: View?) {
    controlView?.measure(MeasureSpec.makeMeasureSpec(controlViewsParent.measuredWidth, MeasureSpec.EXACTLY),
            MeasureSpec.makeMeasureSpec(controlViewsParent.measuredHeight, MeasureSpec.EXACTLY))
    controlView?.layout(view.left, view.top, view.measuredWidth, view.measuredHeight)
}
Player.EventListener
添加到exoplayer实例
此侦听器应提供以下重写方法,在这些方法中调用
relayat()
。每当ExoPlayer状态更改时,以及当您暂停并播放时,都会调用这两个重写的方法。因此,重新测量和渲染视图修复了按钮问题

override fun onPlaybackStateChanged(state: Int) {
    relayout(controlView, controlViewsParent)
}

override fun onIsPlayingChanged(isPlaying: Boolean) {
    relayout(controlView, controlViewsParent)
}
我的暂停和播放按钮位于框架布局内,如:

<FrameLayout
        android:id="@+id/exo_play_pause_container"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center">

        <ImageButton
            android:id="@id/exo_play"
            style="@style/ExoMediaButton.Play" />

        <ImageButton
            android:id="@id/exo_pause"
            style="@style/ExoMediaButton.Pause" />
</FrameLayout>


这里我的
controlView
exo\u play\u pause\u container
controlViewsParent
是这个布局文件的根。

我不知道它是否有用,但这是我基于Ankshay Bhat响应的解决方案:

VideoPlayer.java

import android.content.Context;

import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.exoplayer2.Player.EventListener;

public class VideoPlayer extends PlayerView {

    private SimpleExoPlayer player;

    @Override
    public SimpleExoPlayer getPlayer() {
        return player;
    }

    public void setFile(String url) {
        preparePlayer(url);
    }

    public VideoPlayer(Context context) {
        super(context);
        player = new SimpleExoPlayer.Builder(context).build();
        this.setPlayer(player);
    }

    private void preparePlayer(String url) {
        MediaItem mediaItem = MediaItem.fromUri(url);
        // Set the media item to be played.
        player.setMediaItem(mediaItem);
        // Prepare the player.
        player.prepare();
    }

    public void addOnAttachStateChangeListener(EventListener listener) {
        this.player.addListener(listener);
    }
}
VideoPlayerView.java

import android.content.Context;
import android.widget.FrameLayout;
import com.google.android.exoplayer2.Player.EventListener;
import androidx.annotation.NonNull;

public class VideoPlayerView extends FrameLayout {
    private Context context;
    public VideoPlayer videoPlayer;

    public VideoPlayerView(@NonNull Context context) {
        super(context);
        this.context = context;
        this.init();
    }

    private void init(){
        videoPlayer = new VideoPlayer(context);
        videoPlayer.addOnAttachStateChangeListener(new EventListener() {
            @Override
            public void onPlaybackStateChanged(int state) {
                post(measureAndLayout);
            }

            @Override
            public void onIsPlayingChanged(boolean isPlaying) {
                post(measureAndLayout);
            }
        });
        this.addView(videoPlayer);
    }

    private final Runnable measureAndLayout = () -> {
        measure(
                MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY),
                MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY));
        layout(getLeft(), getTop(), getRight(), getBottom());
    };

}

我不知道这是否有帮助,但这是我基于Ankshay Bhat回应的解决方案:

VideoPlayer.java

import android.content.Context;

import com.google.android.exoplayer2.MediaItem;
import com.google.android.exoplayer2.SimpleExoPlayer;
import com.google.android.exoplayer2.ui.PlayerView;
import com.google.android.exoplayer2.Player.EventListener;

public class VideoPlayer extends PlayerView {

    private SimpleExoPlayer player;

    @Override
    public SimpleExoPlayer getPlayer() {
        return player;
    }

    public void setFile(String url) {
        preparePlayer(url);
    }

    public VideoPlayer(Context context) {
        super(context);
        player = new SimpleExoPlayer.Builder(context).build();
        this.setPlayer(player);
    }

    private void preparePlayer(String url) {
        MediaItem mediaItem = MediaItem.fromUri(url);
        // Set the media item to be played.
        player.setMediaItem(mediaItem);
        // Prepare the player.
        player.prepare();
    }

    public void addOnAttachStateChangeListener(EventListener listener) {
        this.player.addListener(listener);
    }
}
VideoPlayerView.java

import android.content.Context;
import android.widget.FrameLayout;
import com.google.android.exoplayer2.Player.EventListener;
import androidx.annotation.NonNull;

public class VideoPlayerView extends FrameLayout {
    private Context context;
    public VideoPlayer videoPlayer;

    public VideoPlayerView(@NonNull Context context) {
        super(context);
        this.context = context;
        this.init();
    }

    private void init(){
        videoPlayer = new VideoPlayer(context);
        videoPlayer.addOnAttachStateChangeListener(new EventListener() {
            @Override
            public void onPlaybackStateChanged(int state) {
                post(measureAndLayout);
            }

            @Override
            public void onIsPlayingChanged(boolean isPlaying) {
                post(measureAndLayout);
            }
        });
        this.addView(videoPlayer);
    }

    private final Runnable measureAndLayout = () -> {
        measure(
                MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY),
                MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY));
        layout(getLeft(), getTop(), getRight(), getBottom());
    };

}