Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了android-scrollview – 当listitem在recyclerview中可见时播放/暂停视频大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我已经实现了一个recyclerview,我在其中添加纹理视图作为列表项来播放来自url的视频.现在像藤蔓和Instagram应用程序我想播放视频,当它在recyclerview中可见,并在listitem离开屏幕时停止/暂停视频.以下是我的代码

VideosAdapter类:

public class VideosAdapter extends RecyclerView.Adapter<VideosAdapter.ViewHolder> {

private static String TAG = "VideosAdapter";

Context context;
private ArrayList<String> urls;
RecyclerView recyclerView;

public static class ViewHolder extends RecyclerView.ViewHolder {

    public TextureView textureView;
    public TextView textView;

    public ViewHolder(View v) {
        super(v);
        textureView = (TextureView) v.findViewById(R.id.textureView);
        textView = (TextView) v.findViewById(R.id.textView);

    }
}

public VideosAdapter(Context context,RecyclerView recyclerView,final ArrayList<String> urls) {

    this.context = context;
    this.recyclerView = recyclerView;
    thiS.Urls = urls;

    recyclerView.addOnScrollListener(new RecyclerView.onScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView,int dx,int dy) {
            super.onScrolled(recyclerView,dx,dy);
        }

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView,int newStatE) {
            super.onScrollStateChanged(recyclerView,newStatE);

            if(newState == RecyclerView.SCROLL_STATE_IDLE) {

                linearlayoutmanager layoutManager = ((linearlayoutmanager) recyclerView.getLayoutManager());
                int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
                int findFirstCompletelyVisibleItemPosition = layoutManager.findFirstCompletelyVisibleItemPosition();
                int findLastVisibleItemPosition = layoutManager.findLastVisibleItemPosition();
                int findLastCompletelyVisibleItemPosition = layoutManager.findLastCompletelyVisibleItemPosition();

                *//*Log.i(tag,"firstVisiblePosition = " + String.valueOf(firstVisiblePosition));
                Log.i(tag,"findFirstCompletelyVisibleItemPosition = " + String.valueOf(findFirstCompletelyVisibleItemPosition));
                Log.i(tag,"findLastVisibleItemPosition = " + String.valueOf(findLastVisibleItemPosition));
                Log.i(tag,"findLastCompletelyVisibleItemPosition = " + String.valueOf(findLastCompletelyVisibleItemPosition));*//*

                Log.i(tag,"//////////////////////////////////////////////////////////////");

                if(findFirstCompletelyVisibleItemPosition>=0) {
                    Log.i(tag,"Playing_URl = " + urls.get(findFirstCompletelyVisibleItemPosition));
                    int tempPrevIoUsUrl = findFirstCompletelyVisibleItemPosition - 1;
                    if(tempPrevIoUsUrl>=0)
                        Log.i(tag,"Stop_Playing_URl = " + urls.get(tempPrevIoUsUrl));

                }
                else
                {
                    Log.i(tag,"Playing_URl = " + urls.get(firstVisiblePosition));
                    int tempPrevIoUsUrl = firstVisiblePosition - 1;
                    if(tempPrevIoUsUrl>=0)
                        Log.i(tag,"Stop_Playing_URl = " + urls.get(tempPrevIoUsUrl));
                }
            }
        }
    });
}

// Create new views (invoked by the layout manager)
@Override
public VideosAdapter.ViewHolder onCreateViewHolder(ViewGroup parent,int viewTypE) {
    // create a new view
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_main,parent,falsE);
    ViewHolder viewHolder = new ViewHolder(v);
    return viewHolder;
}

// replace the contents of a view (invoked by the layout manager)
@Override
public void onBindViewHolder(ViewHolder holder,int position) {

    String url = urls.get(position);
    holder.textView.setText(url);

    //Log.i("BindViewHolderCalledFor",position + " = " + url);

    VideoPlayController videoPlayController = new VideoPlayController(context,recyclerView,holder.textureView,url);

    if(position==0) {
        videoPlayController.loadVideo();
    }

}

