2017-05-03 15 views
10

recyclerViewアダプタの画面内で画面の表示が75%のときにビデオを再生したい。だからfindFirstVisibleItemとそれらはすべてここで動作しませんでした。 (もしそうなら、私は彼らがどのように働くか分かりません)。リサイクルビューのビデオを画面上の一定の割合で一時停止する

現在、私はビデオを一時停止または再生できるようになるまで再生回数をリサイクルするのを待っていますが、これは新しい表示が生成された瞬間から始まります。私はこれを非常に長い間研究しており、どこにも手を出せませんでした。

+0

OK私はそれはあなたがビデオを一時停止し、それを再生したい行きますか。?そこから再び一時停止されます。 @ Janwilx72 –

答えて

1

RecyclerView.ItemDecorationを使用します。

リサイクラのコンテンツをレンダリングするときにItemDecorationが複数回呼び出されるため、ここでは重いものとはみなされませんが、一部のビューが表示されたときに通知することができます。

ItemDecorationは、いくつかの方法がありますが、あなたが実装する必要があるものである:

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

または多分あなたは何の違いに気付かないでしょうが、補完するために、あなたが求めている場合については

public void onDraw(Canvas c, RecyclerView parent, State state); 

あなたの行がレンダリングされる前に最初のものが呼び出され、その上にペイントできるようになり、2番目のものが呼び出されて行がレンダリングされるので、「下に」何かをペイントすることができます。

この場合、ビューのサイズを計算するだけで何もペイントする必要はありません。そのミッションのためには、レンダリングビューを取得し、ビデオでどのレンダリングビューを検出する必要があります。

@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% 
    //  } 
    // } 
    } 
} 

最初に、recyclerViewにItemDecorationを登録する必要があります。

recyclerView.addItemDecoration(theItemDecoration); 
+0

私は既にあなたに賞金を割り当てていることを知っています@ jDur、しかしあなたは計算の部分で私を助けてくださいできますか?私は画面で75%であるかどうかを表示するために使用するものを視覚化するのに苦労しています – Janwilx72

+0

@ Janwilx72私はおそらく、計算を行うためにビューの一番上を使ってみます。トッププロパティは、親を基準にしたY軸のピクセル位置を表しているので、child.getTop()は完全に表示されていない場合は負で、表示されている場合は> = 0になるはずです。 – jDur

0

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 
        } 
       }} 
+0

これで、viewHolderで渡されたビデオに特定の位置のアダプタにアクセスして、一時停止しようとします。 – Janwilx72

+0

onBindViewHolder()は、その位置の項目をチェックして、ビデオを一時停止および再生するメソッドを作成します –

3

は、あなたがしなければならないのである**Model Class**を使用しています。!

 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); 
    } 

は今 onBindViewHolder

  @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); 


    } 



    } 
関連する問題