Xbanner圆角展现轮播图
在Xbanner的基础上新添加圆角展现
xbanner地址: xiaohaibin/XBanner
展现效果如下:
展现的样式两边留白圆角展现
滑动的样式展现
假如符合你想要设置的效果那继续看后续的具体代码添加:
//圆角方法 @TargetApi(Build.VERSION_CODES.LOLLIPOP) public void setClipViewCornerRadius(View view, final int radius) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { //不支持5.0版本以下的系统 //5.0以下,值设置边距 view.setPadding(40, 0, 40, 0); return; } if (view == null) return; if (radius <= 0) { return; } view.setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) {// outline.setRoundRect(20, 20, view.getWidth()-40, view.getHeight()-40, radius); outline.setRoundRect(40, 0, view.getWidth() - 40, view.getHeight(), radius);// Rect rect = new Rect();// view.getGlobalVisibleRect(rect);// int leftMargin = 40;// int topMargin = 40;// Rect selfRect = new Rect(leftMargin, topMargin,// rect.right - rect.left - leftMargin, rect.bottom - rect.top - topMargin);// outline.setRoundRect(selfRect, 30); } }); view.setClipToOutline(true); }在instantiateItem返回view之前设置圆角
@NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, final int position) { if (getRealCount() == 0) { return null; } final int realPosition = position % getRealCount(); View view; if (mLessViews == null) { view = mViews.get(realPosition); } else { view = mLessViews.get(position % mLessViews.size()); } if (container.equals(view.getParent())) { container.removeView(view); } if (mOnItemClickListener != null && mDatas.size() != 0) { view.setOnClickListener(new OnDoubleClickListener() { @Override public void onNoDoubleClick(View v) { mOnItemClickListener.onItemClick(XbannerRoundImg.this, mDatas.get(realPosition), v, realPosition); } }); } if (null != mAdapter && mDatas.size() != 0) { mAdapter.loadBanner(XbannerRoundImg.this, mDatas.get(realPosition), view, realPosition); } ViewParent parent = view.getParent(); if (parent != null) { ((ViewGroup) parent).removeView(view); } //在返回view的时候设置圆角 setClipViewCornerRadius(view, 30); container.addView(view); return view; }其他设置完全和Xbanner一样
下面是完整的代码:
package com.stx.xhb.xbanner;import android.annotation.TargetApi;import android.content.Context;import android.content.res.TypedArray;import android.graphics.Color;import android.graphics.Outline;import android.graphics.drawable.ColorDrawable;import android.graphics.drawable.Drawable;import android.os.Build;import android.text.TextUtils;import android.util.AttributeSet;import android.util.TypedValue;import android.view.Gravity;import android.view.MotionEvent;import android.view.View;import android.view.ViewGroup;import android.view.ViewOutlineProvider;import android.view.ViewParent;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RelativeLayout;import android.widget.TextView;import androidx.annotation.Dimension;import androidx.annotation.DrawableRes;import androidx.annotation.IntDef;import androidx.annotation.LayoutRes;import androidx.annotation.NonNull;import androidx.viewpager.widget.PagerAdapter;import androidx.viewpager.widget.ViewPager;import com.stx.xhb.xbanner.entity.SimpleBannerInfo;import com.stx.xhb.xbanner.transformers.BasePageTransformer;import com.stx.xhb.xbanner.transformers.Transformer;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.ref.WeakReference;import java.util.ArrayList;import java.util.List;/** * @packageName:com.stx.xhb.xbanner * @className: XbannerRoundImg * @description:新添加设置圆角图 * @author: dingchao * @time: 2020-06-28 09:41 */public class XbannerRoundImg extends RelativeLayout implements XBannerViewPager.AutoPlayDelegate, ViewPager.OnPageChangeListener { private static final int RMP = LayoutParams.MATCH_PARENT; private static final int RWC = LayoutParams.WRAP_CONTENT; private static final int LWC = LinearLayout.LayoutParams.WRAP_CONTENT; private static final int VEL_THRESHOLD = 400; public static final int NO_PLACE_HOLDER = -1; private int mPageScrollPosition; private float mPageScrollPositionOffset; private ViewPager.OnPageChangeListener mOnPageChangeListener; private OnItemClickListener mOnItemClickListener; /** * 指示点位置 */ public static final int LEFT = 0; public static final int CENTER = 1; public static final int RIGHT = 2; /** * mViewPagerClipChildren */ private boolean mViewPagerClipChildren; @IntDef({LEFT, CENTER, RIGHT}) @Retention(RetentionPolicy.SOURCE) public @interface INDICATOR_GRAVITY { } private AutoSwitchTask mAutoSwitchTask; private LinearLayout mPointRealContainerLl; private XBannerViewPager mViewPager; /** * 指示点左右内间距 */ private int mPointLeftRightPading; /** * 指示点上下内间距 */ private int mPointTopBottomPading; /** * 指示点容器左右内间距 */ private int mPointContainerLeftRightPadding; /** * 资源集合 */ private List<?> mDatas; /** * 解决少于三页时的无限轮播 */ private List<View> mLessViews; /** * 视图集合 */ private List<View> mViews; /** * 能否只有一张图片 */ private boolean mIsOneImg = false; /** * 能否开启自动轮播 */ private boolean mIsAutoPlay = true; /** * 自动播放时间 */ private int mAutoPalyTime = 5000; /** * 能否允许客户滑动 */ private boolean mIsAllowUserScroll = true; /** * viewpager从最后一张到第一张的动画效果 */ private int mSlideScrollMode = OVER_SCROLL_ALWAYS; /** * 指示点位置 */ private int mPointPosition = CENTER; /** * 正常状态下的指示点 */ private @DrawableRes int mPointNoraml; /** * 选中状态下的指示点 */ private @DrawableRes int mPointSelected; /** * 指示容器背景 */ private Drawable mPointContainerBackgroundDrawable; /** * 指示容器布局规则 */ private LayoutParams mPointRealContainerLp; /** * 提醒语 */ private TextView mTipTv; /** * 提醒语字体颜色 */ private int mTipTextColor; /** * 指示点能否可见 */ private boolean mPointsIsVisible = true; /** * 提醒语字体大小 */ private int mTipTextSize; /** * 能否展现提醒语 */ private boolean mIsShowTips; /** * 提醒文案数据 */ private List<String> mTipData; /** * 指示器容器位置 */ public static final int TOP = 10; public static final int BOTTOM = 12; @IntDef({TOP, BOTTOM}) @Retention(RetentionPolicy.SOURCE) public @interface INDICATOR_POSITION { } private int mPointContainerPosition = BOTTOM; private XBannerAdapter mAdapter; /*指示器容器*/ private LayoutParams mPointContainerLp; /*能否是数字指示器*/ private boolean mIsNumberIndicator = false; private TextView mNumberIndicatorTv; /*数字指示器背景*/ private Drawable mNumberIndicatorBackground; /*只有一张图片时能否显示指示点*/ private boolean mIsShowIndicatorOnlyOne = false; /*默认图片切换速度为1s*/ private int mPageChangeDuration = 1000; /*能否支持提醒文字跑马灯效果*/ private boolean mIsTipsMarquee = false; /*能否是第一次不可见*/ private boolean mIsFirstInvisible = true; /*非自动轮播状态下能否可以循环切换*/ private boolean mIsHandLoop = false; private Transformer mTransformer; /*轮播框架占位图资源Id*/ private int mPlaceholderDrawableResId = -1; private ImageView mPlaceholderImg; /*能否开启一屏显示多个模式*/ private boolean mIsClipChildrenMode; /*一屏显示多个模式左右间距*/ private int mClipChildrenLeftRightMargin; /*一屏显示多个模式上下间距*/ private int mClipChildrenTopBottomMargin; /*viewpager之间的间距*/ private int mViewPagerMargin; /*少于三张能否支持一屏多显模式*/ private boolean mIsClipChildrenModeLessThree; /** * XBanner图片轮播区域底部Margin */ public int mBannerBottomMargin = 0; /** * 请使用 {@link #loadImage} 替换 * * @param mAdapter */ @Deprecated public void setmAdapter(XBannerAdapter mAdapter) { this.mAdapter = mAdapter; } public void loadImage(XBannerAdapter mAdapter) { this.mAdapter = mAdapter; } public XbannerRoundImg(Context context) { this(context, null); } public XbannerRoundImg(Context context, AttributeSet attrs) { this(context, attrs, 0); } public XbannerRoundImg(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context); initCustomAttrs(context, attrs); initView(); } private void init(Context context) { mAutoSwitchTask = new AutoSwitchTask(this); mPointLeftRightPading = XBannerUtils.dp2px(context, 3); mPointTopBottomPading = XBannerUtils.dp2px(context, 6); mPointContainerLeftRightPadding = XBannerUtils.dp2px(context, 10); mClipChildrenLeftRightMargin = XBannerUtils.dp2px(context, 30); mClipChildrenTopBottomMargin = XBannerUtils.dp2px(context, 10); mViewPagerMargin = XBannerUtils.dp2px(context, 10); mTipTextSize = XBannerUtils.sp2px(context, 10); mTransformer = Transformer.Default; /*设置默认提醒语字体颜色*/ mTipTextColor = Color.WHITE; /*设置指示器背景*/ mPointContainerBackgroundDrawable = new ColorDrawable(Color.parseColor("#44aaaaaa")); } private void initCustomAttrs(Context context, AttributeSet attrs) { TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.XBanner); if (typedArray != null) { mIsAutoPlay = typedArray.getBoolean(R.styleable.XBanner_isAutoPlay, true); mIsHandLoop = typedArray.getBoolean(R.styleable.XBanner_isHandLoop, false); mIsTipsMarquee = typedArray.getBoolean(R.styleable.XBanner_isTipsMarquee, false); mAutoPalyTime = typedArray.getInteger(R.styleable.XBanner_AutoPlayTime, 5000); mPointsIsVisible = typedArray.getBoolean(R.styleable.XBanner_pointsVisibility, true); mPointPosition = typedArray.getInt(R.styleable.XBanner_pointsPosition, CENTER); mPointContainerLeftRightPadding = typedArray.getDimensionPixelSize(R.styleable.XBanner_pointContainerLeftRightPadding, mPointContainerLeftRightPadding); mPointLeftRightPading = typedArray.getDimensionPixelSize(R.styleable.XBanner_pointLeftRightPadding, mPointLeftRightPading); mPointTopBottomPading = typedArray.getDimensionPixelSize(R.styleable.XBanner_pointTopBottomPadding, mPointTopBottomPading); mPointContainerPosition = typedArray.getInt(R.styleable.XBanner_pointContainerPosition, BOTTOM); mPointContainerBackgroundDrawable = typedArray.getDrawable(R.styleable.XBanner_pointsContainerBackground); mPointNoraml = typedArray.getResourceId(R.styleable.XBanner_pointNormal, R.drawable.shape_point_normal); mPointSelected = typedArray.getResourceId(R.styleable.XBanner_pointSelect, R.drawable.shape_point_select); mTipTextColor = typedArray.getColor(R.styleable.XBanner_tipTextColor, mTipTextColor); mTipTextSize = typedArray.getDimensionPixelSize(R.styleable.XBanner_tipTextSize, mTipTextSize); mIsNumberIndicator = typedArray.getBoolean(R.styleable.XBanner_isShowNumberIndicator, mIsNumberIndicator); mNumberIndicatorBackground = typedArray.getDrawable(R.styleable.XBanner_numberIndicatorBacgroud); mIsShowIndicatorOnlyOne = typedArray.getBoolean(R.styleable.XBanner_isShowIndicatorOnlyOne, mIsShowIndicatorOnlyOne); mPageChangeDuration = typedArray.getInt(R.styleable.XBanner_pageChangeDuration, mPageChangeDuration); mPlaceholderDrawableResId = typedArray.getResourceId(R.styleable.XBanner_placeholderDrawable, mPlaceholderDrawableResId); mIsClipChildrenMode = typedArray.getBoolean(R.styleable.XBanner_isClipChildrenMode, false); mClipChildrenLeftRightMargin = typedArray.getDimensionPixelSize(R.styleable.XBanner_clipChildrenLeftRightMargin, mClipChildrenLeftRightMargin); mClipChildrenTopBottomMargin = typedArray.getDimensionPixelSize(R.styleable.XBanner_clipChildrenTopBottomMargin, mClipChildrenTopBottomMargin); mViewPagerMargin = typedArray.getDimensionPixelSize(R.styleable.XBanner_viewpagerMargin, mViewPagerMargin); mIsClipChildrenModeLessThree = typedArray.getBoolean(R.styleable.XBanner_isClipChildrenModeLessThree, false); mIsShowTips = typedArray.getBoolean(R.styleable.XBanner_isShowTips, false); mBannerBottomMargin = typedArray.getDimensionPixelSize(R.styleable.XBanner_bannerBottomMargin, mBannerBottomMargin); mViewPagerClipChildren = typedArray.getBoolean(R.styleable.XBanner_viewPagerClipChildren, false); typedArray.recycle(); } if (mIsClipChildrenMode) { mTransformer = Transformer.Scale; } } private void initView() { /*设置指示器背景容器*/ RelativeLayout pointContainerRl = new RelativeLayout(getContext()); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { pointContainerRl.setBackground(mPointContainerBackgroundDrawable); } else { pointContainerRl.setBackgroundDrawable(mPointContainerBackgroundDrawable); } /*设置内边距*/ pointContainerRl.setPadding(mPointContainerLeftRightPadding, mPointTopBottomPading, mPointContainerLeftRightPadding, mPointTopBottomPading); /*设定指示器容器布局及位置*/ mPointContainerLp = new LayoutParams(RMP, RWC); mPointContainerLp.addRule(mPointContainerPosition); if (mIsClipChildrenMode) { mPointContainerLp.setMargins(mClipChildrenLeftRightMargin, 0, mClipChildrenLeftRightMargin, mClipChildrenTopBottomMargin); } addView(pointContainerRl, mPointContainerLp); mPointRealContainerLp = new LayoutParams(RWC, RWC); /*设置指示器容器*/ if (mIsNumberIndicator) { mNumberIndicatorTv = new TextView(getContext()); mNumberIndicatorTv.setId(R.id.xbanner_pointId); mNumberIndicatorTv.setGravity(Gravity.CENTER); mNumberIndicatorTv.setSingleLine(true); mNumberIndicatorTv.setEllipsize(TextUtils.TruncateAt.END); mNumberIndicatorTv.setTextColor(mTipTextColor); mNumberIndicatorTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTipTextSize); mNumberIndicatorTv.setVisibility(View.INVISIBLE); if (mNumberIndicatorBackground != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { mNumberIndicatorTv.setBackground(mNumberIndicatorBackground); } else { mNumberIndicatorTv.setBackgroundDrawable(mNumberIndicatorBackground); } } pointContainerRl.addView(mNumberIndicatorTv, mPointRealContainerLp); } else { mPointRealContainerLl = new LinearLayout(getContext()); mPointRealContainerLl.setOrientation(LinearLayout.HORIZONTAL); mPointRealContainerLl.setId(R.id.xbanner_pointId); pointContainerRl.addView(mPointRealContainerLl, mPointRealContainerLp); } /*设置指示器能否可见*/ if (mPointRealContainerLl != null) { if (mPointsIsVisible) { mPointRealContainerLl.setVisibility(View.VISIBLE); } else { mPointRealContainerLl.setVisibility(View.GONE); } } /*设置提醒语*/ LayoutParams pointLp = new LayoutParams(RMP, RWC); pointLp.addRule(CENTER_VERTICAL); if (mIsShowTips) { mTipTv = new TextView(getContext()); mTipTv.setGravity(Gravity.CENTER_VERTICAL); mTipTv.setSingleLine(true); if (mIsTipsMarquee) { mTipTv.setEllipsize(TextUtils.TruncateAt.MARQUEE); mTipTv.setMarqueeRepeatLimit(3); mTipTv.setSelected(true); } else { mTipTv.setEllipsize(TextUtils.TruncateAt.END); } mTipTv.setTextColor(mTipTextColor); mTipTv.setTextSize(TypedValue.COMPLEX_UNIT_PX, mTipTextSize); pointContainerRl.addView(mTipTv, pointLp); } /*设置指示器布局位置*/ if (CENTER == mPointPosition) { mPointRealContainerLp.addRule(RelativeLayout.CENTER_HORIZONTAL); pointLp.addRule(RelativeLayout.LEFT_OF, R.id.xbanner_pointId); } else if (LEFT == mPointPosition) { mPointRealContainerLp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); mTipTv.setGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT); pointLp.addRule(RelativeLayout.RIGHT_OF, R.id.xbanner_pointId); } else if (RIGHT == mPointPosition) { mPointRealContainerLp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); pointLp.addRule(RelativeLayout.LEFT_OF, R.id.xbanner_pointId); } setBannerPlaceholderDrawable();// setPadding(20,0,20,0); } /** * 设置图片轮播框架占位图 */ private void setBannerPlaceholderDrawable() { if (mPlaceholderDrawableResId != NO_PLACE_HOLDER && mPlaceholderImg == null) { mPlaceholderImg = new ImageView(getContext()); mPlaceholderImg.setScaleType(ImageView.ScaleType.FIT_XY); mPlaceholderImg.setImageResource(mPlaceholderDrawableResId); LayoutParams layoutParams = new LayoutParams(RMP, RMP); addView(mPlaceholderImg, layoutParams); } } /** * 移除图片轮播框架占位图 */ private void removeBannerPlaceHolderDrawable() { if (mPlaceholderImg != null && this.equals(mPlaceholderImg.getParent())) { removeView(mPlaceholderImg); mPlaceholderImg = null; } } /** * 已被{@link #setBannerData} 替换 * * @param data */ @Deprecated private void setData(@NonNull List<View> views, @NonNull List<?> data, List<String> tips) { if (mIsAutoPlay && views.size() < 3 && mLessViews == null) { mIsAutoPlay = false; } if (!mIsClipChildrenModeLessThree && views.size() < 3) { mIsClipChildrenMode = false; } this.mDatas = data; this.mTipData = tips; this.mViews = views; mIsOneImg = data.size() <= 1; initPoints(); initViewPager(); removeBannerPlaceHolderDrawable(); if (!data.isEmpty()) { removeBannerPlaceHolderDrawable(); } else { setBannerPlaceholderDrawable(); } } /** * 设置bannner数据 * 请使用 {@link #setBannerData} 替换 * * @param models */ @Deprecated public void setData(@LayoutRes int layoutResId, @NonNull List<?> models, List<String> tips) { mViews = new ArrayList<>(); if (models == null) { models = new ArrayList<>(); } for (int i = 0; i < models.size(); i++) { mViews.add(View.inflate(getContext(), layoutResId, null)); } if (mViews.isEmpty()) { mIsAutoPlay = false; mIsClipChildrenMode = false; } if (mIsAutoPlay && mViews.size() < 3 || (mIsHandLoop && mViews.size() < 3)) { mLessViews = new ArrayList<>(mViews); mLessViews.add(View.inflate(getContext(), layoutResId, null)); if (mLessViews.size() == 2) { mLessViews.add(View.inflate(getContext(), layoutResId, null)); } } setData(mViews, models, tips); } /** * 设置数据模型和文案,布局资源默认为ImageView * 请使用 {@link #setBannerData} 替换 * * @param models 每一页的数据模型集合 */ @Deprecated public void setData(@NonNull List<?> models, List<String> tips) { setData(R.layout.xbanner_item_image, models, tips); } /** * 设置bannner数据 */ private void setBannerData(@NonNull List<View> views, @NonNull List<? extends SimpleBannerInfo> data) { if (mIsAutoPlay && views.size() < 3 && mLessViews == null) { mIsAutoPlay = false; } if (!mIsClipChildrenModeLessThree && views.size() < 3) { mIsClipChildrenMode = false; } this.mDatas = data; this.mViews = views; mIsOneImg = data.size() <= 1; initPoints(); initViewPager(); removeBannerPlaceHolderDrawable(); if (!data.isEmpty()) { removeBannerPlaceHolderDrawable(); } else { setBannerPlaceholderDrawable(); } } public void setBannerData(@LayoutRes int layoutResId, @NonNull List<? extends SimpleBannerInfo> models) { mViews = new ArrayList<>(); if (models == null) { models = new ArrayList<>(); } for (int i = 0; i < models.size(); i++) { mViews.add(View.inflate(getContext(), layoutResId, null)); } if (mViews.isEmpty()) { mIsAutoPlay = false; mIsClipChildrenMode = false; } if (mIsAutoPlay && mViews.size() < 3 || (mIsHandLoop && mViews.size() < 3)) { mLessViews = new ArrayList<>(mViews); mLessViews.add(View.inflate(getContext(), layoutResId, null)); if (mLessViews.size() == 2) { mLessViews.add(View.inflate(getContext(), layoutResId, null)); } } setBannerData(mViews, models); } /** * 设置数据模型和文案,布局资源默认为ImageView * * @param models 每一页的数据模型集合 */ public void setBannerData(@NonNull List<? extends SimpleBannerInfo> models) { setBannerData(R.layout.xbanner_item_image, models); } /** * 设置指示点能否可见 * * @param isVisible */ public void setPointsIsVisible(boolean isVisible) { if (null != mPointRealContainerLl) { if (isVisible) { mPointRealContainerLl.setVisibility(View.VISIBLE); } else { mPointRealContainerLl.setVisibility(View.GONE); } } } /** * 对应三个位置 CENTER,RIGHT,LEFT * * @param position */ public void setPointPosition(@INDICATOR_GRAVITY int position) { //设置指示器布局位置 if (CENTER == position) { mPointRealContainerLp.addRule(RelativeLayout.CENTER_HORIZONTAL); } else if (LEFT == position) { mPointRealContainerLp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); } else if (RIGHT == position) { mPointRealContainerLp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); } } /** * 设置指示器容器的位置 TOP,BOTTOM * * @param position */ public void setPointContainerPosition(@INDICATOR_POSITION int position) { if (BOTTOM == position) { mPointContainerLp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM); } else if (TOP == position) { mPointContainerLp.addRule(RelativeLayout.ALIGN_PARENT_TOP); } } /** * 初始化ViewPager */ private void initViewPager() { if (mViewPager != null && this.equals(mViewPager.getParent())) { removeView(mViewPager); mViewPager = null; } mViewPager = new XBannerViewPager(getContext()); mViewPager.setAdapter(new XBannerPageAdapter()); mViewPager.addOnPageChangeListener(this); mViewPager.setOverScrollMode(mSlideScrollMode); mViewPager.setIsAllowUserScroll(mIsAllowUserScroll); mViewPager.setPageTransformer(true, BasePageTransformer.getPageTransformer(mTransformer)); setPageChangeDuration(mPageChangeDuration); LayoutParams layoutParams = new LayoutParams(RMP, RMP); layoutParams.setMargins(0, 0, 0, mBannerBottomMargin); if (mIsClipChildrenMode) { /*fix 网络图片只有3张或者加载本地资源图片的bug*/// Object data = mDatas.get(0);// if (data instanceof SimpleBannerInfo) {// if (!(((SimpleBannerInfo) data).getXBannerUrl() instanceof Integer) && mDatas.size() > 4) {// mViewPager.setOffscreenPageLimit(3);// }// } else {// if (!(data instanceof Integer) && mDatas.size() > 4) {// mViewPager.setOffscreenPageLimit(3);// }// } mViewPager.setPageMargin(mViewPagerMargin); mViewPager.setClipChildren(mViewPagerClipChildren); this.setClipChildren(false); layoutParams.setMargins(mClipChildrenLeftRightMargin, mClipChildrenTopBottomMargin, mClipChildrenLeftRightMargin, mClipChildrenTopBottomMargin + mBannerBottomMargin); } addView(mViewPager, 0, layoutParams); /*当图片多于1张时开始轮播*/ if (!mIsOneImg && mIsAutoPlay && getRealCount() != 0) { mViewPager.setAutoPlayDelegate(this); int zeroItem = Integer.MAX_VALUE / 2 - (Integer.MAX_VALUE / 2) % getRealCount(); mViewPager.setCurrentItem(zeroItem, false); startAutoPlay(); } else { if (mIsHandLoop && getRealCount() != 0) { int zeroItem = Integer.MAX_VALUE / 2 - (Integer.MAX_VALUE / 2) % getRealCount(); mViewPager.setCurrentItem(zeroItem, false); } switchToPoint(0); } } /** * 获取广告页面数量 * * @return */ public int getRealCount() { return mDatas == null ? 0 : mDatas.size(); } public XBannerViewPager getViewPager() { return mViewPager; } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { mPageScrollPosition = position; mPageScrollPositionOffset = positionOffset; if (mTipTv != null && mDatas != null && mDatas.size() != 0 && mDatas.get(0) instanceof SimpleBannerInfo) { if (positionOffset > 0.5) { mTipTv.setText(((SimpleBannerInfo) mDatas.get((position + 1) % mDatas.size())).getXBannerTitle()); mTipTv.setAlpha(positionOffset); } else { mTipTv.setText(((SimpleBannerInfo) mDatas.get(position % mDatas.size())).getXBannerTitle()); mTipTv.setAlpha(1 - positionOffset); } } else if (mTipTv != null && mTipData != null && !mTipData.isEmpty()) { if (positionOffset > 0.5) { mTipTv.setText(mTipData.get((position + 1) % mTipData.size())); mTipTv.setAlpha(positionOffset); } else { mTipTv.setText(mTipData.get(position % mTipData.size())); mTipTv.setAlpha(1 - positionOffset); } } if (null != mOnPageChangeListener && getRealCount() != 0) { mOnPageChangeListener.onPageScrolled(position % getRealCount(), positionOffset, positionOffsetPixels); } } @Override public void onPageSelected(int position) { if (getRealCount() == 0) { return; } position = position % getRealCount(); switchToPoint(position); if (mOnPageChangeListener != null) { mOnPageChangeListener.onPageSelected(position); } } @Override public void onPageScrollStateChanged(int state) { if (mOnPageChangeListener != null) { mOnPageChangeListener.onPageScrollStateChanged(state); } } @Override public void handleAutoPlayActionUpOrCancel(float xVelocity) { assert mViewPager != null; if (mPageScrollPosition < mViewPager.getCurrentItem()) { // 往右滑 if (xVelocity > VEL_THRESHOLD || (mPageScrollPositionOffset < 0.7f && xVelocity > -VEL_THRESHOLD)) { mViewPager.setBannerCurrentItemInternal(mPageScrollPosition, true); } else { mViewPager.setBannerCurrentItemInternal(mPageScrollPosition + 1, true); } } else { // 往左滑 if (xVelocity < -VEL_THRESHOLD || (mPageScrollPositionOffset > 0.3f && xVelocity < VEL_THRESHOLD)) { mViewPager.setBannerCurrentItemInternal(mPageScrollPosition + 1, true); } else { mViewPager.setBannerCurrentItemInternal(mPageScrollPosition, true); } } } private class XBannerPageAdapter extends PagerAdapter { @Override public int getCount() { /*当只有一张图片时返回1*/ if (mIsOneImg) { return 1; } return mIsAutoPlay ? Integer.MAX_VALUE : (mIsHandLoop ? Integer.MAX_VALUE : getRealCount()); } @Override public boolean isViewFromObject(@NonNull View view, @NonNull Object object) { return view == object; } @NonNull @Override public Object instantiateItem(@NonNull ViewGroup container, final int position) { if (getRealCount() == 0) { return null; } final int realPosition = position % getRealCount(); View view; if (mLessViews == null) { view = mViews.get(realPosition); } else { view = mLessViews.get(position % mLessViews.size()); } if (container.equals(view.getParent())) { container.removeView(view); } if (mOnItemClickListener != null && mDatas.size() != 0) { view.setOnClickListener(new OnDoubleClickListener() { @Override public void onNoDoubleClick(View v) { mOnItemClickListener.onItemClick(XbannerRoundImg.this, mDatas.get(realPosition), v, realPosition); } }); } if (null != mAdapter && mDatas.size() != 0) { mAdapter.loadBanner(XbannerRoundImg.this, mDatas.get(realPosition), view, realPosition); } ViewParent parent = view.getParent(); if (parent != null) { ((ViewGroup) parent).removeView(view); } //在返回view的时候设置圆角 setClipViewCornerRadius(view, 30); container.addView(view); return view; } //圆角方法 @TargetApi(Build.VERSION_CODES.LOLLIPOP) public void setClipViewCornerRadius(View view, final int radius) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { //不支持5.0版本以下的系统 //5.0以下,值设置边距 view.setPadding(40, 0, 40, 0); return; } if (view == null) return; if (radius <= 0) { return; } view.setOutlineProvider(new ViewOutlineProvider() { @Override public void getOutline(View view, Outline outline) {// outline.setRoundRect(20, 20, view.getWidth()-40, view.getHeight()-40, radius); outline.setRoundRect(40, 0, view.getWidth() - 40, view.getHeight(), radius);// Rect rect = new Rect();// view.getGlobalVisibleRect(rect);// int leftMargin = 40;// int topMargin = 40;// Rect selfRect = new Rect(leftMargin, topMargin,// rect.right - rect.left - leftMargin, rect.bottom - rect.top - topMargin);// outline.setRoundRect(selfRect, 30); } }); view.setClipToOutline(true); } @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { } @Override public int getItemPosition(@NonNull Object object) { return POSITION_NONE; } } /** * 增加指示点 */ private void initPoints() { if (mPointRealContainerLl != null) { mPointRealContainerLl.removeAllViews(); //当图片多于1张时增加指示点 if (getRealCount() > 0 && (mIsShowIndicatorOnlyOne || !mIsOneImg)) { LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LWC, LWC); lp.gravity = Gravity.CENTER_VERTICAL; lp.setMargins(mPointLeftRightPading, mPointTopBottomPading, mPointLeftRightPading, mPointTopBottomPading); ImageView imageView; for (int i = 0; i < getRealCount(); i++) { imageView = new ImageView(getContext()); imageView.setLayoutParams(lp); if (mPointNoraml != 0 && mPointSelected != 0) { imageView.setImageResource(mPointNoraml); } mPointRealContainerLl.addView(imageView); } } } if (mNumberIndicatorTv != null) { if (getRealCount() > 0 && (mIsShowIndicatorOnlyOne || !mIsOneImg)) { mNumberIndicatorTv.setVisibility(View.VISIBLE); } else { mNumberIndicatorTv.setVisibility(View.GONE); } } } /** * 切换指示器 * * @param currentPoint */ private void switchToPoint(int currentPoint) { if (mPointRealContainerLl != null & mDatas != null && getRealCount() > 1) { for (int i = 0; i < mPointRealContainerLl.getChildCount(); i++) { if (i == currentPoint) { ((ImageView) mPointRealContainerLl.getChildAt(i)).setImageResource(mPointSelected); } else { ((ImageView) mPointRealContainerLl.getChildAt(i)).setImageResource(mPointNoraml); } mPointRealContainerLl.getChildAt(i).requestLayout(); } } if (mTipTv != null && mDatas != null && mDatas.size() != 0 && mDatas.get(0) instanceof SimpleBannerInfo) { mTipTv.setText(((SimpleBannerInfo) mDatas.get(currentPoint)).getXBannerTitle()); } else if (mTipTv != null && mTipData != null && !mTipData.isEmpty()) { mTipTv.setText(mTipData.get(currentPoint)); } if (mNumberIndicatorTv != null && mViews != null && (mIsShowIndicatorOnlyOne || !mIsOneImg)) { mNumberIndicatorTv.setText(String.valueOf((currentPoint + 1) + "/" + mViews.size())); } } @Override public boolean dispatchTouchEvent(MotionEvent ev) { if (mIsAutoPlay && !mIsOneImg & mViewPager != null) { switch (ev.getAction()) { case MotionEvent.ACTION_DOWN: float touchX = ev.getRawX(); int paddingLeft = mViewPager.getLeft(); if (touchX >= paddingLeft && touchX < XBannerUtils.getScreenWidth(getContext()) - paddingLeft) { stopAutoPlay(); } break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: case MotionEvent.ACTION_OUTSIDE: startAutoPlay(); break; default: break; } } return super.dispatchTouchEvent(ev); } public void startAutoPlay() { stopAutoPlay(); if (mIsAutoPlay) { postDelayed(mAutoSwitchTask, mAutoPalyTime); } } public void stopAutoPlay() { if (mAutoSwitchTask != null) { removeCallbacks(mAutoSwitchTask); } } /** * 增加ViewPager滚动监听器 * * @param onPageChangeListener */ public void setOnPageChangeListener(ViewPager.OnPageChangeListener onPageChangeListener) { mOnPageChangeListener = onPageChangeListener; } /** * 设置图片从最后一张滚动到第一张的动画效果 * * @param slideScrollMode */ public void setSlideScrollMode(int slideScrollMode) { mSlideScrollMode = slideScrollMode; if (null != mViewPager) { mViewPager.setOverScrollMode(slideScrollMode); } } /** * 设置能否允许客户手指滑动 * * @param allowUserScrollable true表示允许跟随客户触摸滑动,false反之 */ public void setAllowUserScrollable(boolean allowUserScrollable) { mIsAllowUserScroll = allowUserScrollable; if (null != mViewPager) { mViewPager.setIsAllowUserScroll(allowUserScrollable); } } /** * 设置能否自动轮播 * * @param mAutoPlayAble */ public void setAutoPlayAble(boolean mAutoPlayAble) { this.mIsAutoPlay = mAutoPlayAble; stopAutoPlay(); if (mViewPager != null && mViewPager.getAdapter() != null) { mViewPager.getAdapter().notifyDataSetChanged(); } } /** * 设置自动轮播时间间隔 * * @param mAutoPalyTime */ public void setAutoPalyTime(int mAutoPalyTime) { this.mAutoPalyTime = mAutoPalyTime; } /** * 设置翻页动画效果 * * @param transformer */ public void setPageTransformer(Transformer transformer) { mTransformer = transformer; if (mViewPager != null) { initViewPager(); if (mLessViews == null) { XBannerUtils.resetPageTransformer(mViews); } else { XBannerUtils.resetPageTransformer(mLessViews); } } } /** * 设置viewpager间距 * * @param viewPagerMargin 单位dp */ public void setViewPagerMargin(@Dimension int viewPagerMargin) { this.mViewPagerMargin = viewPagerMargin; if (mViewPager != null) { mViewPager.setPageMargin(XBannerUtils.dp2px(getContext(), viewPagerMargin)); } } /** * 自己设置翻页动画效果 * * @param transformer */ public void setCustomPageTransformer(ViewPager.PageTransformer transformer) { if (transformer != null && mViewPager != null) { mViewPager.setPageTransformer(true, transformer); } } /** * 设置ViewPager切换速度 * * @param duration */ public void setPageChangeDuration(int duration) { if (mViewPager != null) { mViewPager.setScrollDuration(duration); } } /** * 设置非自动轮播状态下能否可以循环切换 * * @param handLoop */ public void setHandLoop(boolean handLoop) { mIsHandLoop = handLoop; } /** * 能否开启一屏多显模式 * * @param mIsClipChildrenMode */ public void setIsClipChildrenMode(boolean mIsClipChildrenMode) { this.mIsClipChildrenMode = mIsClipChildrenMode; } /** * 只有单张banner时能否展现指示器 * * @param showIndicatorOnlyOne */ public void setShowIndicatorOnlyOne(boolean showIndicatorOnlyOne) { mIsShowIndicatorOnlyOne = showIndicatorOnlyOne; } /** * 获取当前位置 * * @return */ public int getBannerCurrentItem() { if (mViewPager == null || mDatas == null || mDatas.size() == 0) { return -1; } else { return mViewPager.getCurrentItem() % getRealCount(); } } public void setViewPagerClipChildren(boolean viewPagerClipChildren) { mViewPagerClipChildren = viewPagerClipChildren; if (mViewPager != null) { mViewPager.setClipChildren(viewPagerClipChildren); } } /** * 切换到指定位置 * * @param position */ public void setBannerCurrentItem(int position) { if (mViewPager == null || mDatas == null || position > getRealCount() - 1) { return; } if (mIsAutoPlay || mIsHandLoop) { int currentItem = mViewPager.getCurrentItem(); int realCurrentItem = currentItem % getRealCount(); int offset = position - realCurrentItem; if (offset < 0) { for (int i = -1; i >= offset; i--) { mViewPager.setCurrentItem(currentItem + i, false); } } else if (offset > 0) { for (int i = 1; i <= offset; i++) { mViewPager.setCurrentItem(currentItem + i, false); } } if (mIsAutoPlay) { startAutoPlay(); } } else { mViewPager.setCurrentItem(position, false); } } @Override protected void onVisibilityChanged(@NonNull View changedView, int visibility) { super.onVisibilityChanged(changedView, visibility); if (VISIBLE == visibility) { startAutoPlay(); } else if (GONE == visibility || INVISIBLE == visibility) { onInvisibleToUser(); } } @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); onInvisibleToUser(); } @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); startAutoPlay(); } private static class AutoSwitchTask implements Runnable { private final WeakReference<XbannerRoundImg> mXBanner; private AutoSwitchTask(XbannerRoundImg mXBanner) { this.mXBanner = new WeakReference<>(mXBanner); } @Override public void run() { XbannerRoundImg banner = mXBanner.get(); if (banner != null) { if (banner.mViewPager != null) { int currentItem = banner.mViewPager.getCurrentItem() + 1; banner.mViewPager.setCurrentItem(currentItem); } banner.startAutoPlay(); } } } private void onInvisibleToUser() { stopAutoPlay(); // 解决 RecyclerView 中从对客户不可见变为可见时卡慢的问题 if (!mIsFirstInvisible && mIsAutoPlay && mViewPager != null && getRealCount() > 0 && mPageScrollPositionOffset != 0) { mViewPager.setCurrentItem(mViewPager.getCurrentItem() - 1, false); mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1, false); } mIsFirstInvisible = false; } public void setOnItemClickListener(OnItemClickListener listener) { mOnItemClickListener = listener; } public interface OnItemClickListener { void onItemClick(XbannerRoundImg banner, Object model, View view, int position); } public interface XBannerAdapter { void loadBanner(XbannerRoundImg banner, Object model, View view, int position); }}说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Xbanner圆角展现轮播图
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Xbanner圆角展现轮播图