android之自定义圆形进度条

冰糖葫芦三剑客 冰糖葫芦三剑客     2022-10-20     585

关键词:


       

Android开发中,对于进度条想必大家不会陌生。例如,应用在执行一个耗时操作时,会通过展示一个进度条来显示“加载中...”的动画作为友好页面以提高用户体验。对于这样的进度条,最简单的实现方式就是通过美工给我们切几张不同的图片,最后通过帧动画的方式来实现。通过帧动画实现固然可以,但是对美工的依赖很大。所以今天在这里给大家介绍通过自定义控件来实现一个圆形的进度条。


下载地址: http://download.csdn.net/detail/shenggaofei/9622419

先看效果图:



1. 在res/values目录下创建一个attrs.xml的文件,自定义控件的样式:

[html]  view plain  copy  print ?
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <resources>  
  3.   
  4.     <attr name="pointWidth" format="dimension|reference" />  
  5.     <attr name="circleColor" format="color|reference" />  
  6.     <attr name="pointColor" format="color|reference" />  
  7.     <attr name="centerImage" format="reference" />  
  8.   
  9.     <declare-styleable name="ProgressView">  
  10.         <attr name="pointWidth"/>  
  11.         <attr name="circleColor"/>  
  12.         <attr name="pointColor"/>  
  13.         <attr name="centerImage"/>  
  14.     </declare-styleable>  
  15.   
  16. </resources>  

2. 创建一个类继承自View,在构造方法中获得自定义属性:

[java]  view plain  copy  print ?
  1. public ProgressView(Context context, AttributeSet attrs, int defStyle)   
  2.         super(context, attrs, defStyle);  
  3.   
  4.         /** 
  5.          * 获得属性 
  6.          */  
  7.         TypedArray typedArray = context.getTheme().obtainStyledAttributes(  
  8.                 attrs, R.styleable.ProgressView, defStyle, 0);  
  9.         int count = typedArray.getIndexCount();  
  10.         for (int i = 0; i < count; i++)   
  11.             int attr = typedArray.getIndex(i);  
  12.             switch (attr)   
  13.             case R.styleable.ProgressView_pointWidth:  
  14.                 mPointWidth = typedArray.getDimensionPixelSize(attr,  
  15.                         (int) TypedValue.applyDimension(  
  16.                                 TypedValue.COMPLEX_UNIT_SP, 16, getResources()  
  17.                                         .getDisplayMetrics()));  
  18.                 break;  
  19.             case R.styleable.ProgressView_circleColor:  
  20.                 mCircleColor = typedArray.getColor(attr, Color.BLACK);  
  21.                 break;  
  22.             case R.styleable.ProgressView_pointColor:  
  23.                 mPointColor = typedArray.getColor(attr, Color.GREEN);  
  24.                 break;  
  25.             case R.styleable.ProgressView_centerImage:  
  26.                 mCenterImage = BitmapFactory.decodeResource(getResources(),  
  27.                         typedArray.getResourceId(attr, 0));  
  28.                 break;  
  29.               
  30.           
  31.         typedArray.recycle();  
  32.         initPaint();  
  33.       


3. 重写ondraw方法:

[java]  view plain  copy  print ?
  1. @Override  
  2.     protected void onDraw(Canvas canvas)   
  3.         super.onDraw(canvas);  
  4.         mWidth = getWidth();  
  5.         mHeight = getHeight();  
  6.         mViewSize = Math.min(mWidth, mHeight) - mPointWidth;  
  7.   
  8.         // 计算中间圆形大小  
  9.         int left = (mWidth - mViewSize) / 2;  
  10.         int top = (mHeight - mViewSize) / 2;  
  11.         int right = left + mViewSize;  
  12.         int bottom = top + mViewSize;  
  13.         mRect = new Rect(left, top, right, bottom);  
  14.         mRectf = new RectF(mRect);  
  15.   
  16.         // 绘制中间图片  
  17.         drawBitmap(canvas);  
  18.           
  19.         // 绘制圆环  
  20.         canvas.drawArc(mRectf, mStartAngle, mDestAngle, false, mCirclePaint);  
  21.   
  22.         //绘制终点位置圆形  
  23.         drawCicle(canvas);  
  24.       

在ondraw中提供有三个步骤:
  1. 绘制中间的圆形图片
  2. 绘制圆环
  3. 绘制终点圆形图标

1、绘制中间的圆形图片

