Android广告轮播Demo_仿淘宝广告轮播_滑动图片广告例子
2014-08-27 11:50:10  By: dwtedx

今天在项目中遇到了这样的需求、轮播图片来展示商品、刚刚已经分享了一种方法

但是我觉得这种还是达不到我的要求、所以我后台又换了一种方式、比较好

跟淘宝京东的商品展示非常像、很符合的我胃口、现在分享出来、供大家使用

代码简单、设置简单、自定义圆点和滚动时间、通过 ViewPager 实现的

滚动图片的类


// 图片滚动类
public class MyImgScroll extends ViewPager {
	Activity mActivity; //上下文
	List<View> mListViews; //图片组
	int mScrollTime = 0;
	Timer timer;
	int oldIndex = 0;
	int curIndex = 0;

	public MyImgScroll(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	// 开始广告滚动
	public void start(Activity mainActivity, List<View> imgList,
			int scrollTime, LinearLayout ovalLayout, int ovalLayoutId,
			int ovalLayoutItemId, int focusedId, int normalId) {
		mActivity = mainActivity;
		mListViews = imgList;
		mScrollTime = scrollTime;
		// 设置圆点
		setOvalLayout(ovalLayout, ovalLayoutId, ovalLayoutItemId, 
			focusedId, normalId);
		this.setAdapter(new MyPagerAdapter());// 设置适配器
		if (scrollTime != 0 && imgList.size() > 1) {
			// 设置滑动动画时间  ,如果用默认动画时间可不用 ,反射技术实现
			 new FixedSpeedScroller(mActivity).setDuration(this, 700);
	
			startTimer();
			// 触摸时停止滚动
			this.setOnTouchListener(new OnTouchListener() {
				public boolean onTouch(View v, MotionEvent event) {
					if (event.getAction() == MotionEvent.ACTION_UP) {
						startTimer();
					} else {
						stopTimer();
					}
					return false;
				}
			});
		} 
		if (mListViews.size() > 1) {
			// 设置选中为中间/图片为和第0张一样
			this.setCurrentItem((Integer.MAX_VALUE / 2)
					- (Integer.MAX_VALUE / 2) % mListViews.size());
		}
	}

	// 设置圆点
	private void setOvalLayout(final LinearLayout ovalLayout, 
			int ovalLayoutId,
			final int ovalLayoutItemId, final int focusedId
				, final int normalId) {
		if (ovalLayout != null) {
			LayoutInflater inflater=LayoutInflater.from(mActivity);
			for (int i = 0; i < mListViews.size(); i++) {
				ovalLayout.addView(inflater
					.inflate(ovalLayoutId, null));
			}
			//选中第一个
			ovalLayout.getChildAt(0).findViewById(ovalLayoutItemId)
			.setBackgroundResource(focusedId);
			this.setOnPageChangeListener(new OnPageChangeListener() {
				public void onPageSelected(int i) {
					curIndex = i % mListViews.size();
                    //取消圆点选中
					ovalLayout.getChildAt(oldIndex)
						.findViewById(ovalLayoutItemId)
						.setBackgroundResource(normalId);
					 //圆点选中
					ovalLayout.getChildAt(curIndex)
						.findViewById(ovalLayoutItemId)
						.setBackgroundResource(focusedId);
					oldIndex = curIndex;
				}

				public void onPageScrolled(int arg0, 
					float arg1, int arg2) {
				}

				public void onPageScrollStateChanged(int arg0) {
				}
			});
		}
	}
	
	// 取得当明选中下标
    public int getCurIndex() {
		return curIndex;
	}
	
	//停止滚动
	public void stopTimer() {
		if (timer != null) {
			timer.cancel();
			timer = null;
		}
	}

	//开始滚动
	public void startTimer() {
		timer = new Timer();
		timer.schedule(new TimerTask() {
			public void run() {
				mActivity.runOnUiThread(new Runnable() {
					public void run() {
						MyImgScroll.this
							.setCurrentItem(MyImgScroll.this
								.getCurrentItem() + 1);
					}
				});
			}
		}, mScrollTime, mScrollTime);
	}

	// 适配器 //循环设置
	private class MyPagerAdapter extends PagerAdapter {
		public void finishUpdate(View arg0) {
		}

		public void notifyDataSetChanged() {
			super.notifyDataSetChanged();
		}

		public int getCount() {
			// 一张图片时不用流动
			if (mListViews.size() == 1) {
				return mListViews.size();
			}
			return Integer.MAX_VALUE;
		}

		public Object instantiateItem(View v, int i) {
			if (((ViewPager) v).getChildCount() == mListViews
				.size()) {
				((ViewPager) v).removeView(mListViews
					.get(i % mListViews.size()));
			}
			((ViewPager) v).addView(mListViews
				.get(i % mListViews.size()), 0);
			return mListViews.get(i % mListViews.size());
		}

		public boolean isViewFromObject(View arg0, 
			Object arg1) {
			return arg0 == (arg1);
		}

		public void restoreState(Parcelable arg0, 
			ClassLoader arg1) {
		}

		public Parcelable saveState() {
			return null;
		}

		public void startUpdate(View arg0) {
		}

		public void destroyItem(View arg0, 
			int arg1, Object arg2) {
		}
	}
}
以下是对 start 方法中的参数介绍
mainActivity 显示广告的主界面
imgList 图片列表, 不能为null ,最少一张
scrollTime 滚动间隔 ,0为不滚动
ovalLayout 圆点容器,可为空,LinearLayout类型
ovalLayoutId ovalLayout为空时 写0, 圆点layout XMl
ovalLayoutItemId ovalLayout为空时 写0,圆点layout XMl 圆点XMl下View ID
focusedId ovalLayout为空时 写0, 圆点layout XMl 选中时的动画
normalId ovalLayout为空时 写0, 圆点layout XMl 正常时背景


控制动画速度一个类,如果用默认动画速度可以删除控制动画速度类

我这里就不贴控制动画速度的类了、大家可以在源代码中直接下载到哈

若资源对你有帮助、扫描下方的二维码、关注DD博客微信公众号(ddblogs)吧

最后给贴上Demo的源代码、希望对大家有用、有兴趣的哥们可以下载看看

源代码下载链接: http://dwtedx.com/download.html?bdkey=s/1dD0KSwx 密码: hqci

若资源对你有帮助、浏览后有很大收获、不妨小额打赏我一下、你的鼓励是维持我不断写博客最大动力

想获取DD博客最新代码、你可以扫描下方的二维码、关注DD博客微信公众号(ddblogs)

或者你也可以关注我的新浪微博、了解DD博客的最新动态:DD博客官方微博(dwtedx的微博)

如对资源有任何疑问或觉得仍然有很大的改善空间、可以对该博文进行评论、希望不吝赐教

为保证及时回复、可以使用博客留言板给我留言: DD博客留言板(dwtedx的留言板)

感谢你的访问、祝你生活愉快、工作顺心、欢迎常来逛逛


快速评论


技术评论

    • dwtedx 2015-04-29 18:40:48  2 评  | 回复

      @Ti Amo:这个Demo我自己也在项目中有使用,明天等我空了我再下载看看,看有没有bug哈。


    • Ti Amo 2015-04-29 17:43:02  1 评  | 回复

      你好,我把这个图片轮播移植到我的项目的时候,出现程序无响应是什么情况?MyImgScroll myPager; // 图片容器 LinearLayout ovalLayout; // 圆点容器 Runnable runnableUi = new Runnable() { @Override public void run() { // 初始化图片资源 for (int i = 0; i < 5; i ) { ImageView imageView = new ImageView(getActivity()); imageLoader.getInstance().displayImage( model.getData().getAdv().get(0).getImage(), imageView, options); imageView.setScaleType(ScaleType.CENTER_CROP); imageViews.add(imageView); } myPager.start(getActivity(), imageViews, 2000, ovalLayout, R.layout.ad_bottom_item, R.id.ad_item_v, R.drawable.dot_focused, R.drawable.dot_normal); } }; private void setViewPage(final ShopMainBeanModel model) { new Thread() { public void run() { handler.post(runnableUi); } }.start(); }


DD记账
top
+