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

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

1、自定义viewPager,目的是为了实现爱奇艺Banner样式,复写Viewpager的构造器 处理setOnHierarchyChangeListener监听

 

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

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

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

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

②pagerAdapter的修改

 

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

 

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

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

 

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

 

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

 

posted @   云豹科技-苏凌霄  阅读(583)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示