<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Android使用RecyclerView實(shí)現(xiàn)抖音主界面

          共 6920字,需瀏覽 14分鐘

           ·

          2021-03-10 20:27

          效果圖?

          ?


          實(shí)現(xiàn)視頻的播放和停止播放

               /**     * 停止播放     */    private void releaseVideo(View itemView) {        final VideoView videoView = itemView.findViewById(R.id.video_view);        final ImageView imgThumb = itemView.findViewById(R.id.img_thumb);        final ImageView imgPlay = itemView.findViewById(R.id.img_play);        videoView.stopPlayback();        imgThumb.animate().alpha(1).start();        imgPlay.animate().alpha(0f).start();    }    /**     * 開始播放     */    @TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)    private void playVideo(View itemView) {        final VideoView videoView = itemView.findViewById(R.id.video_view);        final ImageView imgPlay = itemView.findViewById(R.id.img_play);        final ImageView imgThumb = itemView.findViewById(R.id.img_thumb);        final RelativeLayout rootView = itemView.findViewById(R.id.root_view);        final MediaPlayer[] mediaPlayer = new MediaPlayer[1];        videoView.start();        videoView.setOnInfoListener(new MediaPlayer.OnInfoListener() {            @Override            public boolean onInfo(MediaPlayer mp, int what, int extra) {                mediaPlayer[0] = mp;                mp.setLooping(true);                imgThumb.animate().alpha(0).setDuration(200).start();                return false;            }        });        videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {            @Override            public void onPrepared(MediaPlayer mp) {
          } });

          imgPlay.setOnClickListener(new View.OnClickListener() { boolean isPlaying = true;
          @Override public void onClick(View v) { if (videoView.isPlaying()) { imgPlay.animate().alpha(1f).start(); videoView.pause(); isPlaying = false; } else { imgPlay.animate().alpha(0f).start(); videoView.start(); isPlaying = true; } } });    }


          監(jiān)聽每個Item的移出和移進(jìn)


          自定義LinearLayoutManager,并實(shí)現(xiàn):

          RecyclerView.OnChildAttachStateChangeListener

          接口。


          OnChildAttachStateChangeListener接口源碼如下:

              public interface OnChildAttachStateChangeListener {
          /** * Called when a view is attached to the RecyclerView. * * @param view The View which is attached to the RecyclerView */ void onChildViewAttachedToWindow(@NonNull View view);
          /** * Called when a view is detached from RecyclerView. * * @param view The View which is being detached from the RecyclerView */ void onChildViewDetachedFromWindow(@NonNull View view);    }


          • onChildViewAttachedToWindow方法

            是將Item添加進(jìn)來的時候調(diào)用;


          • onChildViewDetachedFromWindow方法

            是將Item移除出去的時候調(diào)用。


          需要在onAttachedToWindow方法中調(diào)用

          addOnChildAttachStateChangeListener方法。


          scrollVerticallyBy方法中實(shí)時獲取垂直滑動的距離值;


          自定義的MyLayoutManager代碼如下:

          public class MyLayoutManager extends LinearLayoutManager implements RecyclerView.OnChildAttachStateChangeListener {
          //根據(jù)這個參數(shù)來判斷當(dāng)前是上滑 還是下滑 private int mDrift; //傳進(jìn)來的監(jiān)聽接口類 private OnViewPagerListener onViewPagerListener;
          public MyLayoutManager(Context context) { super(context); }
          public MyLayoutManager(Context context, int orientation, boolean reverseLayout) { super(context, orientation, reverseLayout); }
          /** * 當(dāng)MyLayoutManager完全放入到RecyclerView中的時候會被調(diào)用 */ @Override public void onAttachedToWindow(RecyclerView view) { view.addOnChildAttachStateChangeListener(this); super.onAttachedToWindow(view); }
          @Override public int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) { mDrift = dy; return super.scrollVerticallyBy(dy, recycler, state); }
          @Override public boolean canScrollVertically() { return true; }
          /** * 將Item添加進(jìn)來的時候 調(diào)用這個方法 */ @Override public void onChildViewAttachedToWindow(@NonNull View view) { if(mDrift >0){ //向上滑 if(onViewPagerListener !=null){ //如果是向上滑動的時候 就選中當(dāng)前itemView下一個item onViewPagerListener.onPageSelected(view); } }else{ //向下滑 if(onViewPagerListener !=null){ //如果是向上滑動的時候 就選中當(dāng)前itemView下一個item onViewPagerListener.onPageSelected(view); } } }
          /** * 將Item移除出去的時候 調(diào)用這個方法 */ @Override public void onChildViewDetachedFromWindow(@NonNull View view) { Log.e("EEEEEEEEE","22222222222222222"); if(mDrift >=0){ //向上滑 if(onViewPagerListener !=null){ onViewPagerListener.onPageRelease(view); } }else{ //向下滑 if(onViewPagerListener !=null){ onViewPagerListener.onPageRelease(view); } } }
          public void setOnViewPagerListener(OnViewPagerListener onViewPagerListener) { this.onViewPagerListener = onViewPagerListener; }}


          在Activity中初始化接口,releaseVideo方法表示停止播放視頻,playVideo方法表示開始播放視頻。

              private void initListener() {        myLayoutManager.setOnViewPagerListener(new OnViewPagerListener() {            @Override            public void onPageRelease(View itemView) {                releaseVideo(itemView);            }
          @Override public void onPageSelected(View itemView) { playVideo(itemView); } });    }


          吸低和吸頂


          使用PagerSnapHelper,如下:

           //解決吸頂或者洗低的對象    private PagerSnapHelper pagerSnapHelper;
          public MyLayoutManager(Context context, int orientation, boolean reverseLayout) { super(context, orientation, reverseLayout); pagerSnapHelper = new PagerSnapHelper(); }

          /** * 當(dāng)MyLayoutManager完全放入到RecyclerView中的時候會被調(diào)用 */ @Override public void onAttachedToWindow(RecyclerView view) { view.addOnChildAttachStateChangeListener(this); pagerSnapHelper.attachToRecyclerView(view); super.onAttachedToWindow(view);    }
            myLayoutManager = new MyLayoutManager(this, OrientationHelper.VERTICAL, false);


          解決滑動后播放問題,當(dāng)滑動停止后播放視頻

              /**     * 監(jiān)聽滑動的狀態(tài)     */    @Override    public void onScrollStateChanged(int state) {        switch (state) {            case RecyclerView.SCROLL_STATE_IDLE:                //現(xiàn)在拿到的就是當(dāng)前顯示的這個item                View snapView = pagerSnapHelper.findSnapView(this);                assert snapView != null;                if (onViewPagerListener != null) {                    onViewPagerListener.onPageSelected(snapView);                }                break;        }        super.onScrollStateChanged(state);    }


          源碼地址:

          https://github.com/345166018/AndroidUI/tree/master/HxDouYin


          到這里就完成啦.


          點(diǎn)擊這里留言交流哦


          瀏覽 86
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  五月天丁香成人 | 三级av免费电影 三级a片在线观看 | 国产一区二区精品在线 | 天天日天天操天天干青青草超碰av | 亲子伦一区二区三区观看方式 |