[Android]最省内存的ViewPager添加小圆点指示器

转载windowsxp2014的文章,感谢其无私奉献,原文地址

原理:

这个你可以用View叠加来实现,但是这个效果不太理想,1占内存,而移植起来不方便,需要找各种资源,所以采用自己绘制更好,方便,而且效率高。

解决方案:

[java]  view plain copy
  1. package com.youtu.view;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6.   
  7. import android.content.Context;  
  8. import android.graphics.Canvas;  
  9. import android.graphics.Paint;  
  10. import android.graphics.Paint.Style;  
  11. import android.support.v4.view.ViewPager;  
  12. import android.util.AttributeSet;  
  13. import android.view.View;  
  14.   
  15. public class ADView extends ViewPager {  
  16.   
  17.     AdAdapter mAdAdapter;  
  18.     Context context;  
  19.     Paint paint;  
  20.     List<Map<String, String>> urls;  
  21.   
  22.     public ADView(Context context, AttributeSet attrs) {  
  23.         super(context, attrs);  
  24.         this.context = context;  
  25.         paint = new Paint();  
  26.         InitAdapter();  
  27.     }  
  28.   
  29.     private void InitAdapter() {  
  30.         urls = new ArrayList<Map<String, String>>();  
  31.         mAdAdapter = new AdAdapter(context, urls);  
  32.         this.setAdapter(mAdAdapter);  
  33.     }  
  34.   
  35.     public void setData(List<Map<String, String>> data) {  
  36.         urls.clear();  
  37.         for (int i = 0; i < data.size(); i++) {  
  38.             urls.add(data.get(i));  
  39.         }  
  40.         if(urls.size()>0){  
  41.             this.setVisibility(View.VISIBLE);  
  42.         }else{  
  43.             this.setVisibility(View.GONE);  
  44.         }  
  45.         mAdAdapter.notifyDataSetChanged();  
  46.     }  
  47.   
  48.     @Override  
  49.     public void draw(Canvas canvas) {  
  50.         super.draw(canvas);  
  51.         drawCycle(canvas);  
  52.     }  
  53.   
  54.     private void drawCycle(Canvas canvas) {  
  55.         canvas.save();  
  56.         canvas.translate(getScrollX(), getScrollY());  
  57.         int count = 0;  
  58.         if (this.getAdapter() != null) {  
  59.             count = this.getAdapter().getCount();  
  60.         }  
  61.         int select = getCurrentItem();  
  62.         float density = getContext().getResources().getDisplayMetrics().density;  
  63.         int itemWidth = (int) (11 * density);  
  64.         int itemHeight = itemWidth / 2;  
  65.         int x = (getWidth() - count * itemWidth)/2;  
  66.         int y = getHeight() - itemWidth;  
  67.         int minItemHeight = (int) ((float) itemHeight * 0.8F);  
  68.         paint.setAntiAlias(true);  
  69.   
  70.         paint.setStyle(Style.FILL);  
  71.         for (int i = 0; i < count; i++) {  
  72.             if (select == i) {  
  73.                 paint.setColor(0xFFbdbdbd);  
  74.                 canvas.drawCircle(x + itemWidth * i + itemWidth / 2, y, minItemHeight, paint);  
  75.             } else {  
  76.                 paint.setColor(0xFFe6e6e6);  
  77.                 canvas.drawCircle(x + itemWidth * i + itemWidth / 2, y, minItemHeight, paint);  
  78.             }  
  79.         }  
  80.         canvas.restore();  
  81.     }  
  82.   
  83. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值