使用ViewPager实现广告栏,效果为:可以自动滑动、手动滑动切换广告、可以点击进入广告详情、标示点指示当前广告。使用方法:调用封装好的几个方法很方便地就能实现广告栏效果。
主要代码如下:
广告栏实现类AchieveMyAdcolumn.java:
public class AchieveMyAdcolumn {
private Context mContext;
// viewpager控件作为广告栏
private ViewPager adViewPager;
private AdViewPagerAdapter adapter;
private AdContentBean mAdContentBean;
private List<View> adImages = new ArrayList<View>();
private List<Integer> adImageId = new ArrayList<Integer>();
private ImageView[] pointImages;
private AtomicInteger atomicInteger = new AtomicInteger(0);
private boolean isContinue = true;
public AchieveMyAdcolumn(Context mContext, AdContentBean mAdContentBean) {
this.mContext = mContext;
this.mAdContentBean = mAdContentBean;
}
/** * 显示广告栏 * * @param pagerLayout * 装载广告栏图片的布局id * @param group * 装载表示图片的点的id */
public void showAd(LinearLayout pagerLayout, ViewGroup group) {
// 创建ViewPager
adViewPager = new ViewPager(mContext);
// 获取屏幕大小
DisplayMetrics dm = mContext.getResources().getDisplayMetrics();
if (mAdContentBean.getHeightPercent() != 0) { // 手动设置了广告栏的高度
// 根据屏幕信息设置ViewPager广告容器的宽高
adViewPager
.setLayoutParams(new LayoutParams(dm.widthPixels,
(int) (dm.heightPixels * mAdContentBean
.getHeightPercent())));
} else { // 使用默认的高度
adViewPager
.setLayoutParams(new LayoutParams(
dm.widthPixels,
(int) (dm.heightPixels * MyAdcolumn.HEIGHT_PERCENT_DEFAULT)));
}
initImagesAdapter();
if (group != null) { // 装载标识点的布局不为空,则初始化标识点
initSignPoints(group);
}
// 设置适配器
adViewPager.setAdapter(adapter);
adViewPager.setOnPageChangeListener(new IModelPageChangeListenerImp(
mAdContentBean, atomicInteger, adImages, pointImages));
new Thread(new Runnable() {
@Override
public void run() {
while (true) {
if (isContinue) {
AdHandler.sendEmptyMessage(atomicInteger.get());
atomicOption();
}
}
}
}).start();
// 将ViewPager容器添加到广告栏布局中
pagerLayout.addView(adViewPager);
}
/** * 初始化广告栏中的图片,并据此初始化广告栏适配器 */
private void initImagesAdapter() {
adImageId = mAdContentBean.getImages();
if (adImageId.size() != 0) {
for (int i = 0; i < adImageId.size(); i++) {
final ImageView tempImage = new ImageView(mContext);
tempImage.setId(adImageId.get(i));
tempImage.setBackgroundResource(adImageId.get(i));
adImages.add(tempImage);
tempImage.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
if (mICtrlAdOnClickListener != null) {
//处理点击事件
mICtrlAdOnClickListener.adItemOnClick(tempImage
.getId());
}
}
});
}
adapter = new AdViewPagerAdapter(adImages);
}
}
/** * 初始化标识广告栏图片的点 * * @param group */
private void initSignPoints(ViewGroup group) {
pointImages = new ImageView[adImages.size()];
// 广告栏的小圆点图标
for (int i = 0; i < adImages.size(); i++) {
// 创建一个ImageView, 并设置宽高. 将该对象放入到数组中
ImageView tempPoint = new ImageView(mContext);
tempPoint.setLayoutParams(new LayoutParams(10, 10));
pointImages[i] = tempPoint;
// 初始值, 默认第0个选中
if (i == 0) {
pointImages[i].setBackgroundResource(mAdContentBean
.getcurrentPoint());
} else {
pointImages[i].setBackgroundResource(mAdContentBean
.getotherPoint());
}
// 将小圆点放入到布局中
group.addView(pointImages[i]);
}
}
/** * 每隔固定时间切换广告栏图片 */
@SuppressLint("HandlerLeak")
private final Handler AdHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 改变当前显示的图片,图片会自动滑动切换
adViewPager.setCurrentItem(msg.what);
super.handleMessage(msg);
}
};
/** * 获取下一张要显示的图片,并控制广告在切换时间到之前图片保持 */
private void atomicOption() {
atomicInteger.incrementAndGet();
if (atomicInteger.get() > adImages.size() - 1) {
atomicInteger.getAndAdd(-(adImages.size()));
}
try {
if (mAdContentBean.getSwitchTime() != 0) { //手动设置了切换间隔时间
Thread.sleep(mAdContentBean.getSwitchTime());
} else { //使用默认的切换间隔时间
Thread.sleep(MyAdcolumn.SWITCH_TIME_DEFAULT);
}
} catch (InterruptedException e) {
}
}
//广告栏图片点击监听器
private ICtrlAdOnClickListener mICtrlAdOnClickListener;
/** * 设置广告栏图片点击监听器 * @param mICtrlAdOnClickListener 监听器 */
public void setICtrlAdOnClickListener(
ICtrlAdOnClickListener mICtrlAdOnClickListener) {
if (mICtrlAdOnClickListener != null) {
this.mICtrlAdOnClickListener = mICtrlAdOnClickListener;
}
}
}
封装的广告栏类MyAdcolumn.java:
public class MyAdcolumn {
/** * 默认的广告图片自动切换的间隔时间 */
public static final int SWITCH_TIME_DEFAULT = 2000;
/** * 默认的广告栏高度占屏幕的比例 */
public static final float HEIGHT_PERCENT_DEFAULT = (float) 0.25;
// 广告栏的实现类对象
private AchieveMyAdcolumn mAchieveMyAdcolumn;
// 存储广告栏相关信息的Bean
private AdContentBean mAdContentBean = new AdContentBean();
public MyAdcolumn(Context mContext) {
mAchieveMyAdcolumn = new AchieveMyAdcolumn(mContext, mAdContentBean);
}
/** * 设置广告栏布局<br> * 将广告栏容器和标志点容器作为参数,参数为null则相应项不显示。 * * @param adImageLayout * 容纳广告栏图片的布局id * @param adPointLayout * 容纳标识图片的点的布局id */
public void setAdLayout(LinearLayout adImageLayout, ViewGroup adPointLayout) {
mAdContentBean.setAdLayout(adImageLayout);
mAdContentBean.setAdPointLayout(adPointLayout);
}
/** * 设置广告栏的图片 * * @param adImageId * 广告栏图片id的列表 */
public void setAdImages(List<Integer> adImageId) {
mAdContentBean.setImages(adImageId);
}
/** * 设置广告栏图片的点击事件 * * @param mICtrlAdOnClickListener * 监听广告栏中点击事件的监听器 */
public void setICtrlAdOnClickListener(
ICtrlAdOnClickListener mICtrlAdOnClickListener) {
// 设置点击监听器的方法定义在广告栏实现类中
mAchieveMyAdcolumn.setICtrlAdOnClickListener(mICtrlAdOnClickListener);
}
/** * 设置广告栏中标识图片的点的id * * @param currentPointId * 表示广告栏中当前显示图片的点的id * @param otherPointsId * 表示广告栏中未显示图片的点的id */
public void setAdSignPoints(int currentPointId, int otherPointsId) {
mAdContentBean.setPoints(currentPointId, otherPointsId);
}
/** * 设置广告栏的高度占屏幕的高度的比例。不设置则为默认的1/4 * * @param adHeightPercent * 所占高度比,用小数标示,如:约占屏幕高度的1/3,表示为0.33 */
public void setAdHeightPercent(float adHeightPercent) {
mAdContentBean.setHeightPercent(adHeightPercent);
}
/** * 图片自动切换时间。不设置则为默认的2000ms * * @param switchTime * 切换时间值,单位是ms */
public void setAdSwitchTime(int switchTime) {
mAdContentBean.setSwitchTime(switchTime);
}
/** * 显示广告栏。<br> * 当广告栏设置完成后,最后调用该方法即可 */
public void showAdcolumn() {
if (mAdContentBean.getAdLayout() != null) {
mAchieveMyAdcolumn.showAd(mAdContentBean.getAdLayout(),
mAdContentBean.getAdPointLayout());
}
}
}
以上为广告栏模块的主要代码,注释也应该够看,不多说了,相信看完以上代码能让读者对使用viewpager制作广告栏有所了解。
除了以上主要代码,还有一些部分如保存广告栏中信息的bean、广告栏viewpager适配器、ViewPager页面改变监听器的实现还有广告栏图片点击监听接口,都比较简单,就不贴代码了。
完整源码下载 。
更多Android开发技术一起探讨学习,点我 。
更多Android开发资源直接下载,点我 。