电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

Android自定義圓點指示器

瀏覽:2日期:2022-09-18 09:08:48

本文實例為大家分享了Android自定義圓點指示器的具體代碼,供大家參考,具體內(nèi)容如下

先上效果圖

Android自定義圓點指示器

大概思路就是自定義View 從左至右繪制圓點 然后在ViewPager的OnPageChangeListener中設(shè)置當前頁面的圓點

下面是代碼

先定義屬性

<resources> <attr name='selectedColor' format='color'/> <attr name='unselectedColor' format='color'/> <declare-styleable name='Indicator'><attr name='selectedColor'/><attr name='unselectedColor'/> </declare-styleable></resources>

接下來是自定義的View

public class Indicator extends View{ private static final int DEFAULT_TOTAL_INDEX = 5; private static final int DEFAULT_CURRENT_INDEX = 0; private static final int DEFAULT_CIRCLE_DISTANCE = 40; private static final int DEFAULT_CIRCLE_RADIUS = 8; private static final int DEFAULT_CIRCLE_SELECTED_RADIUS = 11; private int selectedColor; private int unselectedColor; private int currentIndex; private int totalIndex; private Paint paint; private int startX; private int startSelectedY; private int startY; private int centreX; public Indicator(Context context) {this(context,null); } public Indicator(Context context, AttributeSet attrs) {this(context, attrs,0); } public Indicator(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs,R.styleable.Indicator,defStyleAttr,0);selectedColor = typedArray.getColor(R.styleable.Indicator_selectedColor, Color.LTGRAY);unselectedColor = typedArray.getColor(R.styleable.Indicator_unselectedColor,Color.WHITE);typedArray.recycle();totalIndex = DEFAULT_TOTAL_INDEX;currentIndex = DEFAULT_CURRENT_INDEX;paint = new Paint(); }

從TypedArray中獲取自定義的屬性,totalIndex是總的圓點個數(shù),currentIndex是當前頁面的圓點接下來是重寫的OnDraw()方法

@Override protected void onDraw(Canvas canvas) {super.onDraw(canvas);centreX = getWidth() / 2;startSelectedY = getHeight() / 2 - DEFAULT_CIRCLE_SELECTED_RADIUS;startY = getHeight() / 2 - DEFAULT_CIRCLE_RADIUS;if (totalIndex % 2 == 0){ startX = centreX - (int)(1.0 * (totalIndex - 1)/2 * DEFAULT_CIRCLE_DISTANCE);}else{ startX = centreX - totalIndex / 2 * DEFAULT_CIRCLE_DISTANCE;}paint.setAntiAlias(true);paint.setColor(unselectedColor);int tempX = startX;for(int i = 0 ; i < totalIndex ; i++ ){ RectF rectF = new RectF(tempX - DEFAULT_CIRCLE_RADIUS,startY, tempX + DEFAULT_CIRCLE_RADIUS,startY + 2 * DEFAULT_CIRCLE_RADIUS); if (i == currentIndex) {paint.setColor(selectedColor);rectF = new RectF(tempX - DEFAULT_CIRCLE_SELECTED_RADIUS,startSelectedY,tempX + DEFAULT_CIRCLE_SELECTED_RADIUS,startSelectedY + 2 * DEFAULT_CIRCLE_SELECTED_RADIUS); } canvas.drawOval(rectF,paint); if (paint.getColor() == selectedColor)paint.setColor(unselectedColor); tempX += DEFAULT_CIRCLE_DISTANCE;} }

因為當前頁面的圓點和未選中頁面的圓點要設(shè)置不同的大小 所以分別設(shè)置每個圓點的坐標 然后用for循環(huán)繪制圓點這里有一點要注意 new RectF() 的四個參數(shù)分別是圓點外面的矩形的左上角的X,Y和右下角的X,Y

接下來是設(shè)置當前頁面的圓點的方法

