1.首先自定义圆点的属性,动态显示,比较方便修改圆点的颜色,取名为:attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources><declare-styleable name="XCircleIndicator"><!-- 被选中圆点的颜色 --><attr name="fillColor" format="color" /><!-- 未选中圆点的颜色 --><attr name="strokeColor" format="color" /><!-- 圆点的大小 --><attr name="radius" format="dimension" /><!-- 圆点间间距的大小 --><attr name="circleInterval" format="dimension" /></declare-styleable>
</resources>

2.自定义Xcircleindicator继承自View
/**
* @author 作者名 易皇星
* @email 邮箱名 15095887072@163.com
* @time 2016-4-11 2016-05
* @TODO 缘分是本书,翻得不经意会错过,读得太认真会流泪!
*/

public class Xcircleindicator extends View {private int radius = 4;private final Paint mPaintStroke = new Paint(Paint.ANTI_ALIAS_FLAG);private final Paint mPaintFill = new Paint(Paint.ANTI_ALIAS_FLAG);private int currentScroll = 0;private int flowWidth = 0;private int pageTotalCount = 1;private int currentPage = 0;private int circleInterval = radius;public Xcircleindicator(Context context) {super(context);// TODO Auto-generated constructor stubinitColors(0xFFFFFFFF, 0xFFFFFFFF);}public Xcircleindicator(Context context, AttributeSet attrs) {super(context, attrs);// Retrieve styles attributsTypedArray a = context.obtainStyledAttributes(attrs,R.styleable.XCircleIndicator);try {// Retrieve the colors to be used for this view and apply them.int fillColor = a.getColor(R.styleable.XCircleIndicator_fillColor,0xFFFFFFFF);int strokeColor = a.getColor(R.styleable.XCircleIndicator_strokeColor, 0xFFFFFFFF);// Retrieve the radiusradius = (int) a.getDimension(R.styleable.XCircleIndicator_radius,radius);circleInterval = (int) a.getDimension(R.styleable.XCircleIndicator_circleInterval, radius);initColors(fillColor, strokeColor);} catch (Exception e) {e.printStackTrace();} finally {a.recycle();}}
//设置当前应显示圆点的总数public void initData(int count, int contentWidth) {this.pageTotalCount = count;this.flowWidth = contentWidth;invalidate();}
//设置当前圆点public void setCurrentPage(int currentPage) {this.currentPage = currentPage;invalidate();}public void setPageTotalCount(int pageTotalCount) {this.pageTotalCount = pageTotalCount;invalidate();}private void initColors(int fillColor, int strokeColor) {mPaintStroke.setStyle(Style.STROKE);mPaintStroke.setColor(strokeColor);mPaintFill.setStyle(Style.FILL);mPaintFill.setColor(fillColor);}//设置 被选中圆点的颜色public void setFillColor(int color) {mPaintFill.setColor(color);invalidate();}//设置  未选中圆点的颜色public void setStrokeColor(int color) {mPaintStroke.setColor(color);invalidate();}
// 圆点间间距的大小public void setCircleInterval(int circleInterval) {this.circleInterval = circleInterval;invalidate();}
// 圆点的大小 public void setRadius(int radius) {this.radius = radius;invalidate();}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(measureWidth(widthMeasureSpec),measureHeight(heightMeasureSpec));}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);// Draw stroked circlesfor (int iLoop = 0; iLoop < pageTotalCount; iLoop++) {canvas.drawCircle(getPaddingLeft() + radius+ (iLoop * (2 * radius + circleInterval)), getPaddingTop()+ radius, radius, mPaintStroke);}int cx = 0;cx = (2 * radius + circleInterval) * currentPage;canvas.drawCircle(getPaddingLeft() + radius + cx, getPaddingTop()+ radius, radius, mPaintFill);}private int measureWidth(int measureSpec) {int result = 0;int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);// We were told how big to beif (specMode == MeasureSpec.EXACTLY) {result = specSize;} else { // Calculate the width according the views countresult = getPaddingLeft() + getPaddingRight()+ (pageTotalCount * 2 * radius) + (pageTotalCount - 1)* circleInterval;// Respect AT_MOST value if that was what is called for by// measureSpecif (specMode == MeasureSpec.AT_MOST) {result = Math.min(result, specSize);}}return result;}private int measureHeight(int measureSpec) {int result = 0;int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);// We were told how big to beif (specMode == MeasureSpec.EXACTLY) {result = specSize;}// Measure the heightelse {result = 2 * radius + getPaddingTop() + getPaddingBottom();// Respect AT_MOST value if that was what is called for by// measureSpecif (specMode == MeasureSpec.AT_MOST) {result = Math.min(result, specSize);}}return result;}public void onScrolled(int h, int v, int oldh, int oldv) {currentScroll = h;invalidate();}}

3.看看activity_main.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"xmlns:indicator="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><android.support.v4.view.ViewPagerandroid:id="@+id/ViewPager"android:layout_width="match_parent"android:layout_height="match_parent"/><com.example.circleindicator.Xcircleindicatorandroid:id="@+id/Xcircleindicator"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentBottom="true"android:layout_centerHorizontal="true"android:layout_marginBottom="10dp"indicator:circleInterval="10dp"indicator:fillColor="#F96A0E"         indicator:radius="5dp"indicator:strokeColor="#cecece" /></RelativeLayout>

4.Maintivity

public class MainActivity extends Activity {private Xcircleindicator mXcircleindicator;List<View>  lisViews=new ArrayList<View>();private ViewPager mPager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mXcircleindicator=(Xcircleindicator) findViewById(R.id.Xcircleindicator);mPager=(ViewPager) findViewById(R.id.ViewPager);//添加数据lisViews.add(LayoutInflater.from(this).inflate(R.layout.viewpaer_item_one, null));lisViews.add(LayoutInflater.from(this).inflate(R.layout.viewpaer_item_two, null));lisViews.add(LayoutInflater.from(this).inflate(R.layout.viewpaer_item_three, null));ViewPagerAdapter mAdapter=new ViewPagerAdapter(lisViews);mPager.setAdapter(mAdapter);//设置总共的页数mXcircleindicator.initData(lisViews.size(), 0);//设置当前的页面mXcircleindicator.setCurrentPage(0);mPager.setOnPageChangeListener(new OnPageChangeListener() {@Overridepublic void onPageSelected(int arg0) {mXcircleindicator.setCurrentPage(arg0);}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {// TODO Auto-generated method stub}});}
class ViewPagerAdapter extends PagerAdapter{private List<View>  lisViews;public ViewPagerAdapter(List<View>  lisViews) {this.lisViews=lisViews;}@Overridepublic int getCount() {// TODO Auto-generated method stubreturn lisViews.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {// TODO Auto-generated method stubreturn arg0==arg1;//官方提示这样写  }@Overridepublic void destroyItem(View container, int position, Object object) {// TODO Auto-generated method stub((ViewPager) container).removeView(lisViews.get(position));//删除页卡  }//这个方法用来实例化页卡         @Overridepublic Object instantiateItem(View container, int position) {((ViewGroup) container).addView(lisViews.get(position), 0);//添加页卡  return lisViews.get(position);  }}

}

5.效果图:

Android 打造万能圆点指示器相关推荐

