最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2020年03月26日 10:17:27   作者:Silicon_Valley_DH  
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)帶節(jié)點(diǎn)的進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

首先定義一些需要的屬性

/**
 * 背景畫筆
 */
 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;
 /**
 * 兩個節(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;
 }
 //測量文字所占用的空間
 measureText();
 }

 /**
 * 設(shè)置選中位置
 * @param selectIndex
 */
 public void setSelectIndex(int selectIndex){
 this.selectIndex = selectIndex;
 invalidate();
 }
/**
 * 測量文字的長寬
 */
 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);
 }
 }

最后重要的步驟,開始在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)上的圓和兩個節(jié)點(diǎn)之間的間隔線條

//畫節(jié)點(diǎn)圓
 //每個圓相隔的距離
 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)度條

只需要修改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)切換,把注釋打開就行了
@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;
 }

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Android中Shape的用法詳解

    Android中Shape的用法詳解

    工作中總是會用到shape去畫一些背景,每次都要去百度,但是很多都寫的很模糊或者屬性不是很全,所以今天自己總結(jié)了一下,給大家分享一下,自己以后也可以看
    2017-07-07
  • Android的ListView多選刪除操作實(shí)現(xiàn)代碼

    Android的ListView多選刪除操作實(shí)現(xiàn)代碼

    這篇文章主要為大家詳細(xì)介紹了Android的ListView多選刪除操作實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-05-05
  • 從零開始學(xué)android小示例程序

    從零開始學(xué)android小示例程序

    這篇文章主要介紹了一個學(xué)習(xí)android開發(fā)的小示例程序,需要的朋友可以參考下
    2014-02-02
  • Flutter框架解決盒約束widget和assets里加載資產(chǎn)技術(shù)

    Flutter框架解決盒約束widget和assets里加載資產(chǎn)技術(shù)

    這篇文章主要為大家介紹了Flutter框架解決盒約束widget和assets里加載資產(chǎn)技術(shù)運(yùn)用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android中判斷網(wǎng)絡(luò)連接是否可用及監(jiān)控網(wǎng)絡(luò)狀態(tài)

    Android中判斷網(wǎng)絡(luò)連接是否可用及監(jiān)控網(wǎng)絡(luò)狀態(tài)

    獲取網(wǎng)絡(luò)信息需要在AndroidManifest.xml文件中加入相應(yīng)的權(quán)限,接下來詳細(xì)介紹Android中判斷網(wǎng)絡(luò)連接是否可用及監(jiān)控網(wǎng)絡(luò)狀態(tài),感興趣的朋友可以參考下
    2012-12-12
  • Android發(fā)布項(xiàng)目到j(luò)itpack的完整步驟

    Android發(fā)布項(xiàng)目到j(luò)itpack的完整步驟

    這篇文章主要給大家介紹了關(guān)于Android發(fā)布項(xiàng)目到j(luò)itpack的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-01-01
  • Android自定義扇形倒計(jì)時(shí)實(shí)例代碼

    Android自定義扇形倒計(jì)時(shí)實(shí)例代碼

    最近工作中需要做一個倒計(jì)時(shí),是那種一個圓,慢慢的被吃掉的動畫倒計(jì)時(shí),由于自己是android小白,效果還不是多滿意,先給大家分享實(shí)例代碼,僅供大家參考
    2017-03-03
  • android自定義view實(shí)現(xiàn)鐘表效果

    android自定義view實(shí)現(xiàn)鐘表效果

    這篇文章主要為大家詳細(xì)介紹了android自定義view實(shí)現(xiàn)鐘表效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Android控件RadioButton實(shí)現(xiàn)多選一功能

    Android控件RadioButton實(shí)現(xiàn)多選一功能

    這篇文章主要為大家詳細(xì)介紹了Android控件RadioButton實(shí)現(xiàn)多選一功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • Android實(shí)現(xiàn)藍(lán)牙串口通訊

    Android實(shí)現(xiàn)藍(lán)牙串口通訊

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)藍(lán)牙串口通訊,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08

最新評論

碌曲县| 太康县| 罗源县| 磴口县| 呈贡县| 盖州市| 莆田市| 隆回县| 离岛区| 阿合奇县| 泾川县| 三明市| 吉安县| 普宁市| 六盘水市| 高雄县| 鲜城| 武川县| 沿河| 柞水县| 西吉县| 安岳县| 资溪县| 南昌市| 尉犁县| 平原县| 彰化县| 南阳市| 鲜城| 济南市| 沽源县| 柞水县| 安庆市| 石棉县| 深泽县| 阳山县| 娱乐| 清远市| 商南县| 扶余县| 柳江县|