国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

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

Android實(shí)現(xiàn)帶節(jié)點(diǎn)的進(jìn)度條

瀏覽:78日期:2022-09-25 13:22:03

日常的開(kāi)發(fā)中經(jīng)常會(huì)需要用到自定義View,這次剛好有個(gè)需求,需要用到帶有節(jié)點(diǎn)的進(jìn)度條。東西很簡(jiǎn)單直接繼承View就行了。

Android實(shí)現(xiàn)帶節(jié)點(diǎn)的進(jìn)度條

首先定義一些需要的屬性

/** * 背景畫筆 */ private Paint bgPaint; /** * 前景畫筆 */ private Paint forePaint; /** * 選中畫筆 */ private Paint selectPaint; /** * 未選中畫筆 */ private Paint unselectPaint; /** * 背景顏色 */ private int bgColor = Color.parseColor('#9C9C9C'); /** * 前景顏色 */ private int foreColor = Color.parseColor('#8A2BE2'); /** * 默認(rèn)高度 */ private int defaultHeight; /** * 節(jié)點(diǎn)文字 */ private List<String> nodeList; private List<Rect> mBounds; /** * 節(jié)點(diǎn)圓的半徑 */ private int radius; /** * 文字和節(jié)點(diǎn)進(jìn)度條的top */ private int marginTop; /** * 兩個(gè)節(jié)點(diǎn)之間的距離 */ private int dividWidth; /** * 選中位置 */ private int selectIndex;

然后在構(gòu)造方法中初始化這些數(shù)據(jù)

private void init(Context context) { radius = SizeUtils.dp2px(context,4); defaultHeight = SizeUtils.dp2px(context,30); marginTop = SizeUtils.dp2px(context,5); bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG); bgPaint.setColor(bgColor); bgPaint.setStyle(Paint.Style.FILL); forePaint = new Paint(Paint.ANTI_ALIAS_FLAG); forePaint.setColor(foreColor); forePaint.setStyle(Paint.Style.FILL); unselectPaint = new Paint(Paint.ANTI_ALIAS_FLAG); unselectPaint.setColor(bgColor); unselectPaint.setTextSize(SizeUtils.sp2px(context,10)); selectPaint = new Paint(Paint.ANTI_ALIAS_FLAG); selectPaint.setColor(foreColor); selectPaint.setTextSize(SizeUtils.sp2px(context,10)); }

設(shè)置節(jié)點(diǎn)文字

