今天看到同学项目中有一个显示金额百分比的图片,看了一下觉得应该用自定义View来做,正好我也在学习自定义View,那么久抓过来学习一下吧。
        首先我们先看一下效果图吧:

       用黄色的弧形标识当前金额占总金额的百分比,然后用一个黄色的圆圈将百分比显示出来。
想了一下感觉不难,先说一下大致思路吧:
一、定义View需要的属性并在代码中找到这些属性
二、画出灰色的圆弧;
三、根据金额所占比重画出黄色的小圆弧;
四、根据圆弧终点的位置画出小圆圈来(也包括其中的文字)。

总体就先分为这四个步骤吧,
    首先让我们来做第一个步骤(定义我们需要的属性),大致统计一下应该有一下几个:总金额;余额;黄色弧形的颜色,百分比字体大小,弧形宽度。在res/values/  下建立一个attrs.xml,在这里面定义我们View的属性。
<?xml version="1.0" encoding="utf-8"?>
<resources><attr name="sum" format="integer" /><attr name="remain_sum" format="integer" /><attr name="circleWidth" format="dimension" /><attr name="smaleCircleColor" format="color" /><attr name="textSize" format="dimension"></attr><declare-styleable name="circleView"><attr name="sum" /><attr name="remain_sum" /><attr name="circleWidth" /><attr name="textSize" /><attr name="smaleCircleColor" /></declare-styleable></resources>

定义好我们所需要的参数了,我们接下来我们就要找到我们定义的属性,

  private int smallCircleColor;private floatsum;private floatremain_sum;private int textSize;private int circleWidth;private Paint mPaint;public MyCircleView(Context context) {this(context, null);}public MyCircleView(Context context, AttributeSet attrs) {this(context, attrs, 0);}public MyCircleView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);TypedArray array = context.getTheme().obtainStyledAttributes(attrs,R.styleable.circleView, 0, defStyle);for (int i = 0; i < array.length(); i++) {int index = array.getIndex(i);switch (index) {case R.styleable.circleView_smaleCircleColor:smallCircleColor = array.getColor(i, color.white);break;case R.styleable.circleView_sum:sum = array.getInt(i, 0);break;case R.styleable.circleView_remain_sum:remain_sum = array.getInt(i, 0);break;case R.styleable.circleView_textSize:textSize = array.getDimensionPixelSize(i, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 12,getResources().getDisplayMetrics()));break;case R.styleable.circleView_circleWidth:circleWidth = array.getDimensionPixelSize(i, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, 8,getResources().getDisplayMetrics()));}}array.recycle();/*** 创建画笔*/mPaint = new Paint();}
}

第一步完成了,接下来让我们实现第二步:首先定义一下弧形的角度,小圆的半径,灰色底环的颜色

  /*** 弧形角度*/private int circleAngle = 240;/*** 小圆半径*/private int mSmallCircleRadius ;/*** 灰色底环颜色*/private int grayColor = getResources().getColor(R.color.grayColor);

接下来我们正式画灰色的圆弧:

   @Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);//获取圆心坐标int center = getWidth()/2;//圆的半径 为了使百分比的小圆可以完全显示,半径减去小圆的半径int radius = center - circleWidth/2-mSmallCircleRadius;RectF rectF = new RectF(center-radius, center-radius, center+radius, center+radius);//弧角为240,所以起始角为150,mPaint.setColor(grayColor);mPaint.setStrokeWidth(circleWidth);mPaint.setAntiAlias(true);mPaint.setStyle(Paint.Style.STROKE);canvas.drawArc(rectF, 150, 240, false, mPaint);}

好了,圆弧画好了,我们该看看效果了,当然,我们需要先添加控件,首先将报名生命xmlns:circleView="http://schemas.android.com/apk/res/com.example.mycircle"
;然后为我们的属性赋值

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:circleView="http://schemas.android.com/apk/res/com.example.mycircle"android:layout_width="match_parent"android:layout_height="match_parent" ><com.example.mycircle.MyCircleView android:id="@+id/cv_view"android:layout_width="250dp"android:layout_height="250dp"android:layout_margin="20dp"circleView:circleWidth="7dp"circleView:sum="600"circleView:remain_sum="420"circleView:smaleCircleColor="#ff8a10"circleView:textSize="8sp"/></LinearLayout>

