Android 打造万能圆点指示器
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 打造万能圆点指示器相关推荐
- android 打造万能keyStore
概述:总所周知,我们在打包我们APK到应用市场的时候,出于安全和设置三方接入(微信.ShareSDK.地图)的唯一识别SHA1值,必须生成一个唯一的keyStore,来保证我们开发项目的安全性.唯一性 ...
- Android:打造“万能”Adapter与ViewHolder
##写在前面 最近一直忙着各种结课大作业,重新看起Android还有种亲切感.前段时间写项目的时候,学习了一个万能Adapter与ViewHolder的写法.说是"万能"其实就是在 ...
- android 圆点指示器,ViewPager加上小圆点指示器效果
分析 环境 环境:Android Studio 4.0 语言:Java 特点:简单,易懂,效果爆炸 效果 效果2.gif ViewPager类的来历 ViewPager是android扩展包v4包中的 ...
- android刮奖控件,资深程序员教你一步步打造万能的Android刮奖控件
原标题:资深程序员教你一步步打造万能的Android刮奖控件 实现效果 这只是基本实现效果的一部分,下面还有元素没有演示 大致的设计思路: 绘制出刮层效果. 实现刮开效果. 添加事件监听器,完善常用函 ...
- Android 快速开发系列 打造万能的ListView GridView 适配器
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38902805 ,本文出自[张鸿洋的博客] 1.概述 相信做Android开发的写 ...
- android listview万能适配器
参考 Android 快速开发系列 打造万能的ListView GridView 适配器 Hongyang public class CommonViewHolder {private Cont ...
- Android打造不一样的新手引导页面(二)
Android打造不一样的新手引导页面(二) 本系列主要分为两篇博客 打造不一样的新手引导页面(一) Android打造不一样的新手引导页面(二) 关于页面导航器的,可以查看我的这一篇博客仿网易新闻的 ...
- Android简单的ViewPager指示器
平常写项目在写介绍页,或者一些简单的轮播图的时候,总会需要搭配指示器来标明当前在什么位置.写法也比较多,刚好自己需要用到,以前用的一些方法,用起来需要配置好多东西,有些大材小用,所以来简单的实现一个. ...
- 安卓APP底部导航栏(有消息圆点指示器),实现fragment切换(eclipse)
本项目使用了相对布局和单选按钮实现了安卓app常见的底部导航栏(带有消息圆点指示器),效果如果所示 一.布局代码如下: <RelativeLayout xmlns:android="h ...
最新文章
- /dev/sda2 is mounted; will not make a filesystem here!
- Page.ClientScript.RegisterStartupScript函数的使用
- 【转】更简单的非递归遍历二叉树的方法
- Python 应用领域
- 燃烧学往年精选真题解析2018-01-01
- Scala算术运算符细节说明
- 通过暴露出来的OA和github信息拿Shell
- GA,RC,Alpha,Beta,Final等软件版本名词释义
- Spring之事务控制
- access orcad 数据库_OrCAD Capture CIS使用MySQL数据库
- Windows python2.7虚拟环境下的PyV8安装
- APP测试点(思维导图)
- 情人节程序员用HTML网页表白【表白对话】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
- matlab 求特征值的命令,matlab怎么求特征值
- git push 报错 remote: error: hook declined to update
- STM32制作FLASH字库
- WTL 自绘控件库 (CQsAnimaStatic)
- 【Serenity BDD】Serenity 2.2.0 版本变动说明及相应的配置变动
- 接口和抽象类练习:教练和运动员案例: (1)人员:乒乓球运动员和篮球运动员。乒乓球教练和篮球教练。 (2)为了出国交流,跟乒乓球相关的人员都需要学习英语。 请用所学知识分析,设计类和接口。
- android使用fir.im实现版本更新