版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
【移动应用开发技术】Androidstudio中怎么实现一个圆形进度条
Androidstudio中怎么实现一个圆形进度条,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。MainActivityimport
android.support.v7.app.AppCompatActivity;
import
android.os.Bundle;
import
android.view.View;
import
android.widget.Button;
public
class
MainActivity
extends
AppCompatActivity
implements
View.OnClickListener{
private
Gua
mGua1;
private
Button
play;
private
Button
resele;
private
Button
dao;
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mGua1
=
(Gua)
findViewById(R.id.Circle);
mGua1.setTargetPercent(0);
play=(Button)findViewById(R.id.play);
resele=(Button)findViewById(R.id.resele);
dao=(Button)findViewById(R.id.dao);
play.setOnClickListener(this);
resele.setOnClickListener(this);
dao.setOnClickListener(this);
}
@Override
public
void
onClick(View
view)
{
switch
(view.getId()){
case
R.id.play:
//设置目标百分比为100
mGua1.setTargetPercent(100);
mGua1.invalidate();
break;
case
R.id.resele:
//设置目标百分比为0
mGua1.setTargetPercent(0);
mGua1.invalidate();
break;
case
R.id.dao:
//设置目标百分比为100
mGua1.setTargetPercent(0);
mGua1.invalidate();
break;
}
}
}Guaimport
android.content.Context;
import
android.content.res.TypedArray;
import
android.graphics.Canvas;
import
android.graphics.Paint;
import
android.graphics.Paint.Align;
import
android.graphics.RectF;
import
android.util.AttributeSet;
import
android.view.View;
public
class
Gua
extends
View{
private
Paint
mCirclePaint;
private
Paint
mTextPaint;
private
Paint
mArcPaint;
private
int
mCircleX;
private
int
mCircleY;
private
float
mCurrentAngle;
private
RectF
mArcRectF;
private
float
mStartSweepValue;
private
float
mTargetPercent;
private
float
mCurrentPercent;
private
int
mRadius;
private
int
mCircleBackground;
private
int
mRingColor;
private
int
mTextSize;
private
int
mTextColor;
public
Gua(Context
context,
AttributeSet
attrs,
int
defStyle)
{
super(context,
attrs,
defStyle);
init(context);
}
public
Gua(Context
context,
AttributeSet
attrs)
{
super(context,
attrs);
//自定义属性
values/attr
TypedArray
typedArray
=
context.obtainStyledAttributes(attrs,R.styleable.PercentageRing);
//中间圆的背景颜色
默认为浅紫色
mCircleBackground
=
typedArray.getColor(R.styleable.PercentageRing_circleBackground,
0xffafb4db);
//外圆环的颜色
默认为深紫色
mRingColor
=
typedArray.getColor(R.styleable.PercentageRing_ringColor,
0xff6950a1);
//中间圆的半径
默认为60
mRadius
=
typedArray.getInt(R.styleable.PercentageRing_radius,
60);
//字体颜色
默认为白色
mTextColor
=
typedArray.getColor(R.styleable.PercentageRing_textColor,
0xffffffff);
//最后一定要调用这个
释放掉TypedArray
typedArray.recycle();
//初始化数据
init(context);
}
public
Gua(Context
context)
{
super(context);
init(context);
}
private
void
init(Context
context){
//圆环开始角度
-90°
正北方向
mStartSweepValue
=
-90;
//当前角度
mCurrentAngle
=
0;
//当前百分比
mCurrentPercent
=
0;
//设置中心园的画笔
mCirclePaint
=
new
Paint();
mCirclePaint.setAntiAlias(true);
mCirclePaint.setColor(mCircleBackground);
mCirclePaint.setStyle(Paint.Style.FILL);
//设置文字的画笔
mTextPaint
=
new
Paint();
mTextPaint.setColor(mTextColor);
mTextPaint.setAntiAlias(true);
mTextPaint.setStyle(Paint.Style.FILL);
mTextPaint.setStrokeWidth((float)
(0.025*mRadius));
mTextPaint.setTextSize(mRadius/2);
mTextPaint.setTextAlign(Align.CENTER);
//设置外圆环的画笔
mArcPaint
=
new
Paint();
mArcPaint.setAntiAlias(true);
mArcPaint.setColor(mRingColor);
mArcPaint.setStyle(Paint.Style.STROKE);
mArcPaint.setStrokeWidth((float)
(0.075*mRadius));
//获得文字的字号
因为要设置文字在圆的中心位置
mTextSize
=
(int)
mTextPaint.getTextSize();
}
//主要是测量wrap_content时候的宽和高,因为宽高一样,只需要测量一次宽即可,高等于宽
@Override
protected
void
onMeasure(int
widthMeasureSpec,
int
heightMeasureSpec)
{
setMeasuredDimension(measure(widthMeasureSpec),
measure(widthMeasureSpec));
//设置圆心坐标
mCircleX
=
getMeasuredWidth()/2;
mCircleY
=
getMeasuredHeight()/2;
//如果半径大于圆心横坐标,需要手动缩小半径的值,否则就画到外面去了
if
(mRadius>mCircleX)
{
//设置半径大小为圆心横坐标到原点的距离
mRadius
=
mCircleX;
mRadius
=
(int)
(mCircleX-0.075*mRadius);
//因为半径改变了,所以要重新设置一下字体宽度
mTextPaint.setStrokeWidth((float)
(0.025*mRadius));
//重新设置字号
mTextPaint.setTextSize(mRadius/2);
//重新设置外圆环宽度
mArcPaint.setStrokeWidth((float)
(0.075*mRadius));
//重新获得字号大小
mTextSize
=
(int)
mTextPaint.getTextSize();
}
//画中心园的外接矩形,用来画圆环用
mArcRectF
=
new
RectF(mCircleX-mRadius,
mCircleY-mRadius,
mCircleX+mRadius,
mCircleY+mRadius);
}
//当wrap_content的时候,view的大小根据半径大小改变,但最大不会超过屏幕
private
int
measure(int
measureSpec){
int
result=0;
int
specMode
=
MeasureSpec.getMode(measureSpec);
int
specSize
=
MeasureSpec.getSize(measureSpec);
if
(specMode
==
MeasureSpec.EXACTLY)
{
result
=
specSize;
}else
{
result
=(int)
(1.075*mRadius*2);
if
(specMode
==
MeasureSpec.AT_MOST)
{
result
=
Math.min(result,
specSize);
}
}
return
result;
}
//开始画中间圆、文字和外圆环
@Override
protected
void
onDraw(Canvas
canvas)
{
super.onDraw(canvas);
//画中间圆
canvas.drawCircle(mCircleX,
mCircleY,
mRadius,
mCirclePaint);
//画圆环
canvas.drawArc(mArcRectF,
mStartSweepValue
,mCurrentAngle,
false,
mArcPaint);
//画文字
canvas.drawText(String.valueOf(mCurrentPercent)+"%",
mCircleX,
mCircleY+mTextSize/4,
mTextPaint);
//判断当前百分比是否小于设置目标的百分比
if
(mCurrentPercent<mTargetPercent)
{
//当前百分比+1
mCurrentPercent+=1;
//当前角度+360
mCurrentAngle+=3.6;
//每10ms重画一次
postInvalidateDelayed(10);
}/*else
if(mCurrentPercent==mTargetPercent){
//当前百分比-1
mCurrentPercent=0;
//当前角度+360
mCurrentAngle=0;
//每10ms重画一次
postInvalidateDelayed(10);
}*/else
if(mCurrentPercent>mTargetPercent){
//当前百分比-1
mCurrentPercent-=1;
//当前角度+360
mCurrentAngle-=3.6;
//每10ms重画一次
postInvalidateDelayed(10);
}
}
//设置目标的百分比
public
void
setTargetPercent(int
percent){
this.mTargetPercent
=
percent;
}
}Xml文件<LinearLayout
xmlns:android="/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="/apk/res-auto"
android:orientation="vertical">
<Button
android:id="@+id/but1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="改变外层圆环颜色"
/>
<com.bwie.test.wuxiaorui1508a20171009.Gua
android:id="@+id/Circle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:radius="90"
app:textColor="#ffffffff"
/>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:gravity="center"
>
<Button
android:id="@+id/play"
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 民政采购内部控制制度
- 江西论文内部控制制度
- 海南机关内部管理制度
- 海澜集团内部制度
- 火锅店财务内部控制制度
- 煤矿内部制度
- 煤矿库房内部管理制度
- 环评审批内部制度
- 监察内部管理制度
- 监理内部办公用品制度
- 2026国网吉林省电力有限公司招聘129人(第二批)考试参考题库及答案解析
- 25188442第1课《个性与从众交响》课件【北师大版】《心理健康》六年级下册
- (各类全面)三年级数学混合运算专项练习(每日一练共28份)
- 2025年70周岁以上老年人换长久驾照三力测试题库(含答案)
- GB/T 9239.11-2025机械振动转子平衡第11部分:刚性转子的平衡方法和允差
- 2025年《三级老年人能力评估师》考试练习题及答案
- 验证方案与验证报告
- 移植血管内瘘的护理
- 人教版数学一年级下册第一单元《十几减9》真题同步测试3(含解析)
- 校园网网络工程分析需求报告
- 《杀死一只知更鸟》读书分享PPT
评论
0/150
提交评论