这次可以看下效果了
                                                    
好了,灰色底环画好了,马上画我们橙色部分:

首先我们要算一下,橙色部分占多少,从哪里画到哪里,这里我们布局文件中的总数是600,余额是420,所以我们橙色部分占整个圆环的420/600,正好70%,那么角度是240*0.7=168度,所以我们从灰色圆环的七点画一个168度的橙色圆环就好了。

 public void drawOrangeCircle(Canvas canvas){float organgeAngle = remain_sum/sum*circleAngle;mPaint.setColor(smallCircleColor);canvas.drawArc(mRectF, 150, organgeAngle, false, mPaint);}

好了,画好橙色圆环,我们又该看看效果了吧
                                              
好了,我们的橙色圆环也画好了,但是还差了我们的小圆圈,百分比,这个怎么画呢,我们有小圆圈的半径,只需要找到他的圆心就行了,那么圆心怎么算呢,肯定是我们橙色圆弧的终点了所以这里我们只需要算出终点的坐标就可以了。

我们以橙色圆环的起点为例,圆心的坐标我们是知道的,所以我们可以由圆心坐标来计算,这里弧度是一个变值,所以我们由弧度来推到圆心,当终点和起点位置重叠时,圆环的角度为0,与垂直方向的夹角为60度,于是,我们可以用mCenter  - (float) (mRadius * Math.sin(Math.toRadians(60 + mOrgangeAngle))),mCenter+ (float) (mRadius * Math.cos(Math  .toRadians(60 + mOrgangeAngle)))获取到小圆的圆心。
获取圆心后,我们就可以画出我们的小圆了;

  public void drawSmallCircle(Canvas canvas) {mPaint.setColor(smallCircleColor);mPaint.setStyle(Paint.Style.FILL);canvas.drawCircle(mCenter- (float) (mRadius * Math.sin(Math.toRadians(60 + mOrgangeAngle))),mCenter+ (float) (mRadius * Math.cos(Math.toRadians(60 + mOrgangeAngle))),mSmallCircleRadius, mPaint);}

看一下效果吧
                                                           
好了,圆圈画好了,接下来就该画文本了,文本和小圆处于重叠的位置,根据小圆点额位置就可以推算出文本的位置了。

   public void drawText(Canvas canvas) {mPaint.setColor(Color.WHITE);mPaint.setTextSize(textSize);/*** x  圆点中心减去文本宽度/2* y  圆点中心加上文本高度/2*/canvas.drawText(mPre,mCenter- (float) (mRadius* Math.sin(Math.toRadians(60 + mOrgangeAngle))) - mTextWidth / 2,mCenter+ (float) (mRadius * Math.cos(Math.toRadians(60 + mOrgangeAngle))) + mTextHeight/ 2, mPaint);}

这是,效果已经基本符合我们的需求了

但是,现在进入时直接就是百分之七十会不会有点生硬,如果从百分之一 一直加上去会不会好一点。当然了,

        mOrgangeAnglePre = remain_sum / sum * circleAngle;float precent = remain_sum / sum * 100;mPre = precent + "%";new Thread(new Runnable() {@Overridepublic void run() {while (mOrgangeAngle < mOrgangeAnglePre) {mOrgangeAngle++;mPre = (int) (mOrgangeAngle / circleAngle * 100) + "%";;try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}postInvalidate();}}}).start();

这次看看效果怎么样;
                                                                                             
好了,简单的百分比显示就算完成了。

代码下载

