Android studio中怎么實現一個圓形進度條,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

目前成都創(chuàng)新互聯公司已為成百上千的企業(yè)提供了網站建設、域名、虛擬主機、網站托管、企業(yè)網站設計、寧陜網站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協力一起成長,共同發(fā)展。
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);
//外圓環(huán)的顏色 默認為深紫色
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){
//圓環(huán)開始角度 -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);
//設置外圓環(huán)的畫筆
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);
//重新設置外圓環(huán)寬度
mArcPaint.setStrokeWidth((float) (0.075*mRadius));
//重新獲得字號大小
mTextSize = (int) mTextPaint.getTextSize();
}
//畫中心園的外接矩形,用來畫圓環(huán)用
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;
}
//開始畫中間圓、文字和外圓環(huán)
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//畫中間圓
canvas.drawCircle(mCircleX, mCircleY, mRadius, mCirclePaint);
//畫圓環(huán)
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="改變外層圓環(huán)顏色" /> <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>
看完上述內容,你們掌握Android studio中怎么實現一個圓形進度條的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注創(chuàng)新互聯行業(yè)資訊頻道,感謝各位的閱讀!
當前題目:Androidstudio中怎么實現一個圓形進度條
網頁鏈接:http://www.jbt999.com/article0/jjeeio.html
成都網站建設公司_創(chuàng)新互聯,為您提供網站策劃、App開發(fā)、動態(tài)網站、全網營銷推廣、網站排名、品牌網站建設
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