展示效果如下:
展示的样式两边留白圆角展示
滑动的样式展示
如果符合你想要设置的效果那继续看后续的具体代码增加:
//圆角方法
@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 mLessViews;
/**
* 视图集合
*/
private List 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 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;