android 视频图片轮播

最近遇到一个图片视频轮播的需求,网上看了很多都差不多。

1.需要一个viewpager 将他设置成无限循环的

2.需要一个 定时器的功能,在指定的时间去切换item

3.videoview 相关的api 以及缓存和播放功能的实现

第一个功能实现,网上很多,大都在 头尾加两个过度界面就好了

mViewPager.setOnPageChangeListener(this);
 @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

    }

    @Override
    public void onPageSelected(int position) {
        mCurrentItem = position;
        Log.i("vp", "onPageSelected,mCurrentItem=" + mCurrentItem);
   
    }

    @Override
    public void onPageScrollStateChanged(int state) {
        switch (state) {
            case SCROLL_STATE_IDLE:
                Log.i("vp", "SCROLL_STATE_IDLE,mCurrentItem=" + mCurrentItem);
                if (mCurrentItem == 0) {
                    mViewPager.setCurrentItem(count, false);
                } else if (mCurrentItem == count + 1) {
                    mViewPager.setCurrentItem(1, false);
                }
                break;
            case SCROLL_STATE_DRAGGING:
                Log.i("vp", "SCROLL_STATE_DRAGGING,mCurrentItem=" + mCurrentItem);
                if (mCurrentItem == count + 1) {
                    mViewPager.setCurrentItem(1, false);
                } else if (mCurrentItem == 0) {
                    mViewPager.setCurrentItem(count, false);
                }
                break;
            default:
            case SCROLL_STATE_SETTLING:
                break;
        }
    }

 

 public static class AutoScrollPagerAdapter extends PagerAdapter {
        private List<BannerModel> mModelList;
        private BannerLoader mBannerLoader;
        private List<View> mViewList = new ArrayList<>();

        public AutoScrollPagerAdapter(List<BannerModel> modelList, BannerLoader bannerLoader, Context context) {
            mModelList = modelList;
//头尾加两个过度元素
            if (modelList.size() > 1) {
                mModelList.add(0, modelList.get(modelList.size() - 1));
                mModelList.add(modelList.get(1));
            }
            mBannerLoader = bannerLoader;
            for (int i = 0; i < mModelList.size(); i++) {
                View view = mBannerLoader.createView(context, mModelList.get(i));
                mViewList.add(view);
            }
        }

      @Override
        public Object instantiateItem(ViewGroup container, int position) {
            View view = mViewList.get(position);
            mBannerLoader.loadContent(mModelList.get(position), view);
            container.addView(view);
            return view;
        }

        @Override
        public void destroyItem(ViewGroup container, int position, Object object) {
            container.removeView((View) object);
        }
       //。。。其他省略

    }

 大致以上实现无限循环的功能 就完成了

2.直接handler 解决

 

 

  public abstract class AutoScrollTask implements Runnable {

        @Override
        public void run() {
            setCurrent(getCurrent());
        }

        public abstract int getCurrent();

        public abstract void setCurrent(int position);
    }

定义一个task 通过handler 来实现

   public void startAutoPlay() {
        if (mAutoScrollPagerAdapter == null) {
            throw new IllegalStateException("must call set setDataList first");
        }
        if (mScrollTask != null) {
            mHandler.removeCallbacks(mScrollTask);
        } else {
            mScrollTask = new AutoScrollTask() {
                @Override
                public int getCurrent() {
                    return mCurrentItem % (count + 1) + 1;
                }

                @Override
                public void setCurrent(int position) {
                    mViewPager.setCurrentItem(position);
                    mHandler.postDelayed(mScrollTask, mAutoScrollPagerAdapter.getItemDelayTime(position));
                }
            };
        }
        mHandler.postDelayed(mScrollTask, mAutoScrollPagerAdapter.getItemDelayTime(mCurrentItem));
    }

这样第二个功能就没问题了

感觉没毛病,但是这个时候,视频的前一个页面也跟着一起黑屏了,非常不理解。

之后就是无止尽的调试,最终看到了这个东西

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/bannerContainer"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clipChildren="false"
    >

    <cn.shuijingqiu.com.autoscrollviewpager.BannerViewPager
        android:id="@+id/bannerViewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clipChildren="false"
         />

</RelativeLayout>

这个BannerViewPager 跟系统的是一样的,罪魁祸首就是 clipChildren 默认是true ,这个属性是设置 是否限制子view 在父view 的范围内,去掉之后就一切正常了。

3.视频边缓存边播放,

https://github.com/danikula/AndroidVideoCache  可以看看这个库,我没研究 卡在上面个bug 一天,拿别人的东西原样跑没问题,搬到自己写的demo里面就各种奇怪的问题。

你可以使用Android Studio中的ViewPager和FragmentPagerAdapter来实现视频图片轮播效果。 首先,你需要创建一个ViewPager和一个FragmentPagerAdapter。具体实现可以参考以下代码: ``` public class MyPagerAdapter extends FragmentPagerAdapter { private List<Fragment> fragmentList; public MyPagerAdapter(FragmentManager fm, List<Fragment> fragmentList) { super(fm); this.fragmentList = fragmentList; } @Override public Fragment getItem(int position) { return fragmentList.get(position); } @Override public int getCount() { return fragmentList.size(); } } ``` 然后,你需要创建一个Fragment来展示视频图片。具体实现可以参考以下代码: ``` public class MyFragment extends Fragment { private int resId; public MyFragment(int resId) { this.resId = resId; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_my, container, false); ImageView imageView = view.findViewById(R.id.image_view); VideoView videoView = view.findViewById(R.id.video_view); if (resId == R.drawable.image1 || resId == R.drawable.image2 || resId == R.drawable.image3) { imageView.setVisibility(View.VISIBLE); videoView.setVisibility(View.GONE); imageView.setImageResource(resId); } else { imageView.setVisibility(View.GONE); videoView.setVisibility(View.VISIBLE); videoView.setVideoURI(Uri.parse("android.resource://" + getActivity().getPackageName() + "/" + resId)); videoView.start(); } return view; } } ``` 最后,你需要在Activity中初始化ViewPager并设置Adapter。具体实现可以参考以下代码: ``` List<Fragment> fragmentList = new ArrayList<>(); fragmentList.add(new MyFragment(R.drawable.image1)); fragmentList.add(new MyFragment(R.drawable.video1)); fragmentList.add(new MyFragment(R.drawable.image2)); fragmentList.add(new MyFragment(R.drawable.video2)); fragmentList.add(new MyFragment(R.drawable.image3)); ViewPager viewPager = findViewById(R.id.view_pager); MyPagerAdapter adapter = new MyPagerAdapter(getSupportFragmentManager(), fragmentList); viewPager.setAdapter(adapter); viewPager.setOffscreenPageLimit(fragmentList.size()); ``` 这样,你就可以实现视频图片轮播效果了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值