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

實(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() {@Overridepublic 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() {@Overridepublic void onPrepared(MediaPlayer mp) {}});imgPlay.setOnClickListener(new View.OnClickListener() {boolean isPlaying = true;@Overridepublic 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)用*/@Overridepublic void onAttachedToWindow(RecyclerView view) {view.addOnChildAttachStateChangeListener(this);super.onAttachedToWindow(view);}@Overridepublic int scrollVerticallyBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {mDrift = dy;return super.scrollVerticallyBy(dy, recycler, state);}@Overridepublic boolean canScrollVertically() {return true;}/*** 將Item添加進(jìn)來的時候 調(diào)用這個方法*/@Overridepublic void onChildViewAttachedToWindow(@NonNull View view) {if(mDrift >0){//向上滑if(onViewPagerListener !=null){//如果是向上滑動的時候 就選中當(dāng)前itemView下一個itemonViewPagerListener.onPageSelected(view);}}else{//向下滑if(onViewPagerListener !=null){//如果是向上滑動的時候 就選中當(dāng)前itemView下一個itemonViewPagerListener.onPageSelected(view);}}}/*** 將Item移除出去的時候 調(diào)用這個方法*/@Overridepublic 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() {@Overridepublic void onPageRelease(View itemView) {releaseVideo(itemView);}@Overridepublic 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)用*/@Overridepublic 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)*/@Overridepublic void onScrollStateChanged(int state) {switch (state) {case RecyclerView.SCROLL_STATE_IDLE://現(xiàn)在拿到的就是當(dāng)前顯示的這個itemView 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
到這里就完成啦.
評論
圖片
表情
