短视频直播源码,自定义图片或视频的循环播放

短视频直播源码,自定义图片或视频的循环播放
1、自定义viewPager,目的是为了实现爱奇艺Banner样式,复写Viewpager的构造器 处理

setOnHierarchyChangeListener监听

   public class DepthPageTransformer implements ViewPager.PageTransformer {
    
    
        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        @SuppressLint("NewApi")
        public void transformPage(View view, float position) {
    
    
            if (position < -1) {
    
     // [-Infinity,-1)
                view.setScaleY(minScale);
                view.setAlpha(minAlpha);
            } else if (position <= 0) {
    
     // [-1,0]
                float scaleFactor = minScale + (1 - minScale) * (1 - Math.abs(position));
                float alphaFactor = minAlpha + (1 - minAlpha) * (1 - Math.abs(position));
                view.setScaleY(scaleFactor);
                view.setAlpha(alphaFactor);
            } else if (position <= 1) {
    
     // (0,1]
                float scaleFactor = minScale + (1 - minScale) * (1 - Math.abs(position));
                float alphaFactor = minAlpha + (1 - minAlpha) * (1 - Math.abs(position));
                view.setScaleY(scaleFactor);
                view.setAlpha(alphaFactor);
            } else {
    
     // (1,+Infinity]
                view.setScaleY(minScale);
                view.setAlpha(minAlpha);
            }
            view.setAlpha(1);
        }
    }

此处定义了minScale 和minAlpha两个参数来控制左右两边的 展示部分 ,用set方法可以设置大小(这里的大小是百分比)

2、自定义轮播需要的图片和指示器(xml就不写了,需要ViewPager和LinearLayout )。

①在attrs里面写好需要自定义的属性。(左右间距、指示器位置等…我这就打住自定义View的过程了。)

②pagerAdapter的修改

 @Override
        public Object instantiateItem(ViewGroup container, final int position) {
    
    
            if (creator == null) {
    
    
                throw new RuntimeException("[Banner] --> The layout is not specified,please set holder");
            }
            BannerViewHolder holder = creator.createViewHolder();
 
            View view = holder.createView(container.getContext());
            container.addView(view);
 
            if (mDatas != null && mDatas.size() > 0) {
    
    
                holder.onBind(container.getContext(), toRealPosition(position), mDatas.get(toRealPosition(position)));
            }
 
            //*****主要是在pagerAdapter在中,给整个控件加上条目点击事件
            if (listener != null) {
    
    
                view.setOnClickListener(new OnClickListener() {
    
    
                    @Override
                    public void onClick(View v) {
    
    
                        listener.onBannerClick(toRealPosition(position));
                    }
                });
            }
            return view;
        }

整个控件加上条目点击事件,实现点击事件。

③实现ViewPager的OnPageChangeListener 监听,其中的onPageSelected 方法主要写页面滑动的逻辑

@Override
    public void onPageSelected(int position) {
    
    
        currentItem = position;
        if (mOnPageChangeListener != null) {
    
    
            mOnPageChangeListener.onPageSelected(toRealPosition(position));
        }
        if (bannerStyle == BannerConfig.CIRCLE_INDICATOR ||
                bannerStyle == BannerConfig.CIRCLE_INDICATOR_TITLE ||
                bannerStyle == BannerConfig.CIRCLE_INDICATOR_TITLE_INSIDE ||
                bannerStyle == BannerConfig.CUSTOM_INDICATOR) {
    
    
            if (isLoop) {
    
    
                if (mIndicatorSelectedDrawable != null && mIndicatorUnselectedDrawable != null) {
    
    
                    indicatorImages.get((lastPosition - 1 + count) % count).setImageDrawable(mIndicatorUnselectedDrawable);
                    indicatorImages.get((position - 1 + count) % count).setImageDrawable(mIndicatorSelectedDrawable);
                } else {
    
    
                    indicatorImages.get((lastPosition - 1 + count) % count).setImageResource(mIndicatorUnselectedResId);
                    indicatorImages.get((position - 1 + count) % count).setImageResource(mIndicatorSelectedResId);
                }
            } else {
    
    
                if (mIndicatorSelectedDrawable != null && mIndicatorUnselectedDrawable != null) {
    
    
                    indicatorImages.get((lastPosition + count) % count).setImageDrawable(mIndicatorUnselectedDrawable);
                    indicatorImages.get((toRealPosition(position) + count) % count).setImageDrawable(mIndicatorSelectedDrawable);
                } else {
    
    
                    indicatorImages.get((lastPosition + count) % count).setImageResource(mIndicatorUnselectedResId);
                    indicatorImages.get((toRealPosition(position) + count) % count).setImageResource(mIndicatorSelectedResId);
                }
            }
            lastPosition = position;
        }}

以上就是 短视频直播源码,自定义图片或视频的循环播放,更多内容欢迎关注之后的文章

猜你喜欢

转载自blog.csdn.net/yb1314111/article/details/125202105
今日推荐