android的viewpager视频图片轮播实现

项目中有类似功能,所以先写个demo ,待优化布局性能,亲测可行!,CSDN不能发录像,懒得麻烦就不贴视频了——后面项目中用的是网易提供的播放器并把player放在对象里面在创建view时绑定,极好的解决了播放问题,另外seekbar的进度放在线程更新不好,参照网易用Handler出来更好!

public class TestActivity extends AppCompatActivity {

    TextView mNumTV;
    ViewPager mViewPager;
    VpAdapter mAdapter;
    List<View> mViewList = new ArrayList<>();
    List<BannerBean> mItemList = new ArrayList<>();
    OnPagerItemClickListener mOnItemClickListener;

    int mCurrentItem = 0;
    boolean isShowVideo = false;
    boolean isThread = false;
    MediaPlayer mediaPlayer;
    BannerBean mPlayVideoBean;
    View mView;
    SurfaceView mVideoSV;
    ImageView mSwitchIV;
    SeekBar mMiniSB;
    TextView mTotalMiniTV;

    private int WHAT_AUTO_PLAY = 1000;
    private boolean isAutoPlay = true;
    private int autoPlayDuration = 4000;

    private Handler handler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            if (msg.what == WHAT_AUTO_PLAY) {
                if (mViewPager != null) {
                    if (isAutoPlay) {
                        mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1, true);
                    }
                    handler.sendEmptyMessageDelayed(WHAT_AUTO_PLAY, autoPlayDuration);
                }
            }
            return false;
        }
    });


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
        initView();
        initData();
        initEvent();

    }


    private void initView() {
        mViewPager = findViewById(R.id.vp_activity_test);
        mNumTV = findViewById(R.id.tv_activity_test_num);
    }

    private void initData() {
        for (int i = 0; i < 6; i++) {
            BannerBean bannerBean = new BannerBean();
            bannerBean.setId("" + i);
            if (i % 2 > 0) {
                bannerBean.setType(BannerBean.TYPE_PIC);
                bannerBean.setBeanImage("https://c-ssl.duitang.com/uploads/item/201910/31/20191031112329_rqtcw.thumb.300_300_c.jpg");
            } else {
                bannerBean.setType(BannerBean.TYPE_VIDEO);
                bannerBean.setBeanImage("http://1252492711.vod2.myqcloud.com/958d2b29vodtransgzp1252492711/0b9adbaf5285890781624263761/v.f19999.mp4");
            }
            mItemList.add(bannerBean);
        }


        for (int i = 0; i < mItemList.size(); i++) {
            mViewList.add(getView(i));
        }

        mAdapter = new VpAdapter(mViewList,true) {
            @Override
            public int getItemPosition(@NonNull Object object) {
                //重新getItemPosition,使得notifyDataSetChanged有效
                return PagerAdapter.POSITION_NONE;
            }
        };
        mViewPager.setAdapter(mAdapter);
        mViewPager.setOffscreenPageLimit(mItemList.size());

        mViewPager.setCurrentItem(0);
        mediaPlayer = new MediaPlayer();
        mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
        mNumTV.setText(getString(R.string.num_total, 1, mItemList.size()));
        startAutoPlay();
    }

    private void initEvent() {
        mOnItemClickListener = new OnPagerItemClickListener() {
            @Override
            public void onItemClick(int position, View view) {

                Toast.makeText(TestActivity.this, "点击了", Toast.LENGTH_LONG).show();
                BannerBean bean = mItemList.get(position % mItemList.size());
                mView = null;
                mView = view;
                mSwitchIV = view.findViewById(R.id.iv_item_banner_video_switch);
                mTotalMiniTV = view.findViewById(R.id.tv_item_banner_video_progress_total);
                try {
                    if (mediaPlayer != null && mediaPlayer.isPlaying()
                            && mPlayVideoBean != null && mPlayVideoBean.getId().equals(bean.getId())) {
                        mediaPlayer.pause();
                        mSwitchIV.setVisibility(VISIBLE);
                        mSwitchIV.setImageResource(R.drawable.ic_new_player_pause);
                    } else if (mediaPlayer != null
                            && !mediaPlayer.isPlaying()
                            && mPlayVideoBean != null && mPlayVideoBean.getId().equals(bean.getId())) {
                        mediaPlayer.start();
                        mSwitchIV.setVisibility(GONE);
                        mSwitchIV.setImageResource(R.drawable.ice_playing);
                    } else if (mediaPlayer != null) {
                        startMediaPlayer(bean, view);
                    }
                    if (mediaPlayer != null) {
                        mTotalMiniTV.setText(mediaPlayer.getDuration());
                    }
                    mPlayVideoBean = bean;
                } catch (Exception e) {
                    e.printStackTrace();
                    Log.e("TAG", e.toString());
                }

            }

            @Override
            public void onItemTouch(int position, View view) {
                mView = null;
                mView = view;
                mSwitchIV = view.findViewById(R.id.iv_item_banner_video_switch);
                isShowVideo = !isShowVideo;
                if (mediaPlayer != null && mediaPlayer.isPlaying()) {
                    mSwitchIV.setImageResource(R.drawable.ice_playing);
                } else {
                    mSwitchIV.setImageResource(R.drawable.ic_new_player_pause);
                }
                if (isShowVideo) {
                    mSwitchIV.setVisibility(GONE);
                } else {
                    mSwitchIV.setVisibility(VISIBLE);
                }
            }

            @Override
            public void onItemChange(int position, int progress, View view) {
                BannerBean bean = mItemList.get(position % mItemList.size());
                mVideoSV = view.findViewById(R.id.vv_item_banner_video);
                mSwitchIV = view.findViewById(R.id.iv_item_banner_video_switch);
                mMiniSB = view.findViewById(R.id.sb_item_banner_video_progress);
                mTotalMiniTV = view.findViewById(R.id.tv_item_banner_video_progress_total);
                if (mediaPlayer != null) {
                    try {
                        mediaPlayer.reset();
                        // 设置播放的视频源
                        mediaPlayer.setDataSource(bean.getBeanImage());
                        // 设置显示视频的SurfaceHolder
                        mediaPlayer.setDisplay(mVideoSV.getHolder());
                        mediaPlayer.prepare();
                        mediaPlayer.seekTo(progress);
                        mediaPlayer.start();
                        mPlayVideoBean = bean;

                        mSwitchIV.setVisibility(GONE);
                        mSwitchIV.setImageResource(R.drawable.ice_playing);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }

            }
        };

        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                mCurrentItem=position % mItemList.size();
                final BannerBean bean = mItemList.get(position % mItemList.size());
                switch (bean.getType()) {
                    case BannerBean.TYPE_VIDEO:
                        Log.e("TAG", "视频类型" + position % mItemList.size());
                        if (mediaPlayer != null) {
                            View view = mViewList.get(position % mItemList.size());
                            if (mediaPlayer.isPlaying() && mPlayVideoBean != null
                                    && mPlayVideoBean.getId().equals(bean.getId())) {
                                startMediaPlayer(bean, view);
                            }
                        }
                        isAutoPlay = false;
                        break;

                    case BannerBean.TYPE_PIC:
                        if (mediaPlayer != null && mView != null) {
                            mediaPlayer.pause();
                            mSwitchIV = mView.findViewById(R.id.iv_item_banner_video_switch);
                            mSwitchIV.setVisibility(VISIBLE);
                            mSwitchIV.setImageResource(R.drawable.ic_new_player_pause);
                        }
                        isAutoPlay = true;
                        break;
                }

                mNumTV.setText(getString(R.string.num_total, position % mItemList.size() + 1, mItemList.size()));
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

    }

    /**
     * 开始自动轮播
     */
    private void startAutoPlay() {
        stopAutoPlay(); // 避免重复消息
        if (isAutoPlay) {
            handler.sendEmptyMessageDelayed(WHAT_AUTO_PLAY, autoPlayDuration);
        }
    }

    /**
     * 停止自动轮播
     */
    private void stopAutoPlay() {
        if (isAutoPlay) {
            handler.removeMessages(WHAT_AUTO_PLAY);
        }
    }

    private View getView(final int position) {
        final BannerBean bean = mItemList.get(position);
        switch (bean.getType()) {
            case BannerBean.TYPE_PIC:
                RoundedImageView imageView = new RoundedImageView(this);
                imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                imageView.setCornerRadius(0);
                imageView.mutateBackground(true);
                imageView.setTileModeX(Shader.TileMode.REPEAT);
                imageView.setTileModeY(Shader.TileMode.REPEAT);

                imageView.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {

                    }
                });


                imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                Glide.with(this).load(bean.getBeanImage()).into(imageView);
                return imageView;

            case BannerBean.TYPE_VIDEO:
                final View view = LayoutInflater.from(this).inflate(R.layout.item_banner_video, null);
                final SurfaceView mVideo = view.findViewById(R.id.vv_item_banner_video);
                final RoundedImageView mRoundedImageView = view.findViewById(R.id.iv_item_banner_video);
                final ImageView mSwitch = view.findViewById(R.id.iv_item_banner_video_switch);
                final SeekBar mMini = view.findViewById(R.id.sb_item_banner_video_progress);
                final TextView mTotalMini = view.findViewById(R.id.tv_item_banner_video_progress_total);
                mRoundedImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                mRoundedImageView.setCornerRadius(0);
                mRoundedImageView.mutateBackground(true);
                mRoundedImageView.setTileModeX(Shader.TileMode.REPEAT);
                mRoundedImageView.setTileModeY(Shader.TileMode.REPEAT);
                mRoundedImageView.setVisibility(GONE);
                mTotalMini.setText("00:00");

                mVideo.getHolder().addCallback(new SurfaceHolder.Callback() {
                    @Override
                    public void surfaceCreated(SurfaceHolder holder) {
//                            currentPosition = mediaPlayer.getCurrentPosition();
//                            mediaPlayer.stop();
                        // 设置播放的视频源
//                            try {
//                                MediaPlayer player=new MediaPlayer();
//                                player.setAudioStreamType(AudioManager.STREAM_MUSIC);
//                                player.setDataSource(bean.getBeanImage());
//                                // 设置显示视频的SurfaceHolder
//                                player.setDisplay(mVideo.getHolder());
//                                mMini.setMax(player.getDuration());
//                                mMini.setProgress(player.getCurrentPosition());
//                                player=null;
//                            } catch (IOException e) {
//                                e.printStackTrace();
//                            }
                        Canvas canvas = holder.lockCanvas();
                        Bitmap bitmap = ImageUtil.drawableToBitmap(ContextCompat.getDrawable(TestActivity.this, R.drawable.ic_default));
                        if (canvas != null) {
                            synchronized (bitmap) {
                                canvas.drawBitmap(bitmap, 0, 0, null);
                                holder.unlockCanvasAndPost(canvas);
                            }
                        }
                    }

                    @Override
                    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
                    }

                    @Override
                    public void surfaceDestroyed(SurfaceHolder holder) {

                    }
                });

                mSwitch.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                        if (mOnItemClickListener != null) {
                            mOnItemClickListener.onItemClick(position, view);
                        }
                    }
                });

                mMini.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                    @Override
                    public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
                    }

                    @Override
                    public void onStartTrackingTouch(SeekBar seekBar) {

                    }

                    @Override
                    public void onStopTrackingTouch(SeekBar seekBar) {
                        int progress = seekBar.getProgress();
                        if (mOnItemClickListener != null && mediaPlayer != null && mediaPlayer.isPlaying()) {
                            mOnItemClickListener.onItemChange(position, progress, view);
                        } else {
                            seekBar.setProgress(0);
                        }
                    }
                });

                view.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        if (mOnItemClickListener != null) {
                            mOnItemClickListener.onItemTouch(position, view);
                        }
                        return false;
                    }
                });

                mRoundedImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                Glide.with(this).load(bean.getBeanImage() + "?vframe/jpg/offset/1").into(mRoundedImageView);
                return view;
        }

        return null;
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        destoryMediaPlayer();
    }


    //启动线程的一个方法
    class MyThread extends Thread {
        @Override
        public void run() {
            super.run();
            while (mMiniSB.getProgress() <= mMiniSB.getMax() && mediaPlayer != null) {
                //获取音乐当前播放的位置
                int position = mediaPlayer.getCurrentPosition();
                mMiniSB.setProgress(position);
            }
        }
    }

    private void startMediaPlayer(BannerBean bean, View view) {
        mView = null;
        mView = view;
        mVideoSV = view.findViewById(R.id.vv_item_banner_video);
        mSwitchIV = view.findViewById(R.id.iv_item_banner_video_switch);
        try {
            if (mediaPlayer != null && mPlayVideoBean != null
                    && mPlayVideoBean.getId().equals(bean.getId())) {
                mediaPlayer.start();
                mSwitchIV.setVisibility(GONE);
                mSwitchIV.setImageResource(R.drawable.ice_playing);
            } else if (mediaPlayer != null) {
                mediaPlayer.reset();
                // 设置播放的视频源
                mediaPlayer.setDataSource(bean.getBeanImage());
                // 设置显示视频的SurfaceHolder
                mediaPlayer.setDisplay(mVideoSV.getHolder());
                mediaPlayer.prepare();
                mediaPlayer.start();
                mPlayVideoBean = bean;


                mMiniSB = view.findViewById(R.id.sb_item_banner_video_progress);
                mTotalMiniTV = view.findViewById(R.id.tv_item_banner_video_progress_total);
                int duration = mediaPlayer.getDuration();
                //将进度条设置最大值为:音乐的总时长
                mMiniSB.setMax(duration);

                TimeUtil timeUtil = new TimeUtil();
                mTotalMiniTV.setText("" + timeUtil.stringForTime(duration));
                //启动线程
                new MyThread().start();
                mSwitchIV.setVisibility(GONE);
                mSwitchIV.setImageResource(R.drawable.ice_playing);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void destoryMediaPlayer() {
        try {
            if (mediaPlayer != null) {
                mediaPlayer.setOnCompletionListener(null);
                mediaPlayer.setOnPreparedListener(null);
                mediaPlayer.reset();
                mediaPlayer.release();
                mediaPlayer = null;
            }
        } catch (Exception e) {
        }
    }
}

另外还有OnPagerItemClickListener ,其他的工具类和VpAdapter 就继承的PagerAdapter 没什么内容就不贴了

public interface OnPagerItemClickListener {
    void onItemClick(int position, View view);

    void onItemTouch(int position, View view);

    void onItemChange(int position,int progress, View view);
}

你可能感兴趣的:(android)