/** * 設(shè)置數(shù)據(jù) * @param nodeDatas */ public void setNodeList(List<String> nodeDatas){ if(nodeDatas != null){ nodeList = nodeDatas; } //測(cè)量文字所占用的空間 measureText(); } /** * 設(shè)置選中位置 * @param selectIndex */ public void setSelectIndex(int selectIndex){ this.selectIndex = selectIndex; invalidate(); }/** * 測(cè)量文字的長(zhǎng)寬 */ private void measureText(){ mBounds = new ArrayList<>(); for (int i = 0; i < nodeList.size(); i++) { Rect mBound = new Rect(); unselectPaint.getTextBounds(nodeList.get(i),0,nodeList.get(i).length(),mBound); mBounds.add(mBound); } }

最后重要的步驟,開(kāi)始在onDraw中繪制節(jié)點(diǎn)進(jìn)度條和繪制文字

1、繪制灰色背景線條

if(nodeList == null || nodeList.isEmpty()){ return; } bgPaint.setStrokeWidth(radius/2); //繪制灰色的背景線條 canvas.drawLine(radius,radius,getWidth()-radius,radius,bgPaint);

2、繪制節(jié)點(diǎn)上的圓和兩個(gè)節(jié)點(diǎn)之間的間隔線條

//畫節(jié)點(diǎn)圓 //每個(gè)圓相隔的距離 dividWidth = (getWidth()-radius*2)/(nodeList.size() - 1); forePaint.setStrokeWidth(radius/2); for (int i = 0; i < nodeList.size(); i++) { if(i == selectIndex){ for (int j = 0; j <= i; j++) { canvas.drawCircle(radius+ j * dividWidth, radius, radius , forePaint); canvas.drawLine(radius,radius,j*dividWidth,radius,forePaint); } }else if(i>selectIndex){ canvas.drawCircle(radius + i * dividWidth, radius, radius, bgPaint); } }

3、繪制節(jié)點(diǎn)上的文字

for (int i = 0; i < nodeList.size(); i++) { int currentTextWidth=mBounds.get(i).width(); if (i==0){ if (i==selectIndex){ canvas.drawText(nodeList.get(i), 0, radius*2 + marginTop + mBounds.get(i).height()/2, selectPaint); }else if(i>selectIndex) { canvas.drawText(nodeList.get(i), 0, radius*2 + marginTop + mBounds.get(i).height()/2, unselectPaint); } }else if (i==nodeList.size()-1){ if (i==selectIndex){ for (int j = 0; j <= i; j++) { if(j == 0){ canvas.drawText(nodeList.get(j), 0, radius*2 + marginTop + mBounds.get(j).height()/2, selectPaint); }else if(j == i){ canvas.drawText(nodeList.get(j), getWidth() - currentTextWidth, radius*2 + marginTop + mBounds.get(j).height()/2, selectPaint); }else{ canvas.drawText(nodeList.get(j), radius + j * dividWidth - currentTextWidth / 2, radius*2 + marginTop + mBounds.get(j).height()/2, selectPaint); } } }else if(i>selectIndex) { canvas.drawText(nodeList.get(i), getWidth() - currentTextWidth, radius*2 + marginTop + mBounds.get(i).height()/2, unselectPaint); } }else { if (i==selectIndex){ for (int j = 0; j <= i; j++) { if(j>0){ canvas.drawText(nodeList.get(j), radius + j * dividWidth - currentTextWidth / 2, radius*2 + marginTop + mBounds.get(j).height()/2, selectPaint); }else{ canvas.drawText(nodeList.get(j), 0, radius*2 + marginTop + mBounds.get(j).height()/2, selectPaint); } } }else if(i>selectIndex) { canvas.drawText(nodeList.get(i), radius + i * dividWidth - currentTextWidth / 2, radius*2 + marginTop + mBounds.get(i).height()/2, unselectPaint); } } }

有時(shí)候可能需要的是下面這種進(jìn)度條

Android實(shí)現(xiàn)帶節(jié)點(diǎn)的進(jìn)度條

只需要修改onDraw中繪制節(jié)點(diǎn)圓和文字的方法就可以了

for (int i=0; i < nodeList.size();i++) { if (i==selectIndex){ canvas.drawCircle(radius+ i * dividWidth, radius, radius , forePaint); }else { canvas.drawCircle(radius + i * dividWidth, radius, radius, bgPaint); } } for (int i=0; i<nodeList.size();i++){ int currentTextWidth=mBounds.get(i).width(); if (i==0){ if (i==selectIndex){ canvas.drawText(nodeList.get(i), 0, radius*2 + marginTop + mBounds.get(i).height()/2, selectPaint); }else { canvas.drawText(nodeList.get(i), 0, radius*2 + marginTop + mBounds.get(i).height()/2, unselectPaint); } }else if (i==nodeList.size()-1){ if (i==selectIndex){ canvas.drawText(nodeList.get(i), getWidth() - currentTextWidth, radius*2 + marginTop + mBounds.get(i).height()/2, selectPaint); }else { canvas.drawText(nodeList.get(i), getWidth() - currentTextWidth, radius*2 + marginTop + mBounds.get(i).height()/2, unselectPaint); } }else { if (i==selectIndex){ canvas.drawText(nodeList.get(i), radius + i * dividWidth - currentTextWidth / 2, radius*2 + marginTop + mBounds.get(i).height()/2, selectPaint); }else { canvas.drawText(nodeList.get(i), radius + i * dividWidth - currentTextWidth / 2, radius*2 + marginTop + mBounds.get(i).height()/2, unselectPaint); } } }

點(diǎn)擊節(jié)點(diǎn)進(jìn)行節(jié)點(diǎn)切換

// 實(shí)現(xiàn)節(jié)點(diǎn)切換,把注釋打開(kāi)就行了@Override public boolean onTouchEvent(MotionEvent event) { float eventX; float eventY; int i = event.getAction(); if (i == MotionEvent.ACTION_DOWN) { } else if (i == MotionEvent.ACTION_MOVE) { } else if (i == MotionEvent.ACTION_UP) { eventX = event.getX(); eventY = event.getY(); //計(jì)算選中的index float select = eventX / dividWidth; float xs = select - (int) (select); //selectIndex = (int) select + (xs > 0.5 ? 1 : 0); } //invalidate(); return true; }

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Android
相關(guān)文章:
主站蜘蛛池模板: 亚洲伊人久久综合影院2021 | 亚洲一区二区三区四区在线观看 | 久草视频网站 | 亚洲成人免费在线视频 | 免费看一级视频 | 欧美黄a | 久久不见久久见免费影院www日本 | 亚洲免费在线 | 国内三级视频 | 成年人视频在线免费看 | 亚洲综合干| 九九在线偷拍视频在线播放 | 欧美成人亚洲高清在线观看 | 操欧美美女| 欧美freesex10一13黑人 | 国内精品自产拍在线观看91 | 亚洲三级小视频 | 一级女性生活片 | 国产欧美一区二区日本加勒比 | 欧美视频一区二区三区四区 | 久久香蕉国产线看观看式 | 中文字幕亚洲综合久久男男 | 美国一级毛片片aa成人 | 国内精品久久久久久影院8f | 亚洲免费人成在线视频观看 | 亚洲夜色夜色综合网站 | 精品国产呦系列在线看 | 久草热草 | 午夜欧美成人久久久久久 | 亚洲天天| 韩国一级特黄清高免费大片 | 精品视自拍视频在线观看 | 另类视频综合 | 国产网站免费在线观看 | 波多野结衣在线观看3人 | 亚洲男人的天堂久久香蕉 | 国产精品福利午夜h视频 | 久草在线视频首页 | 国产不卡a | 高清一级淫片a级中文字幕 高清一区二区 | 特级毛片aaaa级毛片免费 |