短视频直播源码,自定义图片或视频的循环播放
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;
}}
以上就是 短视频直播源码,自定义图片或视频的循环播放,更多内容欢迎关注之后的文章