SlideShowView
github:turemi/SlideShow 自动轮播图控件,自动添加小圆点指示器,标题栏展示,修改滚动速度以及添加动画插值器.
使用:
- 添加依赖
1.项目gradle添加一下配置:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
2.module中的gradle添加依赖:
dependencies {
implementation 'com.github.truemi:SlideShow:1.0'
}
- xml中添加view:
<com.truemi.slideshow.SlideShowView
android:id="@+id/slide_show"
android:layout_width="match_parent"
android:layout_height="200dp"
app:mDotRaduis="8px"//小圆点半径
app:mDotNormalColor="#999999"//小圆点默认颜色
app:mDotSelectColor="#FF0000"//小圆点选中的颜色
app:mDotlocation="bottom_right"//小圆点显示的位置
app:mAutoStandTime="5000"//每个界面停留的时间间隔
app:mBottomTextView="true"//是否显示底部标题栏
app:mDotNavigation="true"//是否显示小圆点
app:mTextColor="#FFF"//标题栏文字颜色
app:mTextSize="12sp"//标题栏文字大小
app:mTextBgColor ="#44000000"//标题栏背景颜色
app:mBottomTextViewHeight="40dp">//标题栏高度
</com.truemi.slideshow.SlideShowView>
- activity中设置数据:
//图片集合
ArrayList<String> urlLists = new ArrayList<>();
urlLists.add("https://img03.sogoucdn.com/app/a/100520024/c25c07885f822d67c91256b3033749e7");
urlLists.add("https://img04.sogoucdn.com/app/a/100520024/ee6b8a48e6322e18a85a62ddcb01f432");
urlLists.add("https://img01.sogoucdn.com/app/a/100520024/ebb532d5da0e26e285ac2dc025bc99ec");
urlLists.add("https://img01.sogoucdn.com/app/a/100520024/83922cd9e4aaf9b4c012f08629a5e160");
//标题栏文字集合
String titles[] ={" 足球 ","设计 时尚"," 风华绝代 一代巨星张国荣","发现时光的痕迹"};
final SlideShowView slideShow = findViewById(R.id.slide_show);
//设置adapter,构造方法还可以传入图片资源id数组
slideShow.setAdapter(new SlideAdapter(this,urlLists,titles));
//图片点击事件
slideShow.setOnItemClickListener(new SlideShowView.OnViewPagerItemClickListener() {
@Override
public void onViewPagerItemClick(int position) {
Toast.makeText(MainActivity.this,"点击了第"+position+"张图片", Toast.LENGTH_SHORT).show();
}
});
自定义属性:
属性 | 值 | 描述 |
mDotNavigation | true/false | 是否显示小圆点(默认显示) |
mBottomTextView | true/false | 是否显示底部标题栏(默认显示) |
mDotRaduis | 2dp | 小圆点半径 |
mDotNormalColor | #999999 | 小圆点默认颜色 |
mDotSelectColor | #FF0000 | 小圆点选中的颜色(当前显示的) |
mDotlocation | bottom_center | 小圆点显示的位置(默认bottom_right) |
mDuration | 500 | 页面切换时间 |
mAutoStandTime | 5000 | 页面停留时间 |
mBottomTextViewHeight | 40dp | 标题栏高度 |
mTextSize | 12sp | 标题栏文字大小 |
mTextColor | #FFFFFF | 标题栏文字颜色 |
mTextBgColor | #44000000 | 标题栏背景颜色 |
公开方法:
- setAdapter(SlideAdapter adapter);//设置adapter
- setDuration(int mDuration, Interpolator interpolator);//设置界面切换时间和动画插值器
- setPageTransformer(boolean b, ViewPager.PageTransformer transformer);//设置切换动画
- setOnItemClickListener;//设置点击事件
- setBottomTextBg(int color);//设置标题栏背景颜色
- setBottomTextColor(int color);//设置标题栏文字颜色
- setBottomTextSize(int size);//设置标题栏文字大小
注意:
- 库中使用glide作为图片加载框架,如果你的项目中已经使用glide,直接删除你项目中的依赖即可
- 使用前请在androidManifest.xml中添加网络权限
android自定义组合控件(使用原生控件,组合成为一个整体,具有新的功能的控件)是android自定义控件的重要组成部分.适当的组合控件,可以提高开发的效率.
#####需求:
- 轮播图自动滚动
2.手势滑动与自动轮播不冲突,手指触摸时,不轮播(触摸事件的处理)
3.提供对外的点击事件监听(点击动作的识别)
4.根据轮播图得数量绘制"小红点",可以设置"小红点"的位置(代码布局),“小红点"的颜色随页面切换变化
5.极简的使用方法
#####思路:
1.轮播图使用RelativeLayout中添加ViewPager的布局形式,(使用RelativeLayout作为容器,是为了添加指示器"小红点”)
2.指示器"小红点"使用自定义View,根据传入的图片/链接的数量绘制指示器.
3.把指示器放入指定的位置
#####步骤:看代码读注释(注释比较详细)
######1.指示器"小红点"的绘制:
创建一个类,继承View,提供一个公开的方法获取小红点的数量
public DotView setDotCount(int count) {
dotCount = count;
return this;
}
提供一个公开的方法刷新小红点的状态
public DotView changePager(int pager) {
this.selectedPager = pager;//当前界面展示的图片的角标(第几张图片)
postInvalidate();//重新绘制
return this;
}
onMeasure方法中计算宽高
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
for (int i = 0; i < dotCount; i++) {
viewWidth = i * MARGING + RADUIS;
}
int viewHeight = RADUIS*2;//一个小红点的高度
setMeasuredDimension(viewWidth+RADUIS, viewHeight);//从0开始遍历,加上缺少的半径为View的宽度
}
绘制小红点
private void drawCricle(Canvas canvas) {
for (int i = 0; i < dotCount; i++) {
if (selectedPager == i) {//当前界面展示图片
paint.setColor(dotSelectColor);//设置界面指示的小红点的颜色
} else {
paint.setColor(dotNormalColor);//设置其他小红点的颜色
}
//MARGING两个圆心之间的距离,RADUIS半径
canvas.drawCircle((i) * MARGING + RADUIS, RADUIS, RADUIS, paint);//绘制
}
}
"小红点"完整代码
public class DotView extends View {
private int RADUIS;
private int MARGING;
private int dotCount;
private Paint paint;
private int dotNormalColor;
private int dotSelectColor;
private int selectedPager;
Context context;
private int viewWidth;
public DotView(Context context) {
this(context, null);
}
public DotView(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, -1);
}
public DotView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
paint = new Paint();
paint.setColor(dotNormalColor);
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
drawCricle(canvas);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
for (int i = 0; i < dotCount; i++) {
viewWidth = i * MARGING + RADUIS;
}
int viewHeight = RADUIS*2;
setMeasuredDimension(viewWidth+RADUIS, viewHeight);
}
private void drawCricle(Canvas canvas) {
for (int i = 0; i < dotCount; i++) {
if (selectedPager == i) {
paint.setColor(dotSelectColor);
} else {
paint.setColor(dotNormalColor);
}
canvas.drawCircle((i) * MARGING + RADUIS, RADUIS, RADUIS, paint);
}
}
public DotView setRaduis(int raduis) {
RADUIS = raduis;
return this;
}
public DotView setMaring(int maring) {
MARGING = maring;
return this;
}
public DotView setDotCount(int count) {
dotCount = count;
return this;
}
public DotView setdotNormalColor(int color) {
this.dotNormalColor = color;
return this;
}
public DotView setdotSelectColor(int color) {
this.dotSelectColor = color;
return this;
}
public DotView changePager(int pager) {
this.selectedPager = pager;
postInvalidate();
return this;
}
}
######2.组合控件:
创建个类SlideShowView 继承 RelativeLayout ,(ViewPager的一些公开的方法如果有需求,自己提供公开的方法即可).实现构造方法,自定义属性:
<declare-styleable name="SlideShowView">
<attr name="mDotRaduis" format="dimension"/> <!--小红点的半径-->
<attr name="mDotNormalColor" format="color"/><!--小红点指示的颜色-->
<attr name="mDotSelectColor" format="color"/><!--小红点不指示的颜色-->
<attr name="mDotlocation" format="enum"><!--小红点的位置,底部居中,底部靠左,底部靠右-->
<enum name="bottom_center" value="0" />
<enum name="bottom_left" value="-1" />
<enum name="bottom_right" value="1" />
</attr>
<!--页面切换时间-->
<attr name="mDuration" format="integer"/>
<!--自动切换界面停留时间-->
<attr name="mAutoStandTime" format="integer"/>
<attr name="mBottomTextViewHeight" format="dimension"/>
<!--是否显示底部标题栏-->
<attr name="mBottomTextView" format="boolean"/>
<attr name="mTextSize" format="dimension"/>
<attr name="mTextColor" format="color"/>
<attr name="mTextBgColor" format="color"/>
</declare-styleable>
代码中获取属性值
if (attrs != null) {
TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.MyViewPager);
RADUIS = (int) typedArray.getDimension(R.styleable.MyViewPager_mDotRaduis, 0);
MARGING = 4 * RADUIS;//获取半径设置间距
dotNormalColor = typedArray.getColor(R.styleable.MyViewPager_mDotNormalColor, 0);
dotSelectColor = typedArray.getColor(R.styleable.MyViewPager_mDotSelectColor, 0);
dotLocation = typedArray.getInt(R.styleable.MyViewPager_mDotlocation, 0);//位置
typedArray.recycle();
}
添加viewPager到RelativeLayout中
viewPager = new ViewPager(context);
LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
viewPager.setLayoutParams(layoutParams);
viewPager.setOnPageChangeListener(this);
viewPager.setOnTouchListener(this);
addView(viewPager);
通过Handler控制界面切换
private int itemPosition = 0;
private Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message message) {
mHandler.removeMessages(0);//消息清零
if (!isTouch) {//判断手指是否触摸,没有触摸自动滚动,否则不发送消息
if (itemPosition == count) {//已经是最后一个,则跳到第0个,否则跳到下一个
itemPosition = 0;
viewPager.setCurrentItem(itemPosition, false);
} else {
itemPosition++;
viewPager.setCurrentItem(itemPosition, true);
}
mHandler.sendEmptyMessageDelayed(0, 2000);//延迟两秒发送消息
}
return false;
}
});
通过viePager的监听,判断位置,绘制小红点的状态
/**
* 绘制小圆点
* @param position
*/
private void drawCricle(int position) {
if (dot != null)
removeView(dot);
dot = new PagerPointDotView2(context);//创建小红点实例
dot.setDotCount(count)//设置小红点数量
.setdotNormalColor(dotNormalColor)//默认颜色
.setdotSelectColor(dotSelectColor)//选中颜色
.setMaring(MARGING).setRaduis(RADUIS);//设置间距和半径
//设置小红点的位置
RelativeLayout.LayoutParams layoutParamsDot2 = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, RADUIS * 2);//设置宽高
layoutParamsDot2.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);//位于父布局底部
if (dotLocation == 0) {
layoutParamsDot2.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);//水平居中
layoutParamsDot2.setMargins(0, 0, 0, 20);//下边距20
} else if (dotLocation == -1) {
layoutParamsDot2.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);//父布局左对齐
layoutParamsDot2.setMargins(30, 0, 0, 20);//左边距30,下边距20
} else if (dotLocation == 1) {
layoutParamsDot2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);//父布局右对齐
layoutParamsDot2.setMargins(0, 0, 30, 20);//左边距右边距,下边距20
}
dot.changePager(position);//绘制小红点
addView(dot, layoutParamsDot2);//添加小红点的RelativeLayout中
}
点击事件处理,ViewConfiguration.get(context).getScaledEdgeSlop();获取滑动标识(使用识别是否右滑动动作的数值)
case MotionEvent.ACTION_UP:
long touchUpTime = System.currentTimeMillis();
long l = touchUpTime - touchDownTime;
//触摸移动距离小于滑动识别距离,触摸时间小于200ms确认为点击事件
if (scaledEdgeSlop > (mCurPosY - mPosY) && scaledEdgeSlop > (mCurPosX - mPosX) && l < 200) {
clickListener.onViewPagerItemClick(viewPager.getCurrentItem());
}
isTouch = false;
mHandler.sendEmptyMessageDelayed(0, 2000);
break;
完整代码如下:
public class SlideShowView extends RelativeLayout implements ViewPager.OnPageChangeListener, View.OnTouchListener {
private Context context;
private Paint paint;
private ViewPager viewPager;
private int RADUIS;//小圆点半径
private int MARGING = 50;
private int height;
private int dotNormalColor = 0xFFFFFF;
private int dotSelectColor = 0x000000;
private PageChangeListener listener;
private DotView dot;
private boolean isTouch;//是否手势触摸
private int count;//轮播图数量
private long touchDownTime;
private int scaledEdgeSlop;
private int mPosX;
private int mPosY;
private int mCurPosX;
private int mCurPosY;
private int dotLocation;//小圆点的位置(-1,0,1),分别表示左边,居中,右边
private float bottomTextSize = 12;//标题文字大小,sp
private int mTextBgColor = 0x44000000;//标题背景颜色
private int bottomTextColor = 0x00e9e9e9;//标题文字颜色
private int mDuration = 500;//滚动时间
private int mAutoStandTime = 5000;//自动滚动停留时间
private boolean haveBottomText = true;//是否显示标题栏,默认显示
private boolean mDotNavigation = true;//是否显示小圆点,默认显示
private TextView textView;//标题
private int bottomTextHeight = 20;//dp,标题栏高度
private String[] titleText;//标题String数组
private FixedSpeedScroller mScroller;
public SlideShowView(Context context) {
this(context, null);
}
public SlideShowView(Context context, AttributeSet attrs) {
this(context, attrs, -1);
}
public SlideShowView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
init(attrs);
scaledEdgeSlop = ViewConfiguration.get(context).getScaledEdgeSlop();
}
private void init(AttributeSet attrs) {
if (attrs != null) {
TypedArray typedArray = getContext().obtainStyledAttributes(attrs, R.styleable.SlideShowView);
RADUIS = (int) typedArray.getDimension(R.styleable.SlideShowView_mDotRaduis, 0);
MARGING = 4 * RADUIS;
dotNormalColor = typedArray.getColor(R.styleable.SlideShowView_mDotNormalColor, 0);
dotSelectColor = typedArray.getColor(R.styleable.SlideShowView_mDotSelectColor, 0);
dotLocation = typedArray.getInt(R.styleable.SlideShowView_mDotlocation, 1);
mDuration = typedArray.getInt(R.styleable.SlideShowView_mDuration, 500);
mAutoStandTime = typedArray.getInt(R.styleable.SlideShowView_mAutoStandTime, 5000);
bottomTextHeight = typedArray.getDimensionPixelOffset(R.styleable.SlideShowView_mBottomTextViewHeight, 20);
mDotNavigation = typedArray.getBoolean(R.styleable.SlideShowView_mDotNavigation, true);
haveBottomText = typedArray.getBoolean(R.styleable.SlideShowView_mDuration, true);
bottomTextSize = typedArray.getDimension(R.styleable.SlideShowView_mTextSize, 12);//sp
bottomTextColor = typedArray.getColor(R.styleable.SlideShowView_mTextColor, 0x00e9e9e9);
mTextBgColor = typedArray.getColor(R.styleable.SlideShowView_mTextBgColor, 0x1d000000);
typedArray.recycle();
}
paint = new Paint();
paint.setColor(dotNormalColor);
paint.setStyle(Paint.Style.FILL);
paint.setAntiAlias(true);
viewPager = new ViewPager(context);
LayoutParams layoutParams = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
viewPager.setLayoutParams(layoutParams);
viewPager.setOnPageChangeListener(this);
viewPager.setOnTouchListener(this);
addView(viewPager);
if (mDotNavigation) {
drawCricle(0);
}
initBottomTextView();
setDuration(mDuration,new DecelerateInterpolator());
}
/**
* 初始化底部标题栏
*/
private void initBottomTextView() {
if (dotLocation == -1 || dotLocation == 1 && haveBottomText) {
textView = new TextView(context);
textView.setBackgroundColor(mTextBgColor);
textView.setTextColor(bottomTextColor);
textView.setTextSize(Uiutils.px2sp(context,bottomTextSize));
if (dotLocation == -1) {
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.RIGHT);
textView.setPadding(0, 0, 20, 0);
} else {
textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
textView.setPadding(20, 0, 0, 0);
}
Log.e("height","--------"+bottomTextHeight);
LayoutParams layoutParamsText = new LayoutParams(LayoutParams.MATCH_PARENT, bottomTextHeight);
layoutParamsText.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
addView(textView, layoutParamsText);
}
}
public void setAdapter(SlideAdapter adapter) {
// ArrayList<String> urlList = adapter.getpagerItemUrl();
// int[] imgList = adapter.getpagerItemImg();
// int[] imgs = new int[imgList.length+2];
// if (urlList!=null&&urlList.size()>0){
// String s = urlList.get(urlList.size() - 1);
// urlList.add(0,s);
// urlList.add(urlList.get(1));
// adapter.setUrlList(urlList);
// }
// if (imgList!=null&&imgList.length>0){
// int length = imgList.length;
// LogUtil.e(length+" 长度----------------------");
// imgs[0] =imgList[length-1];
// for (int i = 0; i < imgList.length; i++) {
// imgs[i+1] =imgList[i];
// }
// imgs[imgs.length-1] = imgList[0];
// adapter.setImgsList(imgs);
// }
count = adapter.getImgCount();
titleText = adapter.getTitleText();
viewPager.setAdapter(adapter);
viewPager.setCurrentItem(Integer.MAX_VALUE / 2);
mHandler.sendEmptyMessageDelayed(0, mAutoStandTime);
}
public void setBottomTextBg(int color) {
if (textView == null) return;
this.textView.setBackgroundColor(color);
}
public void setBottomTextColor(int color) {
if (textView == null) return;
this.textView.setTextColor(color);
}
public void setBottomTextSize(int size) {
if (textView == null) return;
this.textView.setTextSize(Uiutils.dp2px(context, size));
}
/**
* 设置动画时间
* @param mDuration
*/
public void setDuration(int mDuration, Interpolator interpolator){
this.mDuration =mDuration;
try {
// 通过class文件获取mScroller属性
Field mField = ViewPager.class.getDeclaredField("mScroller");
mField.setAccessible(true);
mScroller = new FixedSpeedScroller(viewPager.getContext(), interpolator);
mField.set(viewPager, mScroller);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 设置transformer
*
* @param b
* @param transformer
*/
public void setPageTransformer(boolean b, ViewPager.PageTransformer transformer) {
if (viewPager != null) {
viewPager.setPageTransformer(b, transformer);
}
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
touchDownTime = System.currentTimeMillis();
mPosX = (int) motionEvent.getX();
mPosY = (int) motionEvent.getY();
case MotionEvent.ACTION_MOVE:
isTouch = true;
mCurPosX = (int) motionEvent.getX();
mCurPosY = (int) motionEvent.getY();
break;
case MotionEvent.ACTION_UP:
long touchUpTime = System.currentTimeMillis();
long l = touchUpTime - touchDownTime;
//触摸移动距离小于滑动识别距离,触摸时间小于200ms确认为点击事件
if (scaledEdgeSlop > (mCurPosY - mPosY) && scaledEdgeSlop > (mCurPosX - mPosX) && l < 200) {
if (clickListener != null)
clickListener.onViewPagerItemClick(viewPager.getCurrentItem()%count);
}
isTouch = false;
//延时1秒,如果没有触摸就自动开始滚动
new Timer().schedule(new TimerTask() {
@Override
public void run() {
if (!isTouch) {
mHandler.sendEmptyMessageDelayed(0, mAutoStandTime - 1000);
}
}
}, 1000);
break;
}
return false;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
height = MeasureSpec.getSize(heightMeasureSpec);
}
private int itemPosition = 0;
private Handler mHandler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message message) {
mHandler.removeMessages(0);
if (!isTouch) {
// if (itemPosition == count-1) {
// itemPosition = 1;
// viewPager.setCurrentItem(itemPosition, false);
// mHandler.sendEmptyMessageDelayed(0, 0);
// }else if (itemPosition==0){
// itemPosition = count-1;
// viewPager.setCurrentItem(itemPosition, false);
// mHandler.sendEmptyMessageDelayed(0, 0);
// }else {
itemPosition++;
viewPager.setCurrentItem(itemPosition, true);
mHandler.sendEmptyMessageDelayed(0, mAutoStandTime);
// }
}
return false;
}
});
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (listener != null) {
listener.onPageScrolled(position% count, positionOffset, positionOffsetPixels);
}
// if (position == 0 && positionOffset == 0) viewPager .setCurrentItem(count - 1, false);
// else if (position == count - 1 && positionOffset == 0) viewPager .setCurrentItem(1, false);
}
@Override
public void onPageSelected(int position) {
if (listener != null)
listener.onPageSelected(position% count);
itemPosition = position;
viewPager.setCurrentItem(position);
mScroller.setmDuration(mDuration);//设置页面切换时间
if (textView != null && titleText != null && titleText.length > 0) {
textView.setText(titleText[position % count]);
}
drawCricle(position % count);
}
@Override
public void onPageScrollStateChanged(int state) {
if (listener != null)
listener.onPageScrollStateChanged(state);
}
/**
* 绘制小圆点
*
* @param position
*/
private void drawCricle(int position) {
if (dot != null)
removeView(dot);
dot = new DotView(context);
dot.setDotCount(count)
.setdotNormalColor(dotNormalColor)
.setdotSelectColor(dotSelectColor)
.setMaring(MARGING).setRaduis(RADUIS);
LayoutParams layoutParamsDot2 = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, RADUIS * 2);
layoutParamsDot2.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
if (dotLocation == 0) {
layoutParamsDot2.addRule(RelativeLayout.CENTER_HORIZONTAL, RelativeLayout.TRUE);
layoutParamsDot2.setMargins(0, 0, 0, bottomTextHeight / 3);
} else if (dotLocation == -1) {
layoutParamsDot2.addRule(RelativeLayout.ALIGN_PARENT_LEFT, RelativeLayout.TRUE);
layoutParamsDot2.setMargins(30, 0, 0, bottomTextHeight / 3);
} else if (dotLocation == 1) {
layoutParamsDot2.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, RelativeLayout.TRUE);
layoutParamsDot2.setMargins(0, 0, 30, bottomTextHeight / 3);
}
dot.changePager(position);
addView(dot, layoutParamsDot2);
}
/**
* 页面切换监听
*/
public interface PageChangeListener {
void onPageScrolled(int position, float positionOffset, int positionOffsetPixels);
void onPageSelected(int position);
void onPageScrollStateChanged(int state);
}
public void setOnPageChangeListener(PageChangeListener listener) {
this.listener = listener;
}
/**
* 页面点击监听
*/
public interface OnViewPagerItemClickListener {
void onViewPagerItemClick(int position);
}
private OnViewPagerItemClickListener clickListener;
public void setOnItemClickListener(OnViewPagerItemClickListener clickListener) {
this.clickListener = clickListener;
}
}