Android自定义View弧线进度控件

这个是一个以弧线为依托的进度控件,主要包括了两个圆弧、一个圆、一个文本。

当我们点击开始按钮的时候,会出现一个动画,逐渐的出现进度,好了,下面开始我们的编码。

新建一个类,继承自View,实现三个构造方法,接着定义变量,初始化变量的数据。代码如下:

private Paint mArcPaint, mCirclePaint, mTextPaint, mPaint; private float length; private float mRadius; private float mCircleXY; private float mSweepValue = 0; private String mShowText = "0%"; private RectF mRectF; public MViewOne(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } public MViewOne(Context context, AttributeSet attrs) { super(context, attrs); initView(); } public MViewOne(Context context) { super(context); initView(); } private void initView() { mArcPaint = new Paint(); mArcPaint.setStrokeWidth(50); mArcPaint.setAntiAlias(true); mArcPaint.setColor(Color.GREEN); mArcPaint.setStyle(Style.STROKE); mCirclePaint = new Paint(); mCirclePaint.setColor(Color.GREEN); mCirclePaint.setAntiAlias(true); mTextPaint = new Paint(); mTextPaint.setAntiAlias(true); mTextPaint.setColor(Color.RED); mTextPaint.setStrokeWidth(0); mPaint = new Paint(); mPaint.setStrokeWidth(40); mPaint.setAntiAlias(true); mPaint.setColor(Color.YELLOW); mPaint.setStyle(Style.STROKE); }

可以看到,这里一共定义了四个画笔,两个画弧形,一个画文本,还有一个绘制圆。

在我们的onSizeChange方法里面,再给变量赋值。

@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); length = w; mCircleXY = length / 2; mRadius = (float) (length * 0.5 / 2); }

这时候,圆的半径、圆的起绘点,都已经有值了。

下面开始绘制

@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 画圆 mRectF = new RectF((float) (length * 0.1), (float) (length * 0.1), (float) (length * 0.9), (float) (length * 0.9)); canvas.drawCircle(mCircleXY, mCircleXY, mRadius, mCirclePaint); // 画弧线 canvas.drawArc(mRectF, 270, 360, false, mPaint); canvas.drawArc(mRectF, 270, mSweepValue, false, mArcPaint); // 绘制文字 float textWidth = mTextPaint.measureText(mShowText); //测量字体宽度,我们需要根据字体的宽度设置在圆环中间 canvas.drawText(mShowText, (int)(length/2-textWidth/2), (int)(length/2+textWidth/2) , mTextPaint); }

这个时候,全部的效果已经出来了,但是这个还是静态的,对外暴露一个方法,让数据可以动态的刷新

public void setProgress(float mSweepValue) { float a = (float) mSweepValue; if (a != 0) { this.mSweepValue = (float) (360.0 * (a / 100.0)); mShowText = mSweepValue + "%"; Log.e("this.mSweepValue:", this.mSweepValue + ""); } else { this.mSweepValue = 25; mShowText = 25 + "%"; } invalidate(); }

好了,所有的代码都在这里了,老规矩,最后我贴上全部的代码:

public class MViewOne extends View { private Paint mArcPaint, mCirclePaint, mTextPaint, mPaint; private float length; private float mRadius; private float mCircleXY; private float mSweepValue = 0; private String mShowText = "0%"; private RectF mRectF; public MViewOne(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initView(); } public MViewOne(Context context, AttributeSet attrs) { super(context, attrs); initView(); } public MViewOne(Context context) { super(context); initView(); } private void initView() { mArcPaint = new Paint(); mArcPaint.setStrokeWidth(50); mArcPaint.setAntiAlias(true); mArcPaint.setColor(Color.GREEN); mArcPaint.setStyle(Style.STROKE); mCirclePaint = new Paint(); mCirclePaint.setColor(Color.GREEN); mCirclePaint.setAntiAlias(true); mTextPaint = new Paint(); mTextPaint.setAntiAlias(true); mTextPaint.setColor(Color.RED); mTextPaint.setStrokeWidth(0); mPaint = new Paint(); mPaint.setStrokeWidth(40); mPaint.setAntiAlias(true); mPaint.setColor(Color.YELLOW); mPaint.setStyle(Style.STROKE); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); length = w; mCircleXY = length / 2; mRadius = (float) (length * 0.5 / 2); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); // 画圆 mRectF = new RectF((float) (length * 0.1), (float) (length * 0.1), (float) (length * 0.9), (float) (length * 0.9)); canvas.drawCircle(mCircleXY, mCircleXY, mRadius, mCirclePaint); // 画弧线 canvas.drawArc(mRectF, 270, 360, false, mPaint); canvas.drawArc(mRectF, 270, mSweepValue, false, mArcPaint); // 绘制文字 float textWidth = mTextPaint.measureText(mShowText); //测量字体宽度,我们需要根据字体的宽度设置在圆环中间 canvas.drawText(mShowText, (int)(length/2-textWidth/2), (int)(length/2+textWidth/2) , mTextPaint); } public void setProgress(float mSweepValue) { float a = (float) mSweepValue; if (a != 0) { this.mSweepValue = (float) (360.0 * (a / 100.0)); mShowText = mSweepValue + "%"; Log.e("this.mSweepValue:", this.mSweepValue + ""); } else { this.mSweepValue = 25; mShowText = 25 + "%"; } invalidate(); } }