@Override
public int getItemCount() {
    return urls.size();
}

}

VideoPlayController类:

public class VideoPlayController implements TextureView.SurfaCETextureListener {

private static String TAG = "VideoPlayController";

Context context;
String url;
MediaPlayer mp;
Surface surface;
SurfaCETexture s;
RecyclerView recyclerView;
TextureView textureView;

public VideoPlayController(Context context,TextureView textureView,final String url) {

    this.context = context;
    this.recyclerView = recyclerView;
    this.textureView = textureView;
    thiS.Url = url;

    recyclerView.addOnScrollListener(new RecyclerView.onScrollListener() {

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView,newStatE);

            if(newState == RecyclerView.SCROLL_STATE_IDLE) {

                Log.i(tag,"OnScrollStateChangedCalled For: " + url);

                //When scroll is at idol position check if item is visible

            }
        }
    });

}

public void loadVideo() {

    textureView.setSurfaCETextureListener(this);
}

@Override
public void onSurfaCETextureAvailable(final SurfaCETexture surface,int width,int height) {
    Log.d("surface_available-url",thiS.Url);
    startVideo(surfacE);
}

@Override
public void onSurfaCETextureSizeChanged(SurfaCETexture surface,int height) {
    Log.d("surface_destroyed-url",thiS.Url);
}

@Override
public Boolean onSurfaCETextureDestroyed(SurfaCETexture surfacE) {
    Log.d("surface_destroyed-url",thiS.Url);
    this.mp.stop();
    this.mp.reset();
    this.mp.release();
    this.mp = null;
    return false;
}

@Override
public void onSurfaCETextureupdated(SurfaCETexture surfacE) {

}

public void startVideo(SurfaCETexture t)
{
    this.surface = new Surface(t);
    this.mp = new MediaPlayer();
    this.mp.setSurface(this.surfacE);
    try {
        Uri uri = Uri.parse(thiS.Url);
        this.mp.setDatasource(url);
        this.mp.prepareAsync();

        this.mp.setOnPreparedListener(new MediaPlayer.onPreparedListener() {
            public void onPrepared(MediaPlayer mp) {

                mp.setLooping(true);
                mp.start();

            }
        });
    } catch (IllegalArgumentexception e1) {
        e1.printStackTrace();
    } catch (SecurityException e1) {
        e1.printStackTrace();
    } catch (IllegalStateException e1) {
        e1.printStackTrace();
    } catch (IOException e1) {
        e1.printStackTrace();
    }
    try {

    } catch (IllegalArgumentexception E) {
        e.printStackTrace();
    } catch (SecurityException E) {
        e.printStackTrace();
    } catch (IllegalStateException E) {
        e.printStackTrace();
    }
    try {

    } catch (IllegalStateException E) {
        e.printStackTrace();
    }
}

public void changePlayState()
{
    if(this.mp.isPlaying())
        this.mp.stop();
    else
        this.mp.start();
}

public static Boolean isViewVisible(View subView,View parentView) {
    Rect scrollBounds = new Rect();
    parentView.getHitRect(scrollBounds);
    if (subView.getLocalVisibleRect(scrollBounds)) {
        return true;
    }
    return false;
}

}

为了实现这一点,我得到了this线程中讨论的可见项目位置.但我不知道如何将可见滚动位置传递给我的VideoPlayController类以及如何根据滚动位置跟踪和访问正确的对象.

解决方法

我知道这已经很晚了,但很多人仍然在寻找一种方法来做到这一点.
您可以使用 VideoPlayerManager项目来实现此功能

大佬总结

以上是大佬教程为你收集整理的android-scrollview – 当listitem在recyclerview中可见时播放/暂停视频全部内容,希望文章能够帮你解决android-scrollview – 当listitem在recyclerview中可见时播放/暂停视频所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。