Android studio圆形进度条 百分号跟着变
来源:互联网 发布:藏头诗软件下载 编辑:程序博客网 时间:2024/06/05 11:20
MainActivity
import 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; } }}
Gua
import 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="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/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" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="开始" /> <Button android:id="@+id/resele" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="重置" /> <Button android:id="@+id/dao" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="暂停" /> </LinearLayout></LinearLayout>
values文件中的attrs
<?xml version="1.0" encoding="utf-8"?><resources> <declare-styleable name="PercentageRing"> <attr name="radius" format="integer"/> <attr name="circleBackground" format="color"/> <attr name="ringColor" format="color"/> <attr name="textColor" format = "color"/> </declare-styleable></resources>
效果展示
阅读全文
0 0
- Android studio圆形进度条 百分号跟着变
- Android 可滚动圆形进度条 滑块和进度在进度条上面跟着滚动
- android 自定义圆形进度条
- Android圆形进度条
- android 环形进度条 圆形
- Android:自定义圆形进度条
- android自定义圆形进度条
- Android自定义圆形进度条
- Android自定义圆形进度条
- Android 圆形进度条
- android圆形扇形进度条
- Android 自定义圆形进度条
- Android 绘制圆形进度条
- Android自定义圆形进度条
- Android自定义圆形进度条
- android圆形缓冲进度条
- Android 自定义圆形进度条
- Android 自定义圆形进度条
- 第9章_排序
- iOS开发笔记之设置self.view原点为导航栏左下角
- dhcp命令详解
- JS刷新当前页面的几种方法总结
- Python实现微信自动回复机器人
- Android studio圆形进度条 百分号跟着变
- 项目中一个Bug的解决过程
- Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
- C/C++中的实参和形参
- Elastic-Job-Lite的原理简介和使用(推荐)
- JS对象深拷贝
- [learning materials] radicals
- python传入命令行参数
- Android模糊一张图片的简单方法之RenderScript