Android 当视频在屏幕上占一定百分比时,在recyclerView中暂停视频

Android 当视频在屏幕上占一定百分比时,在recyclerView中暂停视频,android,android-recyclerview,Android,Android Recyclerview,我想在recyclerView适配器内的屏幕上播放75%的视频。所以findFirstVisibleItem和所有这些在这里都不起作用。或者如果他们这样做了,我不知道他们会如何工作 目前,我正在等待视图被回收,然后才能暂停或播放视频,但这从生成新视图的那一刻开始。谁能帮我一个忙吗?我已经研究了很长时间,还没有找到答案 使用RecyclerView.ItemDecoration ItemDecoration在呈现回收者的内容时被称为多次,因此它不应该在这里做繁重的工作,但是当视图的某个百分比可见时

我想在recyclerView适配器内的屏幕上播放75%的视频。所以findFirstVisibleItem和所有这些在这里都不起作用。或者如果他们这样做了,我不知道他们会如何工作


目前,我正在等待视图被回收,然后才能暂停或播放视频,但这从生成新视图的那一刻开始。谁能帮我一个忙吗?我已经研究了很长时间,还没有找到答案

使用RecyclerView.ItemDecoration

ItemDecoration在呈现回收者的内容时被称为多次,因此它不应该在这里做繁重的工作,但是当视图的某个百分比可见时,您可以使用它来通知

ItemDecoration有几种方法,但您需要实现的方法是:

public void onDrawOver(Canvas c, RecyclerView parent, State state);
或许

public void onDraw(Canvas c, RecyclerView parent, State state);
对于您要求的情况,您不会注意到任何差异,但为了补充说明,在屏幕上渲染行时会调用第一个,以便您可以在其上绘制,而在渲染行之前会调用第二个,以便您可以在下面绘制一些内容

在这种情况下,您不需要绘制任何内容,只需计算视图的大小即可。对于该任务,您需要获取渲染视图,并检测哪一个是带有视频的视图

@Override
public void onDraw(Canvas canvas, RecyclerView parent, RecyclerView.State state) {

int childCount = parent.getChildCount();
for (int i = 0; i < childCount - 1; i++) {
    View child = parent.getChildAt(i);
    int adapterPos = parent.getChildAdapterPosition(child);
    int viewType = parent.getAdapter().getItemViewType(adapterPos);
    ... Your code here ...
    // if(viewType == THE_EXPECTED_TYPE) {
    //     if(child.top() == parent.top()) {
    //         notifyViewIsVisibleAt100(); //100%; make your calcs to ensure your 75%
   //      }
   //  }
    }
}

在ScrollStatechanged上的循环视图滚动侦听器中添加以下代码:

if (newState == RecyclerView.SCROLL_STATE_IDLE) {

                LinearLayoutManager layoutManager = ((LinearLayoutManager) recyclerView.getLayoutManager());
                int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
                int findFirstCompletelyVisibleItemPosition = layoutManager.findFirstCompletelyVisibleItemPosition();

                Video video;
                if (urls != null && urls.size() > 0)
                {
                    if (findFirstCompletelyVisibleItemPosition >= 0) {
                        //handle here to play video in adapter
                    }
                    else
                    {
                       //code here for another position
                    }
                }}

您只需使用**模型类**

现在,在适配器类中,对onBindViewHolder进行一些更改


我想你应该试试这个,它对我有用


然后,我如何访问在viewHolder中传递到特定位置适配器的视频,以尝试暂停该位置的InBindViewHolder检查项,并创建暂停和播放视频的方法确定我开始了您想暂停视频然后播放它。?再次从暂停的地方开始@JanwilX72我知道我已经把赏金分配给了你@jDur,但是你能帮我计算一下吗。我正在努力想象使用什么来显示它是否在75%的范围内screen@Janwilx72我可能会尝试使用视图顶部进行计算。请记住,top属性表示Y轴上相对于父对象的像素位置,因此child.getTop在未完全显示时应为负值,在显示时应为>=0。
if (newState == RecyclerView.SCROLL_STATE_IDLE) {

                LinearLayoutManager layoutManager = ((LinearLayoutManager) recyclerView.getLayoutManager());
                int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
                int findFirstCompletelyVisibleItemPosition = layoutManager.findFirstCompletelyVisibleItemPosition();

                Video video;
                if (urls != null && urls.size() > 0)
                {
                    if (findFirstCompletelyVisibleItemPosition >= 0) {
                        //handle here to play video in adapter
                    }
                    else
                    {
                       //code here for another position
                    }
                }}
        Class Video{

        String videoUrl;   //Http://
        int videoDrawable; //R.id.video
        String videoName=;
        boolean isplaying=flase;
        boolean ispuase=false;
        int lastDuration=0;



        //Constructors

        gettter and setter  here.!

        }
    ///////////////////
    Class AdapterClasss{
     int lastpostion=-1;
    VideoView videoView ;

     public MyViewHolder(View view) {
                super(view);

    videoView =(VideoView)view.findViewById(R.id.videoView1);  
    playBtn=(Button)view.findViewById(R.id.playBtn);
    pauseBtn=(Button)view.findViewById(R.id.pauseBtn);
    }
         @Override
            public void onBindViewHolder(final MyViewHolder holder, final int position) {

                final Video videoObj= videoList.get(position);
    /Creating MediaController 

    holder.playBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

            MediaController mediaController= new MediaController(this);  
                mediaController.setAnchorView(holder.videoView);  

         //specify the location of media file  
               Uri uri=Uri.parse(Environment.getExternalStorageDirectory().getPath()+
    "/media/"+videoObj.getvideoName()+".mp4");          


                  //Setting MediaController and URI, then starting the videoView  
               videoView.setMediaController(mediaController);  
               videoView.setVideoURI(uri);          
               videoView.requestFocus();  
   lastpostion=position;

     if(videoObj.getisPuase())
    {
    //now here you have to set your duration fro where you want to start your video 


if(videoView.ispause())
{
               videoView.start();  
            videoObj.setisPlaying(true);
 notifyItemChanged(position);
}

    }else if(videoObj.getisPlaying()!=true)
        {
      videoView.start();  
            videoObj.setisPlaying(true);
 notifyItemChanged(position);

}

    }


    holder.pauseBtn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {


       int duration = videoView.getDuration();
        videoView.pause();
        lastDuration.setLastDuration(duration);
        videoObj.setisPlaying(false);
         videoObj.setisPlaying(true);


    }



    }