[java]  view plain  copy  print ?
  1. <span style="white-space:pre">    </span>/** 
  2.      * 绘制中间圆形图片 
  3.      * @param canvas 
  4.      */  
  5.     private void drawBitmap(Canvas canvas)   
  6. 查看详情

    如何更改圆形进度条的颜色?

    ...gressbar?【发布时间】:2011-07-1707:03:54【问题描述】:我在Android上使用循环进度条。我想改变它的颜色。我正在使用"?android:attr/progressBarStyleLargeInverse"风格。那么如何改变进度条的颜色呢。如何自定义样式?另外,风格的定义是什... 查看详情

    圆形进度条 Android

    】圆形进度条Android【英文标题】:CircularProgressBarAndroid【发布时间】:2015-06-0320:06:35【问题描述】:我想创建一个分段的圆形进度条,其行为类似于倒数计时器,这样每个分段都有自己的时间限制。有一个iOS应用pTimer+,我想在An... 查看详情

    带圆角的 Android 圆形进度条

    】带圆角的Android圆形进度条【英文标题】:Androidcircularprogressbarwithroundedcorners【发布时间】:2016-08-0623:37:54【问题描述】:我正在尝试获得一个带有圆角的圆形进度条,如下所示。但到目前为止,我无法获得圆角,我能够获得圆... 查看详情

    如何使用逆时针动画显示自定义圆形进度条?

    】如何使用逆时针动画显示自定义圆形进度条?【英文标题】:HowtodisplaycustomcircularprogressbarwithAnti-Clockwiseanimation?【发布时间】:2014-07-0313:54:48【问题描述】:我正在使用与测验相关的应用程序。此处将显示自定义圆形进度条,... 查看详情

    带有实心圆圈的自定义圆形进度条

    】带有实心圆圈的自定义圆形进度条【英文标题】:CustomCircularProgressBarwithsolidcircles【发布时间】:2015-05-1505:52:21【问题描述】:我想要一个这样的圆形进度条我试过了,但它看起来不像圆形以及如何将动画与淡入淡出一起放置... 查看详情

    android中的圆形进度条

    】android中的圆形进度条【英文标题】:Circularprogressbarinandroid【发布时间】:2015-09-1318:26:05【问题描述】:我想实现一些圆形进度条,中间有一个按钮,就像在whatsapp中一样。有谁知道一个好的图书馆来实现这一点?我想要完成... 查看详情

    android进阶之自定义view(文字圆形边框)(代码片段)

    最近写自定义的view写了很多,打算好好完整学习一下,顺便也是记录下,首先来看看效果大概是实现上面的效果吧,其实做起来很简单,只需要继承TextView,然后在外面画上一个框即可,代码如下:public... 查看详情

    C# 自定义控件(圆形进度条) Xamarin Forms

    】C#自定义控件(圆形进度条)XamarinForms【英文标题】:C#customcontrol(circleprogressbar)XamarinForms【发布时间】:2016-09-1916:15:35【问题描述】:我想知道用XamarinForms创建与此图像类似的东西的最佳方法:我从来没有创造过这样的东西。... 查看详情

    如何在android中实现材料设计圆形进度条

    】如何在android中实现材料设计圆形进度条【英文标题】:Howtoimplementamaterialdesigncircularprogressbarinandroid【发布时间】:2015-01-0501:04:38【问题描述】:我想制作一个类似于InboxbyGmailandroid应用中的MaterialDesign圆形进度条。我如何实现... 查看详情

    酷炫进度条自定义seekbar(代码片段)

    ...c;是这样子的:需求:1、看了ui图可以知道这类似android自带的seekbar控件,2、一个水平进度条和一个圆形进度条;3、圆形进度条显示环形刻度和当前进度值;4、并且圆形进度可滑动操作;最终实现效果ÿ... 查看详情

    圆形半径的Android进度条动态变化

    】圆形半径的Android进度条动态变化【英文标题】:AndroidProgressbarwithcircleradiuschangesDynamically【发布时间】:2012-02-2212:53:06【问题描述】:我想根据滑块位置更改圆半径我分别创建了这两个。同时将circle方法应用于进度条。面临错... 查看详情

    首页2--动态自定义圆形进度条

    A.绘制圆环,圆弧,文本//1.画圆环//原点坐标floatcircleX=width/2;floatcircleY=width/2;//半径floatradius=width/2-roundWidth/2;//设置画笔的属性paint.setColor(roundColor);paint.setStrokeWidth(roundWidth);paint.setStyle(Paint.Style. 查看详情

    composecanvas自定义圆形进度条(代码片段)

    @ComposablefunCircleRing(boxWidthDp:Int,viewModel:TaskViewModel)Canvas(modifier=Modifier.size(boxWidthDp.dp),onDraw=valstrokWidth=30F//灰色背景drawArc(Color(0,0,0,15),startAngle=160f,s 查看详情

    酷炫进度条自定义seekbar

    ...c;是这样子的:需求:1、看了ui图可以知道这类似android自带的seekbar控件,2、一个水平进度条和一个圆形进度条;3、圆形进度条显示环形刻度和当前进度值 查看详情

    如何在Android中创建一个在其上旋转的圆形进度条?

    】如何在Android中创建一个在其上旋转的圆形进度条?【英文标题】:HowtoCreateacircularprogressbarinAndroidwhichrotatesonit?【发布时间】:2014-02-1512:25:24【问题描述】:我正在尝试创建一个圆形进度条。这就是我想要实现的目标有一个灰... 查看详情

    ios制作个圆形进度条

    参考技术A1.需要做个这样的圆形进度条 自定义弹窗view就不说了,主要是这个圆形进度view,底色是灰色然后有进度灰色被黑色覆盖或者说变成黑色首先我们自定一个view,加个uilabel做进度lbael@property(nonatomic,strong)UILabel*percentLabel;/... 查看详情

    android进度条样式怎么改

    Android系统提供了两大类进度条样式,长形进度条(progressBarStyleHorizontal)和圆形进度条(progressBarStyleLarge)。android进度条样式更改:第一种(默认样式(中等圆形))第二种(长方形进度条)进度条用处很多,比如,应用程序装载资源... 查看详情