用viewpager实现图片与视频混轮播

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xiaoshuxgh/article/details/80253415

主要参考https://blog.csdn.net/chengxu_hou/article/details/78144607

不同之处在于我用的 JCVideoPlayer播放视频,参考的博主用的是VideoView播放视频的,主要逻辑与思路,参考上篇博客博主。

代码其实不难理解:禁用了ViewPager的预加载模式,重写了一下viewPager,利用Handler与ViewPager实现轮播,Timer定时,Handler实现更新UI。

下面直接上代码:

public class TestActivity extends BaseActivity {
    private static final int UPTATE_VIEWPAGER = 0;
    public ViewPagers mViewPager;
    private List<BannerModel> list;
    private BannerViewAdapter mAdapter;
    private int autoCurrIndex = 0;//设置当前 第几个图片 被选中
    private Timer timer;
    private TimerTask timerTask;
    private long period = 5000;//轮播图展示时长,默认5
    //定时轮播图片,需要在主线程里面修改 UI
    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case UPTATE_VIEWPAGER:
                    if (msg.arg1 != 0) {
                        mViewPager.setCurrentItem(msg.arg1);
                    } else {
                        //false 当从末页调到首页时,不显示翻页动画效果,
                        mViewPager.setCurrentItem(msg.arg1, false);
                    }
                    break;
            }
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        ButterKnife.bind(this);
        mViewPager = findViewById(R.id.viewPager);
        initData();
    }

    /**
     * 广告轮播图测试数据
     */
    public void initData() {
        list = new ArrayList<>();
        for (int i = 0; i < 6; i++) {
            BannerModel listBean = new BannerModel();
            if (i == 1 || i == 3 || i== 5) {
                listBean.setBannerName("动画片");
//                listBean.setBannerUrl("http://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4");
                listBean.setBannerUrl("http://vodfile1.0086org.com/UF/vod/201805/1116/9814/3222510/ios/1805071131507290.mp4");
                listBean.setPlayTime(27000);
                listBean.setUrlType(1);//图片类型 视频
                list.add(listBean);
            }else{
                listBean.setBannerName("广告");
                listBean.setBannerUrl("http://pic11.nipic.com/20101201/4452735_182232064453_2.jpg");
                listBean.setPlayTime(2000);
                listBean.setUrlType(0);//图片类型 图片
                list.add(listBean);
            }
        }

        period = list.get(0).getPlayTime();
        autoBanner();

    }

    private void autoBanner(){
        mViewPager.setOffscreenPageLimit(0);
        mAdapter = new BannerViewAdapter(this,list);
        mViewPager.setAdapter(mAdapter);
        mViewPager.setOnPageChangeListener(new ViewPagers.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                autoCurrIndex = position;//动态设定轮播图每一页的停留时间
                period = list.get(position).getPlayTime();
                if (timer != null) {//每次改变都需要重新创建定时器
                    timer.cancel();
                    timer = null;
                    timer = new Timer();
                    if (timerTask != null) {
                        timerTask.cancel();
                        timerTask = null;
                        createTimerTask();
                    }
                    timer.schedule(timerTask, period, period);
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });


        createTimerTask();//创建定时器

        timer = new Timer();
        timer.schedule(timerTask, 5000, period);

    }


    public void createTimerTask(){
        timerTask = new TimerTask() {
            @Override
            public void run() {
                Message message = new Message();
                message.what = UPTATE_VIEWPAGER;
                if (autoCurrIndex == list.size() - 1) {
                    autoCurrIndex = -1;
                }
                message.arg1 = autoCurrIndex + 1;
                mHandler.sendMessage(message);
            }
        };
    }

    @Override
    protected void onResume() {
        super.onResume();
    }

    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (timerTask != null) {
            timerTask.cancel();
            timerTask = null;
        }
        if (timer != null) {
            timer.cancel();
            timer = null;
        }
    }
}
public class BannerViewAdapter extends PagerAdapter {

    private Context context;
    private List<BannerModel> listBean;

    public BannerViewAdapter(Activity context, List<BannerModel> list) {
//        this.context = context.getApplicationContext();
        this.context = context;
        if (list == null || list.size() == 0) {
            this.listBean = new ArrayList<>();
        } else {
            this.listBean = list;
        }
    }

    @Override
    public Object instantiateItem(final ViewGroup container, final int position) {
        if (listBean.get(position).getUrlType() == 0) {//图片
            final ImageView imageView = new ImageView(context);
            Glide.with(context).load(listBean.get(position).getBannerUrl())
//                    .skipMemoryCache(true)
                    .into(imageView);
            container.addView(imageView);

            return imageView;
        } else {//视频

//            final VideoView videoView = new VideoView(context);
//            videoView.setVideoURI(Uri.parse(listBean.get(position).getBannerUrl()));
//            //开始播放
//            videoView.start();
//            container.addView(videoView);

            JCVideoPlayerStandard jcVideoPlayer = new JCVideoPlayerStandard(context);
            jcVideoPlayer.setUp(listBean.get(position).getBannerUrl()
                    , JCVideoPlayerStandard.SCREEN_LAYOUT_NORMAL, "不信");

            Glide.with(context)
                    .load("http://img4.jiecaojingxuan.com/2016/11/23/00b026e7-b830-4994-bc87-38f4033806a6.jpg@!640_360")
                    .into(jcVideoPlayer.thumbImageView);
            jcVideoPlayer.prepareMediaPlayer();
            container.addView(jcVideoPlayer);
            return jcVideoPlayer;
        }

    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View) object);
    }

    @Override
    public int getCount() {
        return listBean.size();
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == (View) object;
    }
}
public class BannerModel {
    private String bannerName;
    private String bannerUrl;
    private int playTime;//播放时长
    private int urlType;//类型:0图片、1视频



    public String getBannerName() {
        return bannerName;
    }

    public void setBannerName(String bannerName) {
        this.bannerName = bannerName;
    }

    public String getBannerUrl() {
        return bannerUrl;
    }

    public void setBannerUrl(String bannerUrl) {
        this.bannerUrl = bannerUrl;
    }

    public int getPlayTime() {
        return playTime;
    }

    public void setPlayTime(int playTime) {
        this.playTime = playTime;
    }

    public int getUrlType() {
        return urlType;
    }

    public void setUrlType(int urlType) {
        this.urlType = urlType;
    }
}
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.xgh.app.activity.viewpager.ViewPagers
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        
    </com.xgh.app.activity.viewpager.ViewPagers>
</LinearLayout>

ViewPagers是重新的ViewPager,与v4包的ViewPager只有一点不一样,就是

private static final int DEFAULT_OFFSCREEN_PAGES = 0;//默认是1,这里直接改为0

v4包的ViewPager直接复制一遍,将这里改掉,extend使用即可。

好了,亲测好使。

猜你喜欢

转载自blog.csdn.net/xiaoshuxgh/article/details/80253415