  1. android 打造万能keyStore

    概述:总所周知,我们在打包我们APK到应用市场的时候,出于安全和设置三方接入(微信.ShareSDK.地图)的唯一识别SHA1值,必须生成一个唯一的keyStore,来保证我们开发项目的安全性.唯一性 ...

  2. Android:打造“万能”Adapter与ViewHolder

    ##写在前面 最近一直忙着各种结课大作业,重新看起Android还有种亲切感.前段时间写项目的时候,学习了一个万能Adapter与ViewHolder的写法.说是"万能"其实就是在 ...

  3. android 圆点指示器,ViewPager加上小圆点指示器效果

    分析 环境 环境:Android Studio 4.0 语言:Java 特点:简单,易懂,效果爆炸 效果 效果2.gif ViewPager类的来历 ViewPager是android扩展包v4包中的 ...

  4. android刮奖控件,资深程序员教你一步步打造万能的Android刮奖控件

    原标题:资深程序员教你一步步打造万能的Android刮奖控件 实现效果 这只是基本实现效果的一部分,下面还有元素没有演示 大致的设计思路: 绘制出刮层效果. 实现刮开效果. 添加事件监听器,完善常用函 ...

  5. Android 快速开发系列 打造万能的ListView GridView 适配器

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38902805 ,本文出自[张鸿洋的博客] 1.概述 相信做Android开发的写 ...