public void setCurrentIndex(int currentIndex){//if (currentIndex < 0)// currentIndex += totalIndex ;//if (currentIndex > totalIndex - 1)// currentIndex %= totalIndex;this.currentIndex = currentIndex;invalidate(); }

注釋里的代碼是當頁面可以循環(huán)的時候設(shè)置的接下來是設(shè)置總的圓點個數(shù)的方法

public void setTotalIndex(int totalIndex){int oldTotalIndex = this.totalIndex;if (totalIndex < 1) return;if (totalIndex < oldTotalIndex){ if (currentIndex == totalIndex )currentIndex = totalIndex - 1;}this.totalIndex = totalIndex;invalidate(); }

當刪除圓點的時候 如果currentIndex是最后一個 讓currentIndex向前移動接下來是重寫的OnMeasure()方法

@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(measureWidth(widthMeasureSpec),measureHeight(heightMeasureSpec)); } private int measureHeight(int measureSpec){int result;int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);int desired = DEFAULT_CIRCLE_SELECTED_RADIUS * 2 + getPaddingBottom() + getPaddingTop();if(specMode == MeasureSpec.EXACTLY) { result = Math.max(desired,specSize);}else{ if(specMode == MeasureSpec.AT_MOST){result = Math.min(desired,specSize); } else result = desired;}return result; } private int measureWidth(int measureSpec){int result;int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);int desired = (totalIndex - 1) * DEFAULT_CIRCLE_DISTANCE + DEFAULT_CIRCLE_SELECTED_RADIUS * 2 + getPaddingLeft() + getPaddingRight();if(specMode == MeasureSpec.EXACTLY) { result = Math.max(desired,specSize);}else{ if(specMode == MeasureSpec.AT_MOST){result = Math.min(desired,specSize); }else result = desired;}return result; }

下面是MainActivity的布局代碼,很簡單

<RelativeLayout xmlns:android='http://schemas.android.com/apk/res/android' xmlns:tools='http://schemas.android.com/tools' xmlns:app='http://schemas.android.com/apk/res-auto' android:layout_width='match_parent' android:layout_height='match_parent' tools:context='com.example.lzh123.learnviewpager.MainActivity'> <android.support.v4.view.ViewPagerandroid: android:layout_width='match_parent'android:layout_height='match_parent'/> <com.example.lzh123.learnviewpager.Indicatorapp:selectedColor='#FFFFFF'app:unselectedColor='#C7C7C7'android: android:layout_centerInParent='true'android:layout_width='wrap_content'android:layout_height='wrap_content' /> </RelativeLayout>

下面是MainActivity的代碼

public class MainActivity extends AppCompatActivity { View layout1,layout2,layout3; ViewPager viewPager; Indicator indicator; List<View> viewList; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main); viewPager = (ViewPager) findViewById(R.id.viewPager);LayoutInflater inflater = getLayoutInflater();layout1 = inflater.inflate(R.layout.layout1,null);layout2 = inflater.inflate(R.layout.layout2,null);layout3 = inflater.inflate(R.layout.layout3,null); viewList = new ArrayList<>();viewList.add(layout1);viewList.add(layout2);viewList.add(layout3); indicator = (Indicator) findViewById(R.id.indicator);indicator.setTotalIndex(viewList.size());PagerAdapter pagerAdapter = new PagerAdapter() { @Override public int getCount() {return viewList.size(); } @Override public void destroyItem(ViewGroup container, int position, Object object) {container.removeView(viewList.get(position)); } @Override public Object instantiateItem(ViewGroup container, int position) {container.addView(viewList.get(position)); return position; } @Override public boolean isViewFromObject(View view, Object object) {return view == viewList.get(Integer.parseInt(object.toString())); }}; viewPager.setAdapter(pagerAdapter);viewPager.setOnPageChangeListener(new PageChangeListener()); } public class PageChangeListener implements ViewPager.OnPageChangeListener{ @Overridepublic void onPageSelected(int position) { indicator.setCurrentIndex(position);} @Overridepublic void onPageScrollStateChanged(int state) { } @Overridepublic void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } }

