先看效果图
注意:主要技术点利用IjkVideoView+IjkVideoView实现
用到的依赖库有
一、依赖
// # 必选,可兼容市面上绝大部分设备implementation 'com.github.dueeeke.dkplayer:dkplayer-java:2.5.4'implementation 'com.github.dueeeke.dkplayer:dkplayer-armv7a:2.5.4'// # 可选,用于兼容一些其他的 CPU 架构implementation 'com.github.dueeeke.dkplayer:dkplayer-armv5:2.5.4'implementation 'com.github.dueeeke.dkplayer:dkplayer-arm64:2.5.4'implementation 'com.github.dueeeke.dkplayer:dkplayer-x86:2.5.4'implementation 'com.github.dueeeke.dkplayer:dkplayer-x86_64:2.5.4'// # 可选,里面包含 StandardVideoController 的实现implementation 'com.github.dueeeke.dkplayer:dkplayer-ui:2.5.4'
二、
public interface OnViewPagerListener {/*** 初始化*/void onInitComplete(View view);/*** 释放*/void onPageRelease(boolean isNext, int position, View view);/*** 选中*/void onPageSelected(int position, boolean isBottom, View view);
}
三、PagerLayoutManager.java
public class PagerLayoutManager extends LinearLayoutManager {private PagerSnapHelper mPagerSnapHelper;private OnViewPagerListener mOnViewPagerListener;private RecyclerView mRecyclerView;private int mDrift;//位移,用来判断移动方向public PagerLayoutManager(Context context, int orientation) {super(context, orientation, false);init();}public PagerLayoutManager(Context context, int orientation, boolean reverseLayout) {super(context, orientation, reverseLayout);init();}private void init() {mPagerSnapHelper = new PagerSnapHelper();}@Overridepublic void onAttachedToWindow(RecyclerView view) {AttachedToWindow(view);mPagerSnapHelper.attachToRecyclerView(view);this.mRecyclerView = view;mRecyclerView.addOnChildAttachStateChangeListener(mChildAttachStateChangeListener);}@Overridepublic void onLayoutChildren(RecyclerView.Recycler recycler, RecyclerView.State state) {LayoutChildren(recycler, state);}/*** 滑动状态的改变* 缓慢拖拽-> SCROLL_STATE_DRAGGING* 快速滚动-> SCROLL_STATE_SETTLING* 空闲状态-> SCROLL_STATE_IDLE** @param state*/@Overridepublic void onScrollStateChanged(int state) {switch (state) {case RecyclerView.SCROLL_STATE_IDLE:View viewIdle = mPagerSnapHelper.findSnapView(this);if (viewIdle != null) {int positionIdle = getPosition(viewIdle);if (mOnViewPagerListener != null && getChildCount() == 1) {PageSelected(positionIdle, positionIdle == getItemCount() - 1, viewIdle);}}break;case RecyclerView.SCROLL_STATE_DRAGGING:View viewDrag = mPagerSnapHelper.findSnapView(this);if (viewDrag != null) {int positionDrag = getPosition(viewDrag);}break;case RecyclerView.SCROLL_STATE_SETTLING:View viewSettling = mPagerSnapHelper.findSnapView(this);if (viewSettling != null) {int positionSettling = getPosition(viewSettling);}break;}}
四、创建模拟数据及Bean
①、
DataUtils.javapublic class DataUtils {public static ArrayList<Bean> getDatas() {ArrayList<Bean> videoList = new ArrayList<>();videoList.add(new Bean(".mp4"));videoList.add(new Bean(" .mp4"));videoList.add(new Bean(" .mp4"));videoList.add(new Bean(" .mp4"));videoList.add(new Bean(" .mp4"));videoList.add(new Bean(" .mp4"));videoList.add(new Bean(".mp4"));videoList.add(new Bean(".mp4"));videoList.add(new Bean(".mp4"));videoList.add(new Bean(".mp4"));return videoList;}}
②、Bean.java
public class Bean {public String url;public Bean() {}public Bean(String url) {this.url = url;} }
五、适配器编写 VideoAdapter.java
public class VideoAdapter extends RecyclerView.Adapter<VideoAdapter.ViewHolder> {private Context mContext;private ArrayList<Bean> mDatas;private final PlayerConfig playerConfig;public VideoAdapter(Context context, ArrayList<Bean> datas) {mContext = context;mDatas = datas;playerConfig = new PlayerConfig.Builder().enableCache().usingSurfaceView().savingProgress().disableAudioFocus().setLooping().addToPlayerManager().build();}@NonNull@Overridepublic ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {return new ViewHolder(LayoutInflater.from(mContext).inflate(R.layout.item_layout, parent, false));}@Overridepublic void onBindViewHolder(@NonNull ViewHolder holder, int position) {holder.videoView.(position).url);holder.videoView.setPlayerConfig(playerConfig);holder.videoView.setScreenScale(IjkVideoView.SCREEN_SCALE_CENTER_CROP);}@Overridepublic int getItemCount() {return mDatas.size();}class ViewHolder extends RecyclerView.ViewHolder {public IjkVideoView videoView;public ViewHolder(View itemView) {super(itemView);videoView = itemView.findViewById(R.id.video_view);}} }
五、适配器布局文件 l如下:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"><com.dueeeke.videoplayer.player.IjkVideoViewandroid:id="@+id/video_view"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout>
六、MainActivity编写
public class MainActivity extends AppCompatActivity {private RecyclerView recyclerView;private ArrayList<Bean> mDatas = new ArrayList<>();private VideoAdapter mAdapter;private IjkVideoView mVideoView;@Overrideprotected void onCreate(Bundle savedInstanceState) {Create(savedInstanceState);setContentView(R.layout.activity_main);recyclerView = findViewById(ler_view);PagerLayoutManager mLayoutManager = new PagerLayoutManager(this, OrientationHelper.VERTICAL);mDatas.Datas());mAdapter = new VideoAdapter(this, mDatas);recyclerView.setLayoutManager(mLayoutManager);recyclerView.setAdapter(mAdapter);mLayoutManager.setOnViewPagerListener(new OnViewPagerListener() {@Overridepublic void onInitComplete(View view) {playVideo(0, view);}@Overridepublic void onPageSelected(int position, boolean isBottom, View view) {playVideo(position, view);}@Overridepublic void onPageRelease(boolean isNext, int position, View view) {int index = 0;if (isNext) {index = 0;} else {index = 1;}releaseVideo(view);}});}/*** 播放视频*/private void playVideo(int position, View view) {if (view != null) {mVideoView = view.findViewById(R.id.video_view);
//StandardVideoController standardVideoController = new StandardVideoController(this);mVideoView.setVideoController(standardVideoController);//控制器mVideoView.start();}}/*** 停止播放*/private void releaseVideo(View view) {if (view != null) {IjkVideoView videoView = view.findViewById(R.id.video_view);StandardVideoController standardVideoController = new StandardVideoController(this);videoView.setVideoController(standardVideoController);videoView.stopPlayback();}}@Overridepublic void onResume() {Resume();if (mVideoView != null) {sume();}}@Overridepublic void onPause() {Pause();if (mVideoView != null) {mVideoView.pause();}}@Overrideprotected void onDestroy() {Destroy();VideoViewManager.instance().releaseVideoPlayer();}
}
七、l布局文件
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android=""xmlns:tools=""android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".MainActivity"><android.support.v7.widget.RecyclerViewandroid:id="@+id/recycler_view"android:layout_width="match_parent"android:layout_height="match_parent" /></LinearLayout> </FrameLayout>
Dome链接;
=1001.2101.3001.9500
本文发布于:2024-02-01 17:03:06,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170677818638134.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |