短视频直播源码,自定义图片或视频的循环播放
短视频直播源码,自定义图片或视频的循环播放
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> }} |
以上就是 短视频直播源码,自定义图片或视频的循环播放,更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现