Android自定義圓形進度條效果
更新時間:2021年04月19日 09:52:10 作者:dongxiaogang5_5
這篇文章主要為大家詳細介紹了Android自定義圓形進度條效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
本文實例為大家分享了Android自定義圓形進度條效果的具體代碼,供大家參考,具體內(nèi)容如下
1 控件 RoundProgress
package listview.tianhetbm.p2p.ui; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.RectF; import android.util.AttributeSet; import android.util.Log; import android.view.View; import listview.tianhetbm.p2p.R; /** * @date:2015/9/14 * @author:dongxiaogang * @description: 自定義圓形進度條 */ public class RoundProgress extends View { private Paint paint = new Paint(); private int roundColor; private int roundProgressColor; private int textColor; private float textSize; private float roundWidth; private int max = 100; private int progress = 50; public RoundProgress(Context context) { this(context, null); } public RoundProgress(Context context, AttributeSet attrs) { this(context, attrs, 0); } public RoundProgress(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.RoundProgress); //圓環(huán)的顏色 roundColor = ta.getColor(R.styleable.RoundProgress_roundColor, Color.RED); //圓環(huán)進度的顏色 roundProgressColor = ta.getColor(R.styleable.RoundProgress_roundProgressColor, Color.GREEN); //中間進度百分比文字字符串的顏色 textColor = ta.getColor(R.styleable.RoundProgress_textColor, Color.GREEN); //中間進度百分比的字符串的字體大小 textSize = ta.getDimension(R.styleable.RoundProgress_textSize, 15); //圓環(huán)的寬度 roundWidth = ta.getDimension(R.styleable.RoundProgress_roundWidth, 5); ta.recycle(); } @Override protected void onDraw(Canvas canvas) { //第一步:繪制一個最外層的圓 paint.setColor(roundColor); paint.setStrokeWidth(roundWidth); paint.setStyle(Paint.Style.STROKE); paint.setAntiAlias(true); int center = getWidth() / 2; int radius = (int) (center - roundWidth / 2-45); //canvas.drawCircle(center, center, radius, paint); RectF oval = new RectF(center - radius, center - radius, center + radius, center + radius); canvas.drawArc(oval, 135, 270, false, paint); //第二步:繪制正中間的文本 float textWidth = paint.measureText(progress + "%"); paint.setColor(textColor); paint.setTextSize(textSize); paint.setStrokeWidth(0); canvas.drawText(progress + "%", center - textWidth / 2, center + textSize / 2, paint); //第三步: /** * 參數(shù)解釋: * oval:繪制弧形圈所包含的矩形范圍輪廓 * 0:開始的角度 * 360 * progress / max:掃描過的角度 * false:是否包含圓心 * paint:繪制弧形時候的畫筆 */ //RectF oval = new RectF(center - radius, center - radius, center + radius, center + radius); paint.setColor(roundProgressColor); paint.setStrokeWidth(roundWidth); paint.setStyle(Paint.Style.STROKE); canvas.drawArc(oval, 135, 270 * progress / max, false, paint); Log.e("測試角度",(270 * progress / max)+""); Paint mp=new Paint(); mp.setAntiAlias(true); Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.tiger); int bitmapHeight = bitmap.getHeight()/2; int bitmapWidth = bitmap.getWidth()/2; //canvas.translate(-center, center); float y=0f,x=0f; // if(270 * progress / max<=45){ y = (float) (center-bitmapWidth - (radius) * Math.cos((270 * progress / max+225)*Math.PI/180)); x = (float) (center-bitmapWidth + (radius) * Math.sin((270 * progress / max+225)*Math.PI/180)); // } //canvas.translate(center, center*2); Log.e("測試角度", y + "-----" + x); canvas.drawBitmap(bitmap, x, y, mp); } public void setProgress(int progress){ this.progress = progress; if(progress>100){ this.progress = 100; } postInvalidate(); } }
2 xml 布局文件
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:gravity="center_horizontal"> <listview.tianhetbm.p2p.ui.RoundProgress android:layout_marginTop="30dp" android:layout_width="250dp" android:layout_height="250dp" android:layout_marginLeft="10dp" app:roundColor="@color/back_blue" app:roundProgressColor="@color/back_orange" android:id="@+id/ce" app:roundWidth="10dp" app:textSize="18sp" app:textColor="@color/record_red" /> </RelativeLayout>
3 activity(主要代碼)
super.onCreate(savedInstanceState); setContentView(R.layout.activity_main_three); ButterKnife.bind(this); new Thread(){ @Override public void run() { while (progress<80){ progress+=1; ce.setProgress(progress); try { Thread.sleep(50); } catch (Exception e) { e.printStackTrace(); } } } }.start();
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Android Studio Intent隱式啟動,發(fā)短信,撥號,打電話,訪問網(wǎng)頁等實例代碼
這篇文章主要介紹了Android Studio Intent隱式啟動,發(fā)短信,撥號,打電話,訪問網(wǎng)頁等實例代碼的相關資料,需要的朋友可以參考下2016-12-12Android源碼系列之深入理解ImageView的ScaleType屬性
Android源碼系列第一篇,這篇文章主要從源碼的角度深入理解ImageView的ScaleType屬性,感興趣的小伙伴們可以參考一下2016-06-06