  6. android listview万能适配器

    参考    Android 快速开发系列 打造万能的ListView GridView 适配器 Hongyang public class CommonViewHolder {private Cont ...

  7. Android打造不一样的新手引导页面(二)

    Android打造不一样的新手引导页面(二) 本系列主要分为两篇博客 打造不一样的新手引导页面(一) Android打造不一样的新手引导页面(二) 关于页面导航器的,可以查看我的这一篇博客仿网易新闻的 ...

  8. Android简单的ViewPager指示器

    平常写项目在写介绍页,或者一些简单的轮播图的时候,总会需要搭配指示器来标明当前在什么位置.写法也比较多,刚好自己需要用到,以前用的一些方法,用起来需要配置好多东西,有些大材小用,所以来简单的实现一个. ...

  9. 安卓APP底部导航栏(有消息圆点指示器),实现fragment切换(eclipse)

    本项目使用了相对布局和单选按钮实现了安卓app常见的底部导航栏(带有消息圆点指示器),效果如果所示 一.布局代码如下: <RelativeLayout xmlns:android="h ...

最新文章

  1. /dev/sda2 is mounted; will not make a filesystem here!
  2. Page.ClientScript.RegisterStartupScript函数的使用
  3. 【转】更简单的非递归遍历二叉树的方法
  4. Python 应用领域
  5. 燃烧学往年精选真题解析2018-01-01
  6. Scala算术运算符细节说明
  7. 通过暴露出来的OA和github信息拿Shell
  8. GA,RC,Alpha,Beta,Final等软件版本名词释义
  9. Spring之事务控制
  10. access orcad 数据库_OrCAD Capture CIS使用MySQL数据库
  11. Windows python2.7虚拟环境下的PyV8安装
  12. APP测试点(思维导图)
  13. 情人节程序员用HTML网页表白【表白对话】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
  14. matlab 求特征值的命令,matlab怎么求特征值
  15. git push 报错 remote: error: hook declined to update
  16. STM32制作FLASH字库
  17. WTL 自绘控件库 (CQsAnimaStatic)
  18. 【Serenity BDD】Serenity 2.2.0 版本变动说明及相应的配置变动
  19. 接口和抽象类练习:教练和运动员案例: (1)人员:乒乓球运动员和篮球运动员。乒乓球教练和篮球教练。 (2)为了出国交流,跟乒乓球相关的人员都需要学习英语。 请用所学知识分析,设计类和接口。
  20. android使用fir.im实现版本更新

热门文章

  1. eclipse使用代码质量管理审查工具整理sonarlint(第一篇)
  2. 考华为HCIA,不知道选择什么方向?
  3. PTA 7-21 三角形面积
  4. web前端面试常问问题一(肝货)
  5. 下载链接后的MD5是什么意思?
  6. 昆仑通态McgsPro 使用MQTT最详细步骤,经验总结
  7. 高斯消元 卡我常数(shit)
  8. WebAdmin管理平台首发
  9. 怎么把图片转文字?简单好用的转换方法分享
  10. ERP系统方案的实施步骤