自定义一个view实现轮播效果,代码如下: /* * 首页轮播图 */ public class ImageCycleView extends LinearLayout { ACache mCache; /** * 上下文 */ private Context mContext; /** * 图片轮播视图 */ private ViewPager mAdvPager = null; /** * 滚动图片视图适配器 */ private ImageCycleAdapter mAdvAdapter; /** * 图片轮播指示器控件 */ private ViewGroup mGroup; /** * 图片轮播指示器-个图 */ private ImageView mImageView = null; /** * 滚动图片指示器-视图列表 */ private ImageView[] mImageViews = null; /** * 图片滚动当前图片下标 */ private int mImageIndex = 0; /** * 手机密度 */ private float mScale; /** * @param context */ public ImageCycleView(Context context) { super(context); } /** * @param context * @param attrs */ public ImageCycleView(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; mScale = context.getResources().getDisplayMetrics().density; LayoutInflater.from(context).inflate(R.layout.ad_cycle_view, this); mAdvPager = (ViewPager) findViewById(R.id.adv_pager); mAdvPager.setOnPageChangeListener(new GuidePageChangeListener()); mAdvPager.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_UP: // 开始图片滚动 startImageTimerTask(); break; default: // 停止图片滚动 stopImageTimerTask(); break; } return false; } }); // 滚动图片右下指示器视图 mGroup = (ViewGroup) findViewById(R.id.viewGroup); mCache = ACache.get(mContext); } /** * 装填图片数据 * * @param imageUrlList * @param imageCycleViewListener */ public void setImageResources(ArrayList<String> imageUrlList, ImageCycleViewListener imageCycleViewListener) { // 清除所有子视图 mGroup.removeAllViews(); // 图片广告数量 final int imageCount = imageUrlList.size(); if(imageCount>1){ mImageViews = new ImageView[imageCount]; for (int i = 0; i < imageCount; i++) { LayoutParams margin = new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); // 设置每个小圆点距离左边的间距 margin.setMargins(10, 0, 0, 0); mImageView = new ImageView(mContext); // 设置每个小圆点的宽和高 mImageView.setLayoutParams(new LayoutParams(15, 15)); mImageViews[i] = mImageView; if (i == 0) { mImageViews[i] .setBackgroundResource(R.mipmap.page_indicator_focused); } else { mImageViews[i] .setBackgroundResource(R.mipmap.page_indicator_unfocused); } mGroup.addView(mImageViews[i], margin); } } mAdvAdapter = new ImageCycleAdapter(mContext, imageUrlList, imageCycleViewListener); mAdvPager.setAdapter(mAdvAdapter); startImageTimerTask(); } /** * 开始轮播(手动控制自动轮播与否,便于资源控制) */ public void startImageCycle() { startImageTimerTask(); } /** * 暂停轮播——用于节省资源 */ public void pushImageCycle() { stopImageTimerTask(); } /** * 开始图片滚动任务 */ private void startImageTimerTask() { stopImageTimerTask(); // 图片每3秒滚动一次 mHandler.postDelayed(mImageTimerTask, 5000); } /** * 停止图片滚动任务 */ private void stopImageTimerTask() { mHandler.removeCallbacks(mImageTimerTask); } private Handler mHandler = new Handler(); /** * 图片自动轮播Task */ private Runnable mImageTimerTask = new Runnable() { @Override public void run() { if (mImageViews != null) { // 下标等于图片列表长度说明已滚动到最后一张图片,重置下标 if ((++mImageIndex) == mImageViews.length) { mImageIndex = 0; } mAdvPager.setCurrentItem(mImageIndex); } } }; /** * 轮播图片状态监听器 * * @author minking */ private final class GuidePageChangeListener implements OnPageChangeListener { @Override public void onPageScrollStateChanged(int state) { if (state == ViewPager.SCROLL_STATE_IDLE)// 未拖动页面是调用,这里表示停止拖动界面得状态 startImageTimerTask(); // 开始下次计时 } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int index) { // 设置当前显示的图片下标 mImageIndex = index; // 设置图片滚动指示器背景 mImageViews[index] .setBackgroundResource(R.mipmap.page_indicator_focused); for (int i = 0; i < mImageViews.length; i++) { if (index != i) { mImageViews[i] .setBackgroundResource(R.mipmap.page_indicator_unfocused); } } } } private class ImageCycleAdapter extends PagerAdapter { /** * 图片视图缓存列表 */ private ArrayList<ImageView> mImageViewCacheList; /** * 图片资源列表 */ private ArrayList<String> mAdList = new ArrayList<String>(); /** * 广告图片点击监听器 */ private ImageCycleViewListener mImageCycleViewListener; private Context mContext; public ImageCycleAdapter(Context context, ArrayList<String> adList, ImageCycleViewListener imageCycleViewListener) { mContext = context; mAdList = adList; mImageCycleViewListener = imageCycleViewListener; mImageViewCacheList = new ArrayList<ImageView>(); } @Override public int getCount() { return mAdList.size(); } @Override public boolean isViewFromObject(View view, Object obj) { return view == obj; } @Override public Object instantiateItem(ViewGroup container, final int position) { String imageUrl = mAdList.get(position); ImageView imageView = null; if (mImageViewCacheList.isEmpty()) { imageView = new ImageView(mContext); imageView.setLayoutParams(new LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); imageView.setScaleType(ImageView.ScaleType.FIT_XY); } else { imageView = mImageViewCacheList.remove(0); } /*// 设置图片点击监听 imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { //轮播图的点击事件 HomeEntity homeInfo = (HomeEntity) mCache.getAsObject("homeInfo"); List<HomeFocusPic> focusList =homeInfo.getFlist(); if (!focusList.get(position).getUrl().equals("javascript:void(0);")) { //打开webview Intent intent = new Intent(mContext, WebAct.class); intent.putExtra("url", focusList.get(position).getUrl()); App.gotoActivity(mContext, intent); }; } });*/ imageView.setTag(imageUrl); container.addView(imageView); mImageCycleViewListener.displayImage(imageUrl, imageView); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { ImageView view = (ImageView) object; container.removeView(view); mImageViewCacheList.add(view); // ((ViewPager)container).removeView(mImageViews[position % mImageViews.length]); } } /** * 轮播控件的监听事件 * * @author minking */ public static interface ImageCycleViewListener { /** * 加载图片资源 * * @param imageURL * @param imageView */ public void displayImage(String imageURL, ImageView imageView); /** * 单击图片事件 * * @param position * @param imageView */ public void onImageClick(int position, View imageView); } } 用法如下:private ImageCycleView viewPager;//轮播控件@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mContext=this; viewPager = (ImageCycleView) findViewById(R.id.vp_first_image); }@Override public void onResume() { super.onResume(); //开启轮播图 viewPager.startImageCycle(); } @Override public void onPause() { super.onPause(); //暂停轮播图 viewPager.pushImageCycle(); } @Override protected void onDestroy() { super.onDestroy(); //关闭轮播图 viewPager.pushImageCycle(); }private ImageCycleView.ImageCycleViewListener mAdCycleViewListener = new ImageCycleView.ImageCycleViewListener() { @Override public void onImageClick(int position, View imageView) { // 单击图片处理事件,webview } @Override public void displayImage(String imageURL, ImageView imageView) { //此处用到ImageLoader进行加载图片 ImageLoaderUtils.ImageLoader(MainActivity.this, imageURL, imageView);// 使用了ImageLoader对图片进行加装! } };//将请求下来的图片加载到轮播控件中 imgUrlList 图片路径集合 viewPager.setImageResources(imgUrlList, mAdCycleViewListener);
项目中用到的轮播图片效果
最新推荐文章于 2020-12-28 22:52:55 发布