自定义圆形进度条,金额百分比相关推荐

  1. android 环形时间显示_Android_Android实现自定义圆形进度条,今天无意中发现一个圆形进度 - phpStudy...

    Android实现自定义圆形进度条 今天无意中发现一个圆形进度,想想自己实现一个,如下图: 基本思路是这样的: 1.首先绘制一个实心圆 2.绘制一个白色实心的正方形,遮住实心圆 3.在圆的中心动态绘制 ...

  2. Android自定义圆形进度条

    Android自定义圆形进度条 github地址:https://github.com/opq1289/CircleProgressView 效果图: 无动画: 有动画: 整圆: 切割圆: 具体步骤: ...

  3. android绘制环形进度_Android动态自定义圆形进度条

    这篇文章主要介绍了Android动态自定义圆形进度条,需要的朋友可以参考下 效果图: A.绘制圆环,圆弧,文本 //1.画圆环 //原点坐标 float circleX = width / 2; fl ...

  4. 微信小程序进度条样式_详解微信小程序——自定义圆形进度条

    微信小程序 自定义圆形进度条,具体如下: 无图无真相,先上图: 实现思路,先绘制底层的灰色圆圈背景,再绘制上层的蓝色进度条. 代码实现: JS代码: 页面初始化 options为页面跳转所带来的参数 ...

  5. 自定义圆形进度条的实现方式

    如何自定义圆形进度条哪,也就是替换一下进度条的图片而已. 先分析一下,系统对进度条如何定义的: 咱们一般情况下载布局文件中这么书写: //在布局文件里的代码<ProgressBarandroid ...

  6. 自定义圆形进度条 自定义倒计时进度条

    自定义圆形进度条 自定义倒计时进度条 版权声明:转载必须注明本文转自严振杰的博客: http://blog.csdn.net/yanzhenjie1003 此控件源码已开源到Github:https: ...

  7. android自定义圆形进度条,实现动态画圆效果

    自定义圆形进度条效果图如下:应用场景如动态显示分数等. view的自定义属性如下attr.xml <?xml version="1.0" encoding="UTF ...

  8. QT自定义圆形进度条

    以下是一个简单的示例,展示如何创建一个自定义的圆形进度条控件. 1.创建一个新的Qt控件类,继承QProgressBar类.在该类的头文件中添加以下代码:     class CircularProg ...

  9. 【Android 应用开发】 自定义 圆形进度条 组件

    转载著名出处 : http://blog.csdn.net/shulianghan/article/details/40351487 代码下载 : -- CSDN 下载地址 : http://down ...

  10. Android 自定义View,自定义属性--自定义圆形进度条(整理)

    很多的时候,系统自带的View满足不了我们的功能需求,那么我们就需要自定义View来满足我们的需求 自定义View时要先继承View,添加类的构造方法,重写父类View的一些方法,例如onDraw,为 ...

最新文章

  1. 读取raw目录中的文件数据
  2. Kotlin 协程:简单理解 runBlocking, launch ,withContext ,async,doAsync
  3. python垃圾回收机制(GC)相关问题
  4. 使用sed修改最后一行数据
  5. python抓取网站的图片并下载到本地
  6. f5 会话保持 负载均衡_F5负载均衡配置-运维管理
  7. java 内部类私有成员 能访问,为什么外部Java类可以访问内部类私有成员?
  8. java2的7次方怎么表示_一元二次方程常见题型之方程根的解法
  9. java 解析数据包_一种基于Java语言的网络通讯数据包解析方法与流程
  10. 王爽《汇编语言》第2版-----2、寄存器
  11. MyGui 3.2.0(OpenGL平台)的编译
  12. Android系统联系人全特效实现(上),分组导航和挤压动画
  13. request,response,session
  14. 云画质助手iApp源码
  15. 【Android】超级终端命令
  16. python 百度ai 牌照识别_Python用百度AI实现文字识别功能!(银行卡,营业执照,等识别)...
  17. 全开源-微信小程序(附开源地址)
  18. 一位 70 后程序员的 26 个职场感悟
  19. WordPress实现评论显示IP归属地方法
  20. VulnHub-noob打靶记录

热门文章

  1. Mel Spectrogram
  2. 入口思维:刚需、频次、免费、变现
  3. 快速实现单片机和手机蓝牙通信
  4. 德国康巴赫牵手德国Carl Mertens,力争全球“锅具之王”
  5. 每句话都能让你瞬间明白许多
  6. table tr省略后鼠标移入显示相应信息_赤峰市2020年初中毕业生信息技术与实验操作考试总体实施细则...
  7. 电子邮件大全,电子邮件群发软件有什么品牌?
  8. 黄州快哉亭记(苏辙)最后一句
  9. background 属性值及属性值的顺序
  10. 谷歌浏览器提示,您目前无法访问,因为此网站使用了HSTS。网络错误和攻击通常是暂时的,因此,此网页稍后可能会恢复