安卓仿抖音看视频

阅读: 评论:0

安卓仿抖音看视频

安卓仿抖音看视频

先看效果图

注意:主要技术点利用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.java

public 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 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23