Android视频播放之ViewPager+VideoView

这篇博客详细介绍了如何在Android项目中使用ViewPager与VideoView实现多个页面视频播放的功能。作者提供了源码下载地址,并逐步解析了实现过程,包括初始化数据、设置监听器、适配器实现、页面滑动时的视频状态处理、activity生命周期的管理以及VideoView的监听器设置。源码中包含了自定义的WrapVideoView类和主界面MainActivity的实现。
摘要由CSDN通过智能技术生成

由于项目需求,项目主页面有很多个page页面,每个page页面中都有一个VideoView用于播放视频,写次demo用来练手。

源码下载地址

1、上效果图:
这里写图片描述

由于4个page页面的内容一样,所以看起来不好区分,但是功能还是实现了,将就着吧。

2、分析代码:
定义MainActivity.java内部的全局变量:

    ViewPager mViewPager;
    MyPagerAdapter mAdapter;

    /*** 本地视频路径 ***/
    String path = Environment.getExternalStorageDirectory().getPath()
            + "/Test.mp4";

    // /*** 网络视频路径 ***/
    // String path =
    // "http://";

    /*** 视频路径集合 ***/
    String[] paths = new String[] { path, path, path, path };

    /*** viewpager的根视图数据集合 ***/
    List<ViewGroup> mViewList;

    /*** 当前页面索引 ***/
    int currentItem = 0;

    /*** 上一个页面索引 ***/
    int lastItem = 0;

    /*** 页面的视频控件集合 ***/
    static List<VideoView> mVideoViewList;

    /*** 页面播放进度控制器集合 ***/
    static List<MediaController> mMediaControllerList;

    /*** 页面视频缓冲图集合 ***/
    static List<View> mCacheViewList;

    /*** 记录每个page页面视频播放的进度 ***/
    static Map<Integer, Integer> mCurrentPositions;

    /*** 记录每个page页面的视频播放状态 ***/
    static Map<Integer, Boolean> mIsPlaying;

    // static Map<Integer, Boolean> mIsPageFirstAvaliable;// 记录每个page页面是否第一次加载

然后在oncreate方法中初始化数据:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mViewPager = (ViewPager) this.findViewById(R.id.mViewPager);
        initializeData();
        Log.e(Tag, "onCreate-------->");
    }

initializeData()方法如下:

private void initializeData() {
        mViewList = new ArrayList<ViewGroup>();
        mVideoViewList = new ArrayList<VideoView>();
        mMediaControllerList = new ArrayList<MediaController>();
        mCacheViewList = new ArrayList<View>();

        mCurrentPositions = new HashMap<Integer, Integer>();
        mIsPlaying = new HashMap<Integer, Boolean>();
        // mIsPageFirstAvaliable = new HashMap<Integer, Boolean>();

        for (int i = 0; i < paths.length; i++) {
            ViewGroup v = (ViewGroup) View.inflate(this, R.layout.page_layout,
                    null);
            VideoView vv = (VideoView) v.findViewById(R.id.mVideoView);
            View mView = (View) v.findViewById(R.id.mView);

            MediaController mpc = new MediaController(this);
            vv.setVideoPath(paths[i]);// 本地视频
            // vv.setVideoURI(Uri.parse(path));// 网络视频
            vv.setMediaController(mpc);
            setListener(vv);
            mViewList.add(v);
            mVideoViewList.add(vv);
            mMediaControllerList.add(mpc);
            mCacheViewList.add(mView);
            mCurrentPositions.put(i, 0);// 每个页面的初始播放进度为0
            mIsPlaying.put(i, true);// 每个页面的初始播放状态false
            // mIsPageFirstAvaliable.put(i, true);// 每个页面默认第一次
        }
        mAdapter = new MyPagerAdapter(this, mViewList);
        mViewPager.setAdapter(mAdapter);
        mViewPager.setOnPageChangeListener(this);

        if (mVideoViewList.get(0) != null) {
            mVideoViewList.get(0).start();
            mIsPlaying.put(0, true);
            // mIsPageFirstAvaliable.put(0, false);
        }
    }

setlistener方法:

private void setListener(VideoView vv) {
        vv.setOnInfoListener(this);
        vv.setOnCompletionListener(this);
        vv.setOnErrorListener(this);
        vv.setOnPreparedListener(this);
    }

viewpager的适配器MyPagerAdapter :

class MyPagerAdapter extends android.support.v4.view.PagerAdapter {
   

        Context context;
        List<ViewGroup> mViewList;

        public MyPagerAdapter(Context context, List<ViewGroup> list) {
            this.context = context;
            this.mViewList = list;
        }

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return mViewList != null ? mViewList.size() : 0;
        }

        @Override
        public 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值