谢谢阅读,学习重在坚持,贵在坚持。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-09-20 12:33:13

Android自定义View弧线进度控件的相关文章

Android自定义View弧线进度控件_Android

这个是一个以弧线为依托的进度控件,主要包括了两个圆弧.一个圆.一个文本.   当我们点击开始按钮的时候,会出现一个动画,逐渐的出现进度,好了,下面开始我们的编码. 新建一个类,继承自View,实现三个构造方法,接着定义变量,初始化变量的数据.代码如下: private Paint mArcPaint, mCirclePaint, mTextPaint, mPaint; private float length; private float mRadius; private float mCirc

Android自定义View之组合控件实现类似电商app顶部栏_Android

本文实例为大家分享了Android自定义View之组合控件,仿电商app顶部栏的相关代码,供大家参考,具体内容如下 效果图: 分析:左右两边可以是TextView和Button,设置drawableTop即可,中间的看着像是EditText,但是用过淘宝天猫等类似app的话会发现点击搜索不是在当前Activit进行搜索的,是跳转到另外的页面进行的,所以用TextView然后设置背景即可. 实现流程 参数列表: 设置属性文件:values下建立attrs.xml文件,添加需要自定义的属性. <?x

Android自定义View之组合控件实现类似电商app顶部栏

本文实例为大家分享了Android自定义View之组合控件,仿电商app顶部栏的相关代码,供大家参考,具体内容如下 效果图: 分析:左右两边可以是TextView和Button,设置drawableTop即可,中间的看着像是EditText,但是用过淘宝天猫等类似app的话会发现点击搜索不是在当前Activit进行搜索的,是跳转到另外的页面进行的,所以用TextView然后设置背景即可. 实现流程 参数列表: 设置属性文件:values下建立attrs.xml文件,添加需要自定义的属性. <?x

Android自定义View圆形百分比控件(一)

做一个自定义View的小练习,效果如下 只需要画一个圆.一个圆弧.一个百分比文本,添加一个点击事件,传入百分比重绘 1.在res/values文件夹下新建attrs.xml文件,编写自定义属性: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="CirclePercentView" > <attr nam

Android自定义滑动接听电话控件组实例_Android

本文根据组件开发思想,首先介绍android自定义控件,然后将自定义的控件封装为jar包.最为实现滑动接听电话控件组. 一.目录结构 二.运行效果 三.代码实现 首先,自定义一个类IncomingPhone继承RelativeLayout public IncomingPhone(Context context, AttributeSet attrs) { super(context, attrs); mContext = context; TextView textView = new Tex

Android 自定义view实现进度条加载效果实例代码

这个其实很简单,思路是这样的,就是拿view的宽度,除以点的点的宽度+二个点 之间的间距,就可以算出大概能画出几个点出来,然后就通过canvas画出点,再然后就是每隔多少时间把上面移动的点不断的去改变它的坐标就可以, 效果如下: 分析图: 代码如下: package com.example.dotloadview; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Bit

Android自定义下拉刷新控件RefreshableView_Android

这是在了解下拉刷新功能原理下的产物,下拉刷新可以说是国产APP里面必有的功能,连Google都为此出了SwipeRefreshLayout,一种MD风格的下拉刷新. 不过,MD风格在国内似乎很是艰难,不单单是国内系统主流仍是4.4的原因,也有用户习惯的问题,扯的有点多了,在看了许多博客之后,我突然想写一个能仿照 SwipeRefreshLayout 的兼容所有控件的下拉刷新,不单单只是 ListView,希望它也可以包容普通的View和ScrollView,经过两天的奋斗,终于搞定了,因为我的目

Android自定义View圆形进度条控件(三)

继续练习自定义View,这次带来的圆形进度条控件与之前的圆形百分比控件大同小异,这次涉及到了渐变渲染以及画布旋转等知识点,效果如下: 虽然步骤类似,但是我还是要写,毕竟基础的东西就是要多练 1.在res/values文件夹下新建attrs.xml文件,编写自定义属性: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="Circ

Android学习自定义View(四)——继承控件(滑动时ListView的Item出现删除按钮)

MainActivity如下: package cc.testviewstudy4; import java.util.ArrayList; import java.util.HashMap; import cc.testviewstudy4.ListViewSubClass.OnDeleteListener; import android.os.Bundle; import android.widget.SimpleAdapter; import android.app.Activity; /