ViewPager里添加了三個空頁面 然后設(shè)置指示器的圓點個數(shù),最后在ViewPager的OnPageChangeListener中設(shè)置當前的 頁面的圓點。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Android
相關(guān)文章:
主站蜘蛛池模板: 粉末包装机-给袋式包装机-全自动包装机-颗粒-液体-食品-酱腌菜包装机生产线【润立机械】 | 二手光谱仪维修-德国OBLF光谱仪|进口斯派克光谱仪-热电ARL光谱仪-意大利GNR光谱仪-永晖检测 | 气密性检测仪_气密性检测设备_防水测试仪_密封测试仪-岳信仪器 | 粉末冶金-粉末冶金齿轮-粉末冶金零件厂家-东莞市正朗精密金属零件有限公司 | 视频直播 -摄影摄像-视频拍摄-直播分发 | 上海办公室装修,办公楼装修设计,办公空间设计,企业展厅设计_写艺装饰公司 | 玻璃钢格栅盖板|玻璃钢盖板|玻璃钢格栅板|树篦子-长沙川皖玻璃钢制品有限公司 | 电抗器-能曼电气-电抗器专业制造商 | 成都竞价托管_抖音代运营_网站建设_成都SEM外包-成都智网创联网络科技有限公司 | 微水泥_硅藻泥_艺术涂料_艺术漆_艺术漆加盟-青岛泥之韵环保壁材 武汉EPS线条_EPS装饰线条_EPS构件_湖北博欧EPS线条厂家 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 中药二氧化硫测定仪,食品二氧化硫测定仪|俊腾百科 | 除甲醛公司-甲醛检测-广西雅居环境科技有限公司 | 软瓷_柔性面砖_软瓷砖_柔性石材_MCM软瓷厂家_湖北博悦佳软瓷 | 辐射仪|辐射检测仪|辐射巡测仪|个人剂量报警仪|表面污染检测仪|辐射报警仪|辐射防护网 | 杭州月嫂技术培训服务公司-催乳师培训中心报名费用-产后康复师培训机构-杭州优贝姆健康管理有限公司 | 房屋质量检测-厂房抗震鉴定-玻璃幕墙检测-房屋安全鉴定机构 | PCB厂|线路板厂|深圳线路板厂|软硬结合板厂|电路板生产厂家|线路板|深圳电路板厂家|铝基板厂家|深联电路-专业生产PCB研发制造 | 海南在线 海南一家 | RS系列电阻器,RK_RJ启动调整电阻器,RQ_RZ电阻器-上海永上电器有限公司 | 陕西鹏展科技有限公司| 泰国试管婴儿_泰国第三代试管婴儿费用|成功率|医院—新生代海外医疗 | 送料机_高速冲床送料机_NC伺服滚轮送料机厂家-东莞市久谐自动化设备有限公司 | 钢制拖链生产厂家-全封闭钢制拖链-能源钢铝拖链-工程塑料拖链-河北汉洋机械制造有限公司 | 亮化工程,亮化设计,城市亮化工程,亮化资质合作,长沙亮化照明,杰奥思【官网】 | 插针变压器-家用电器变压器-工业空调变压器-CD型电抗器-余姚市中驰电器有限公司 | 胶原检测试剂盒,弹性蛋白检测试剂盒,类克ELISA试剂盒,阿达木单抗ELISA试剂盒-北京群晓科苑生物技术有限公司 | 水性绝缘漆_凡立水_绝缘漆树脂_环保绝缘漆-深圳维特利环保材料有限公司 | 新型锤式破碎机_新型圆锥式_新型颚式破碎机_反击式打沙机_锤式制砂机_青州建源机械 | 冷镦机-多工位冷镦机-高速冷镦机厂家-温州金诺机械设备制造有限公司 | jrs高清nba(无插件)直播-jrs直播低调看直播-jrs直播nba-jrs直播 上海地磅秤|电子地上衡|防爆地磅_上海地磅秤厂家–越衡称重 | 厂房出租-厂房规划-食品技术-厂房设计-厂房装修-建筑施工-设备供应-设备求购-龙爪豆食品行业平台 | 协议书_协议合同格式模板范本大全 | 北京四合院出租,北京四合院出售,北京平房买卖 - 顺益兴四合院 | 河南砖机首页-全自动液压免烧砖机,小型砌块水泥砖机厂家[十年老厂] | 筒瓦厂家-仿古瓦-寺庙-古建琉璃瓦-宜兴市古典园林建筑陶瓷厂有限公司 | 熔体泵_熔体出料泵_高温熔体泵-郑州海科熔体泵有限公司 | 沟盖板_复合沟盖板厂_电力盖板_树脂雨水篦子-淄博拜斯特 | 健康管理师报考条件,考试时间,报名入口—首页 | 蒸汽热收缩机_蒸汽发生器_塑封机_包膜机_封切收缩机_热收缩包装机_真空机_全自动打包机_捆扎机_封箱机-东莞市中堡智能科技有限公司 | 紫外可见光分光度计-紫外分光度计-分光光度仪-屹谱仪器制造(上海)有限公司 |