Android【轮播图工具类】

Android【轮播图工具类】

可以定义轮播图的圆点样式

核心代码

public class FlashView extends RelativeLayout {

private static final int RMP = LayoutParams.MATCH_PARENT;
private static final int RWP = LayoutParams.WRAP_CONTENT;
private static final int LWC = LinearLayout.LayoutParams.WRAP_CONTENT;
private static final int WHAT_AUTO_PLAY = 1000;
//Point位置
public static final int CENTER = 0;
public static final int LEFT = 1;
public static final int RIGHT = 2;
private LinearLayout mPointRealContainerLl;
private ViewPager mViewPager;
//本地图片资源
private List<Integer> mImages;
//网络图片资源
private List<String> mImageUrls;
//是否是网络图片
private boolean mIsImageUrl = false;
//是否只有一张图片
private boolean mIsOneImg = false;
//是否可以自动播放
private boolean mAutoPlayAble = true;
//是否正在播放
private boolean mIsAutoPlaying = false;
//自动播放时间
private int mAutoPalyTime = 5003;
//当前页面位置
private int mCurrentPositon;
//指示点位置
private int mPointPosition = CENTER;
//指示点资源
private int mPointDrawableResId = R.drawable.selector_bgabanner_point;
//指示容器背景
private Drawable mPointContainerBackgroundDrawable;
//指示容器布局规则
private LayoutParams mPointRealContainerLp;
//提示语
private TextView mTips;
private List<String> mTipsDatas;
//指示点是否可见
private boolean mPointsIsVisible = true;
private int placeholder = R.mipmap.ic_loading_325;
private Handler mAutoPlayHandler = new Handler() {

@Override
public void handleMessage(Message msg) {

mCurrentPositon++;
mViewPager.setCurrentItem(mCurrentPositon);
mAutoPlayHandler.sendEmptyMessageDelayed(WHAT_AUTO_PLAY, mAutoPalyTime);
}
};
public FlashView(Context context) {

this(context, null);
}
public FlashView(Context context, AttributeSet attrs) {

this(context, attrs, 0);
}
public FlashView(Context context, AttributeSet attrs, int defStyleAttr) {

super(context, attrs, defStyleAttr);
init(context, attrs);
}
private void init(Context context, AttributeSet attrs) {

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FlyBanner);
mPointsIsVisible = a.getBoolean(R.styleable.FlyBanner_points_visibility, true);
mPointPosition = a.getInt(R.styleable.FlyBanner_points_position, CENTER);
mPointContainerBackgroundDrawable
= a.getDrawable(R.styleable.FlyBanner_points_container_background);
a.recycle();
setLayout(context);
}
private void setLayout(Context context) {

//关闭view的OverScroll
setOverScrollMode(OVER_SCROLL_NEVER);
//设置指示器背景
if (mPointContainerBackgroundDrawable == null) {

mPointContainerBackgroundDrawable = new ColorDrawable(Color.parseColor("#00aaaaaa"));
}
//添加ViewPager
mViewPager = new ViewPager(context);
addView(mViewPager, new LayoutParams(RMP, RMP));
//设置指示器背景容器
RelativeLayout pointContainerRl = new RelativeLayout(context);
if (Build.VERSION.SDK_INT >= 16) {

pointContainerRl.setBackground(mPointContainerBackgroundDrawable);
} else {

pointContainerRl.setBackgroundDrawable(mPointContainerBackgroundDrawable);
}
//设置内边距
pointContainerRl.setPadding(0, 10, 0, 10);
//设定指示器容器布局及位置
LayoutParams pointContainerLp = new LayoutParams(RMP, RWP);
pointContainerLp.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
addView(pointContainerRl, pointContainerLp);
//设置指示器容器
mPointRealContainerLl = new LinearLayout(context);
mPointRealContainerLl.setOrientation(LinearLayout.HORIZONTAL);
mPointRealContainerLp = new LayoutParams(RWP, RWP);
pointContainerRl.addView(mPointRealContainerLl, mPointRealContainerLp);
//设置指示器容器是否可见
if (mPointRealContainerLl != null) {

if (mPointsIsVisible) {

mPointRealContainerLl.setVisibility(View.VISIBLE);
} else {

mPointRealContainerLl.setVisibility(View.GONE);
}
}
//设置指示器布局位置
if (mPointPosition == CENTER) {

mPointRealContainerLp.addRule(RelativeLayout.CENTER_HORIZONTAL);
} else if (mPointPosition == LEFT) {

mPointRealContainerLp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
} else if (mPointPosition == RIGHT) {

mPointRealContainerLp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
}
}
/** * 设置本地图片 * * @param images */
public void setImages(List<Integer> images) {

//加载本地图片
mIsImageUrl = false;
this.mImages = images;
if (images.size() <= 1)
mIsOneImg = true;
//初始化ViewPager
initViewPager();
}
public void setPlaceholder(int placeholder){

this.placeholder = placeholder;
}
/** * 设置网络图片 * * @param urls */
public void setImagesUrl(List<String> urls) {

//加载网络图片
mIsImageUrl = true;
this.mImageUrls = urls;
if (urls.size() <= 1)
mIsOneImg = true;
//初始化ViewPager
initViewPager();
}
/** * 设置指示点是否可见 * * @param isVisible */
public void setPointsIsVisible(boolean isVisible) {

if (mPointRealContainerLl != null) {

if (isVisible) {

mPointRealContainerLl.setVisibility(View.VISIBLE);
} else {

mPointRealContainerLl.setVisibility(View.GONE);
}
}
}
/** * 对应三个位置 CENTER,RIGHT,LEFT * * @param position */
public void setPoinstPosition(int position) {

//设置指示器布局位置
if (position == CENTER) {

mPointRealContainerLp.addRule(RelativeLayout.CENTER_HORIZONTAL);
} else if (position == LEFT) {

mPointRealContainerLp.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
} else if (position == RIGHT) {

mPointRealContainerLp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
}
}
private void initViewPager() {

//当图片多于1张时添加指示点
if (!mIsOneImg) {

addPoints();
}
//设置ViewPager
FlyPageAdapter adapter = new FlyPageAdapter();
mViewPager.setAdapter(adapter);
mViewPager.addOnPageChangeListener(mOnPageChangeListener);
//跳转到首页
mViewPager.setCurrentItem(1, false);
//当图片多于1张时开始轮播
if (!mIsOneImg) {

startAutoPlay();
}
}
/** * 返回真实的位置 * * @param position * @return */
private int toRealPosition(int position) {

int realPosition;
if (mIsImageUrl) {

realPosition = (position - 1) % mImageUrls.size();
if (realPosition < 0)
realPosition += mImageUrls.size();
} else {

realPosition = (position - 1) % mImages.size();
if (realPosition < 0)
realPosition += mImages.size();
}
return realPosition;
}
private ViewPager.OnPageChangeListener mOnPageChangeListener = new ViewPager.OnPageChangeListener() {

@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {

}
@Override
public void onPageSelected(int position) {

if (mIsImageUrl) {

mCurrentPositon = position % (mImageUrls.size() + 2);
} else {

mCurrentPositon = position % (mImages.size() + 2);
}
switchToPoint(toRealPosition(mCurrentPositon));
}
@Override
public void onPageScrollStateChanged(int state) {

if (state == ViewPager.SCROLL_STATE_IDLE) {

int current = mViewPager.getCurrentItem();
int lastReal = mViewPager.getAdapter().getCount() - 2;
if (current == 0) {

mViewPager.setCurrentItem(lastReal, false);
} else if (current == lastReal + 1) {

mViewPager.setCurrentItem(1, false);
}
}
}
};
private class FlyPageAdapter extends PagerAdapter {

@Override
public int getCount() {

//当只有一张图片时返回1
if (mIsOneImg) {

return 1;
}
//当为网络图片,返回网页图片长度
if (mIsImageUrl)
return mImageUrls.size() + 2;
//当为本地图片,返回本地图片长度
return mImages.size() + 2;
}
@Override
public boolean isViewFromObject(View view, Object object) {

return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, final int position) {

ImageView imageView = new ImageView(getContext());
imageView.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View view) {

if (mOnItemClickListener != null) {

mOnItemClickListener.onItemClick(toRealPosition(position));
}
}
});
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
// imageView.setAdjustViewBounds(true);
if (mIsImageUrl) {

Glide.with(getContext())
.load(mImageUrls.get(toRealPosition(position)))
.placeholder(placeholder)
.error(placeholder)
.into(imageView);
} else {

imageView.setImageResource(mImages.get(toRealPosition(position)));
}
container.addView(imageView);
return imageView;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {

container.removeView((View) object);
if (object != null)
object = null;
}
}
/** * 添加指示点 */
private void addPoints() {

mPointRealContainerLl.removeAllViews();
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LWC, LWC);
lp.setMargins(10, 10, 10, 10);
ImageView imageView;
int length = mIsImageUrl ? mImageUrls.size() : mImages.size();
for (int i = 0; i < length; i++) {

imageView = new ImageView(getContext());
imageView.setLayoutParams(lp);
imageView.setImageResource(mPointDrawableResId);
mPointRealContainerLl.addView(imageView);
}
switchToPoint(0);
}
/** * 切换指示器 * * @param currentPoint */
private void switchToPoint(final int currentPoint) {

for (int i = 0; i < mPointRealContainerLl.getChildCount(); i++) {

mPointRealContainerLl.getChildAt(i).setEnabled(false);
}
mPointRealContainerLl.getChildAt(currentPoint).setEnabled(true);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {

if (mAutoPlayAble && !mIsOneImg) {

switch (ev.getAction()) {

case MotionEvent.ACTION_DOWN:
stopAutoPlay();
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_CANCEL:
case MotionEvent.ACTION_OUTSIDE:
startAutoPlay();
break;
}
}
return super.dispatchTouchEvent(ev);
}
/** * 开始播放 */
public void startAutoPlay() {

if (mAutoPlayAble && !mIsAutoPlaying) {

mIsAutoPlaying = true;
mAutoPlayHandler.sendEmptyMessageDelayed(WHAT_AUTO_PLAY, mAutoPalyTime);
}
}
/** * 停止播放 */
public void stopAutoPlay() {

if (mAutoPlayAble && mIsAutoPlaying) {

mIsAutoPlaying = false;
mAutoPlayHandler.removeMessages(WHAT_AUTO_PLAY);
}
}
private OnItemClickListener mOnItemClickListener;
public void setOnItemClickListener(OnItemClickListener listener) {

this.mOnItemClickListener = listener;
}
public interface OnItemClickListener {

void onItemClick(int position);
}
}

selector_bgabanner_point

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true">
<shape android:shape="oval">
<size android:width="6dp" android:height="6dp" />
<solid android:color="@android:color/white" />
</shape>
</item>
<item>
<shape android:shape="oval">
<size android:width="6dp" android:height="6dp" />
<solid android:color="#ddd" />
</shape>
</item>
</selector>

** style**

  <!--轮播图-->
<declare-styleable name="FlyBanner">
<attr name="points_visibility" format="boolean" />
<attr name="points_position" format="enum">
<enum name="CENTER" value="0" />
<enum name="LEFT" value="1" />
<enum name="RIGHT" value="2" />
</attr>
<attr name="points_container_background" format="reference|color" />
</declare-styleable>

使用方法
banner.setImagesUrl();

R.mipmap.ic_loading_325 这个只是一样图片,诸位需要自行替换。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/2830.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号