首页 > 开发 > Java > 正文

java制作广告图片自动轮播控件

2024-07-13 09:56:00
字体:
来源:转载
供稿:网友

本文给大家分享了2款java实现的首页广告图片自动轮播的控件,分别是PC端和移动端的,效果非常不错,有需要的小伙伴可以参考下。

首页图片的轮播

 

 
  1. /** 
  2. * 广告图片自动轮播控件</br> 
  3.  
  4. */ 
  5. public class ImageCycleView extends LinearLayout { 
  6. /** 
  7. * 上下文 
  8. */ 
  9. private Context mContext; 
  10. /** 
  11. * 图片轮播视图 
  12. */ 
  13. private ViewPager mAdvPager = null
  14. /** 
  15. * 滚动图片视图适配 
  16. */ 
  17. private ImageCycleAdapter mAdvAdapter; 
  18. /** 
  19. * 图片轮播指示器控件 
  20. */ 
  21. private ViewGroup mGroup; 
  22.  
  23. /** 
  24. * 图片轮播指示个图 
  25. */ 
  26. private ImageView mImageView = null
  27.  
  28. /** 
  29. * 滚动图片指示视图列表 
  30. */ 
  31. private ImageView[] mImageViews = null
  32.  
  33. /** 
  34. * 图片滚动当前图片下标 
  35. */ 
  36.  
  37. private boolean isStop; 
  38.  
  39. /** 
  40. * 游标是圆形还是长条,要是设置为0是长条,要是1就是圆形 默认是圆形 
  41. */ 
  42. public int stype=1; 
  43.  
  44. /** 
  45. * @param context 
  46. */ 
  47. public ImageCycleView(Context context) { 
  48. super(context); 
  49.  
  50. /** 
  51. * @param context 
  52. * @param attrs 
  53. */ 
  54. @SuppressLint("Recycle"
  55. public ImageCycleView(Context context, AttributeSet attrs) { 
  56. super(context, attrs); 
  57. mContext = context; 
  58. LayoutInflater.from(context).inflate(R.layout.ad_cycle_view, this); 
  59. mAdvPager = (ViewPager) findViewById(R.id.adv_pager); 
  60. mAdvPager.setOnPageChangeListener(new GuidePageChangeListener()); 
  61. // 滚动图片右下指示器视 
  62. mGroup = (ViewGroup) findViewById(R.id.viewGroup);  
  63.  
  64. /** 
  65. * 触摸停止计时器,抬起启动计时器 
  66. */ 
  67. @Override 
  68. public boolean dispatchTouchEvent(MotionEvent event) { 
  69. if(event.getAction()==MotionEvent.ACTION_UP){ 
  70. // 开始图片滚动 
  71. startImageTimerTask(); 
  72. }else
  73. // 停止图片滚动 
  74. stopImageTimerTask(); 
  75. return super.dispatchTouchEvent(event); 
  76. /** 
  77. * 装填图片数据 
  78.  
  79. * @param imageUrlList 
  80. * @param imageCycleViewListener 
  81. */ 
  82. public void setImageResources(ArrayList<Integer> imageUrlList ,ImageCycleViewListener imageCycleViewListener,int stype){ 
  83. this.stype=stype; 
  84. // 清除 
  85. mGroup.removeAllViews(); 
  86. // 图片广告数量 
  87. final int imageCount = imageUrlList.size(); 
  88. mImageViews = new ImageView[imageCount]; 
  89. for (int i = 0; i < imageCount; i++) { 
  90. mImageView = new ImageView(mContext); 
  91. LayoutParams params=new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
  92. params.leftMargin=30;  
  93. mImageView.setScaleType(ScaleType.CENTER_CROP); 
  94. mImageView.setLayoutParams(params); 
  95.  
  96. mImageViews[i] = mImageView; 
  97. if (i == 0) { 
  98. if(this.stype==1) 
  99. // mImageViews[i].setBackgroundResource(R.drawable.banner_dian_focus); 
  100. mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_focus);//换点 
  101. else 
  102. mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_focus); 
  103. else { 
  104. if(this.stype==1) 
  105. // mImageViews[i].setBackgroundResource(R.drawable.banner_dian_blur); 
  106. mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); 
  107. else 
  108. mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); 
  109. mGroup.addView(mImageViews[i]); 
  110.  
  111. mAdvAdapter = new ImageCycleAdapter(mContext, imageUrlList ,imageCycleViewListener); 
  112. mAdvPager.setAdapter(mAdvAdapter); 
  113. mAdvPager.setCurrentItem(Integer.MAX_VALUE/2); 
  114. startImageTimerTask(); 
  115.  
  116.  
  117. public void setImageResources2(ArrayList<Integer> imageUrlList ,ImageCycleViewListener imageCycleViewListener,int stype){ 
  118. this.stype=stype; 
  119. // 清除 
  120. mGroup.removeAllViews(); 
  121. // 图片广告数量 
  122. final int imageCount = imageUrlList.size(); 
  123. mImageViews = new ImageView[imageCount]; 
  124. for (int i = 0; i < imageCount; i++) { 
  125. mImageView = new ImageView(mContext); 
  126. LayoutParams params=new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
  127. params.leftMargin=30;  
  128. mImageView.setScaleType(ScaleType.CENTER_CROP); 
  129. mImageView.setLayoutParams(params); 
  130.  
  131. mImageViews[i] = mImageView; 
  132. if (i == 0) { 
  133. if(this.stype==1) 
  134. // mImageViews[i].setBackgroundResource(R.drawable.banner_dian_focus); 
  135. mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_focus);//换点 
  136. else 
  137. mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_focus); 
  138. else { 
  139. if(this.stype==1) 
  140. // mImageViews[i].setBackgroundResource(R.drawable.banner_dian_blur); 
  141. mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); 
  142. else 
  143. mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); 
  144. mGroup.addView(mImageViews[i]); 
  145.  
  146. mAdvAdapter = new ImageCycleAdapter(mContext, imageUrlList ,imageCycleViewListener); 
  147. mAdvPager.setAdapter(mAdvAdapter); 
  148. mAdvPager.setCurrentItem(Integer.MAX_VALUE/2); 
  149. startImageTimerTask(); 
  150.  
  151.  
  152. /** 
  153. * 图片轮播(手动控制自动轮播与否,便于资源控件) 
  154. */ 
  155. public void startImageCycle() { 
  156. startImageTimerTask(); 
  157.  
  158. /** 
  159. * 暂停轮播—用于节省资源 
  160. */ 
  161. public void pushImageCycle() { 
  162. stopImageTimerTask(); 
  163.  
  164. /** 
  165. * 图片滚动任务 
  166. */ 
  167. private void startImageTimerTask() { 
  168. stopImageTimerTask(); 
  169. // 图片滚动 
  170. mHandler.postDelayed(mImageTimerTask, 5000); 
  171.  
  172. /** 
  173. * 停止图片滚动任务 
  174. */ 
  175. private void stopImageTimerTask() { 
  176. isStop=true
  177. mHandler.removeCallbacks(mImageTimerTask); 
  178.  
  179. private Handler mHandler = new Handler(); 
  180.  
  181. /** 
  182. * 图片自动轮播Task 
  183. */ 
  184. private Runnable mImageTimerTask = new Runnable() { 
  185. @Override 
  186. public void run() { 
  187. if (mImageViews != null) { 
  188. mAdvPager.setCurrentItem(mAdvPager.getCurrentItem()+1); 
  189. if(!isStop){ //if isStop=true //当你退出后 要把这个给停下来 不然 这个一直存在 就一直在后台循环  
  190. mHandler.postDelayed(mImageTimerTask, 5000); 
  191.  
  192. }; 
  193.  
  194. /** 
  195. * 轮播图片监听 
  196.  
  197. * @author minking 
  198. */ 
  199. private final class GuidePageChangeListener implements OnPageChangeListener { 
  200. @Override 
  201. public void onPageScrollStateChanged(int state) { 
  202. if (state == ViewPager.SCROLL_STATE_IDLE) 
  203. startImageTimerTask();  
  204. @Override 
  205. public void onPageScrolled(int arg0, float arg1, int arg2) { 
  206. @Override 
  207. public void onPageSelected(int index) { 
  208. index=index%mImageViews.length; 
  209. // 设置当前显示的图片 
  210. // 设置图片滚动指示器背 
  211. if(stype!=1) 
  212. mImageViews[index].setBackgroundResource(R.drawable.cicle_banner_dian_focus); 
  213. else 
  214. mImageViews[index].setBackgroundResource(R.drawable.cicle_banner_dian_focus); 
  215. for (int i = 0; i < mImageViews.length; i++) { 
  216. if (index != i) { 
  217. if(stype!=1) 
  218. mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); 
  219. else 
  220. mImageViews[i].setBackgroundResource(R.drawable.cicle_banner_dian_blur); 
  221.  
  222. private class ImageCycleAdapter extends PagerAdapter { 
  223.  
  224. /** 
  225. * 图片视图缓存列表 
  226. */ 
  227. private ArrayList<SmartImageView> mImageViewCacheList; 
  228.  
  229. /** 
  230. * 图片资源列表 
  231. */ 
  232. //private ArrayList<String> mAdList = new ArrayList<String>(); 
  233. private ArrayList<Integer> mAdList = new ArrayList<Integer>(); 
  234.  
  235. /** 
  236. * 广告图片点击监听 
  237. */ 
  238. private ImageCycleViewListener mImageCycleViewListener; 
  239.  
  240. private Context mContext; 
  241. // public ImageCycleAdapter(Context context, ArrayList<String> adList , ImageCycleViewListener imageCycleViewListener) { 
  242. // this.mContext = context; 
  243. // this.mAdList = adList; 
  244. // mImageCycleViewListener = imageCycleViewListener; 
  245. // mImageViewCacheList = new ArrayList<SmartImageView>(); 
  246. // } 
  247. public ImageCycleAdapter(Context context, ArrayList<Integer> adList , ImageCycleViewListener imageCycleViewListener) { 
  248. this.mContext = context; 
  249. this.mAdList = adList; 
  250. mImageCycleViewListener = imageCycleViewListener; 
  251. mImageViewCacheList = new ArrayList<SmartImageView>(); 
  252.  
  253. @Override 
  254. public int getCount() { 
  255. return Integer.MAX_VALUE; 
  256. @Override 
  257. public boolean isViewFromObject(View view, Object obj) { 
  258. return view == obj; 
  259. @Override 
  260. public Object instantiateItem(ViewGroup container, final int position) { 
  261. int imageUrl = mAdList.get(position%mAdList.size()); 
  262. Log.e("imageUrl:",position%mAdList.size()+"--"+imageUrl+""); 
  263. SmartImageView imageView = null
  264. if (mImageViewCacheList.isEmpty()) { 
  265. imageView = new SmartImageView(mContext); 
  266. imageView.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
  267.  
  268. //test 
  269. imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); 
  270.  
  271. }  
  272. else { 
  273. imageView = mImageViewCacheList.remove(0); 
  274. imageView.setTag(imageUrl); 
  275. container.addView(imageView); 
  276. //imageView.setImageUrl(imageUrl); 
  277. imageView.setBackgroundResource(imageUrl); 
  278. // 设置图片点击监听 
  279. imageView.setOnClickListener(new OnClickListener() { 
  280. @Override 
  281. public void onClick(View v) { 
  282. mImageCycleViewListener.onImageClick(position%mAdList.size(), v); 
  283. }); 
  284. return imageView; 
  285.  
  286. @Override 
  287. public void destroyItem(ViewGroup container, int position, Object object) { 
  288. SmartImageView view = (SmartImageView) object; 
  289. mAdvPager.removeView(view); 
  290. mImageViewCacheList.add(view); 
  291.  
  292.  
  293.  
  294. /** 
  295. * 轮播控件的监听事件 
  296.  
  297. * @author minking 
  298. */ 
  299. public static interface ImageCycleViewListener { 
  300.  
  301. /** 
  302. * 单击图片事件 
  303.  
  304. * @param position 
  305. * @param imageView 
  306. */ 
  307. public void onImageClick(int position, View imageView); 
  308.  

我们再来看个基于安卓ViewPager的图片轮播控件

  1. package me.lanfog.myandroid.widget; 
  2.  
  3. import java.util.ArrayList; 
  4. import java.util.List; 
  5.  
  6. import android.content.Context; 
  7. import android.os.Handler; 
  8. import android.os.Message; 
  9. import android.support.v4.view.PagerAdapter; 
  10. import android.support.v4.view.ViewPager; 
  11. import android.util.AttributeSet; 
  12. import android.util.Log; 
  13. import android.view.View; 
  14. import android.view.ViewGroup; 
  15. import android.widget.ImageView; 
  16.  
  17. public class PageFlipper extends ViewPager { 
  18.  
  19. private String TAG = PageFlipper.class.getSimpleName(); 
  20.  
  21. private List<View> views; 
  22. private PagerAdapter adapter = new PagerAdapter() { 
  23.  
  24. @Override 
  25. public Object instantiateItem(ViewGroup container, int position) { 
  26. View v = views.get(position); 
  27. container.addView(v); 
  28. return v; 
  29.  
  30. @Override 
  31. public boolean isViewFromObject(View arg0, Object arg1) { 
  32. return arg0 == arg1; 
  33.  
  34. @Override 
  35. public int getItemPosition(Object object) { 
  36. return views.indexOf(object); 
  37.  
  38. @Override 
  39. public void destroyItem(ViewGroup container, int position, Object object) { 
  40. container.removeView((View)object); 
  41.  
  42. @Override 
  43. public int getCount() { 
  44. return views == null ? 0 : views.size(); 
  45. }; 
  46. private OnPageChangeListener listener = new OnPageChangeListener() { 
  47.  
  48. /** 
  49. * 将控件位置转化为数据集中的位置  
  50. */ 
  51. public int convert(int position){ 
  52. return position == 0 ? views.size()-1 : ( position > views.size() ? 0 : position-1 ); 
  53.  
  54. @Override 
  55. public void onPageSelected(int position) { 
  56. if(listener2 != null){ 
  57. listener2.onPageSelected(convert(position)); 
  58.  
  59. @Override 
  60. public void onPageScrolled(int position, float percent, int offset) { 
  61. if(listener2 != null){ 
  62. listener2.onPageScrolled(convert(position), percent, offset); 
  63.  
  64. if(percent == 0){ 
  65. if(position == 0) // 切换到倒数第二页 
  66. setCurrentItem(( views.size() - 2 ) % views.size(), false); 
  67. else if(position == views.size() - 1) // 切换到正数第二页 
  68. setCurrentItem(1, false); 
  69.  
  70. @Override 
  71. public void onPageScrollStateChanged(int state) { 
  72. if(listener2 != null){ 
  73. listener2.onPageScrollStateChanged(state); 
  74.  
  75. switch (state) { 
  76. case SCROLL_STATE_IDLE: // 闲置 
  77.  
  78. if(!handler.hasMessages(START_FLIPPING)) 
  79. handler.sendEmptyMessageDelayed(START_FLIPPING, 3000); // 延时滚动 
  80.  
  81. break
  82. case SCROLL_STATE_DRAGGING: // 拖动中 
  83.  
  84. handler.sendEmptyMessage(STOP_FLIPPING); // 取消滚动 
  85.  
  86. break
  87. case SCROLL_STATE_SETTLING: // 拖动结束 
  88. break
  89. }, listener2; 
  90.  
  91. private final int START_FLIPPING = 0;  
  92. private final int STOP_FLIPPING = 1;  
  93.  
  94. private Handler handler = new Handler(){ 
  95.  
  96. public void handleMessage(Message msg) { 
  97.  
  98. switch (msg.what) { 
  99. case START_FLIPPING: 
  100.  
  101. if(views.size() > 3) // 因为前后页是辅助页,所以此处3也就是只有1页 
  102. setCurrentItem((getCurrentItem() + 1) % views.size()); 
  103.  
  104. handler.sendEmptyMessageDelayed(START_FLIPPING, 3000); // 延时滚动 
  105.  
  106. break
  107. case STOP_FLIPPING: 
  108.  
  109. handler.removeMessages(START_FLIPPING); 
  110.  
  111. break
  112. }; 
  113.  
  114. public PageFlipper(Context context, AttributeSet attrs) { 
  115. super(context, attrs); 
  116. init(); 
  117.  
  118. public PageFlipper(Context context) { 
  119. super(context); 
  120. init(); 
  121.  
  122. private void init(){ 
  123.  
  124. setOffscreenPageLimit(1); // 最大页面缓存数量 
  125. setAdapter(adapter); // 适配器 
  126. super.setOnPageChangeListener(listener); // 监听器 
  127.  
  128. handler.sendEmptyMessageDelayed(START_FLIPPING, 3000); // 延时滚动 
  129.  
  130. public void setViews(int[] ids){ 
  131. this.views = new ArrayList<View>(); 
  132. for(int i=0;i<ids.length+2;i++){ // 头部新增一个尾页,尾部新增一个首页 
  133.  
  134. ImageView iv = new ImageView(getContext()); 
  135. iv.setImageResource(ids[i == 0 ? ids.length-1 : ( i > ids.length ? 0 : i-1 )]); 
  136. iv.setScaleType(ImageView.ScaleType.FIT_XY); 
  137. this.views.add(iv);  
  138. setCurrentItem(1); // 首页 
  139. this.adapter.notifyDataSetChanged(); 
  140.  
  141. @Override 
  142. public void setOnPageChangeListener(OnPageChangeListener listener) { 
  143. this.listener2 = listener; 
  144.  
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表