日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Android自定義View實現(xiàn)圓形進度條

瀏覽:150日期:2022-09-22 08:38:10

本文實例為大家分享了Android自定義View實現(xiàn)圓形進度條的具體代碼,供大家參考,具體內容如下

效果如下:

Android自定義View實現(xiàn)圓形進度條

主要代碼

CircularProgressView.java

public class CircularProgressView extends View { private Paint mBackPaint, mProgPaint; // 繪制畫筆 private RectF mRectF; // 繪制區(qū)域 private int[] mColorArray; // 圓環(huán)漸變色 private int mProgress; // 圓環(huán)進度(0-100) /** * 繪制弧線的畫筆 */ private Paint progressPaint; /** * 圓弧圓心位置 */ private int centerX, centerY; /** * 圓弧的半徑 */ private int circleRadius; public CircularProgressView(Context context) { this(context, null); } public CircularProgressView(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public CircularProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); @SuppressLint('Recycle') TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.CircularProgressView); // 初始化背景圓環(huán)畫筆 mBackPaint = new Paint(); mBackPaint.setStyle(Paint.Style.STROKE); // 只描邊,不填充 mBackPaint.setStrokeCap(Paint.Cap.ROUND); // 設置圓角 mBackPaint.setAntiAlias(true); // 設置抗鋸齒 mBackPaint.setDither(true); // 設置抖動 mBackPaint.setStrokeWidth(typedArray.getDimension(R.styleable.CircularProgressView_backWidth, 5)); mBackPaint.setColor(typedArray.getColor(R.styleable.CircularProgressView_progbgColor, Color.LTGRAY)); // 初始化進度圓環(huán)畫筆 mProgPaint = new Paint(); mProgPaint.setStyle(Paint.Style.STROKE); // 只描邊,不填充 mProgPaint.setStrokeCap(Paint.Cap.ROUND); // 設置圓角 mProgPaint.setAntiAlias(true); // 設置抗鋸齒 mProgPaint.setDither(true); // 設置抖動 mProgPaint.setStrokeWidth(typedArray.getDimension(R.styleable.CircularProgressView_progWidth, 10)); mProgPaint.setColor(typedArray.getColor(R.styleable.CircularProgressView_progColor, Color.BLUE)); //初始化結束位置小圓點 progressPaint = new Paint(); progressPaint.setStyle(Paint.Style.FILL); // 填充 progressPaint.setStrokeCap(Paint.Cap.ROUND); // 設置圓角 progressPaint.setAntiAlias(true); // 設置抗鋸齒 progressPaint.setDither(true); // 設置抖動 progressPaint.setStrokeWidth(typedArray.getDimension(R.styleable.CircularProgressView_progWidth, 10)); progressPaint.setColor(Color.WHITE); // 初始化進度圓環(huán)漸變色 int startColor = typedArray.getColor(R.styleable.CircularProgressView_progStartColor, -1); int firstColor = typedArray.getColor(R.styleable.CircularProgressView_progFirstColor, -1); if (startColor != -1 && firstColor != -1) mColorArray = new int[]{startColor, firstColor}; else mColorArray = null; // 初始化進度 mProgress = typedArray.getInteger(R.styleable.CircularProgressView_progress, 0); typedArray.recycle(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int viewWide = getMeasuredWidth() - getPaddingLeft() - getPaddingRight(); int viewHigh = getMeasuredHeight() - getPaddingTop() - getPaddingBottom(); int mRectLength = (int) ((viewWide > viewHigh ? viewHigh : viewWide) - (mBackPaint.getStrokeWidth() > mProgPaint.getStrokeWidth() ? mBackPaint.getStrokeWidth() : mProgPaint.getStrokeWidth())); int mRectL = getPaddingLeft() + (viewWide - mRectLength) / 2; int mRectT = getPaddingTop() + (viewHigh - mRectLength) / 2; mRectF = new RectF(mRectL, mRectT, mRectL + mRectLength, mRectT + mRectLength); centerX = getMeasuredWidth() / 2; centerY = getMeasuredHeight() / 2; //計算圓弧半徑和圓心點 circleRadius = Math.min(getMeasuredWidth(), getMeasuredHeight()) / 2; circleRadius-=8; // 設置進度圓環(huán)漸變色 if (mColorArray != null && mColorArray.length > 1) mProgPaint.setShader(new LinearGradient(0, 0, 0, getMeasuredWidth(), mColorArray, null, Shader.TileMode.MIRROR)); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawArc(mRectF, 0, 360, false, mBackPaint); canvas.drawArc(mRectF, 270, 360 * mProgress / 100, false, mProgPaint); //繪制結束位置小圓形 progressPaint.setStrokeWidth(10); progressPaint.setStyle(Paint.Style.FILL); float swipe = 360 * mProgress / 100; Log.d('=================', swipe + ' mProgress'); float radians = (float) (((swipe - 90) / 2) / 180 * 2 * Math.PI); float endX; float endY; endX = centerX + circleRadius * (float) Math.cos(radians); endY = centerY + circleRadius * (float) Math.sin(radians); if (mProgress!=0) { canvas.drawCircle(endX, endY, 8, progressPaint); } } /** * 獲取當前進度 * * @return 當前進度(0-100) */ public int getProgress() { return mProgress; } /** * 設置當前進度 * * @param progress 當前進度(0-100) */ public void setProgress(int progress) { this.mProgress = progress; invalidate(); } /** * 設置當前進度,并展示進度動畫。如果動畫時間小于等于0,則不展示動畫 * * @param progress 當前進度(0-100) * @param animTime 動畫時間(毫秒) */ public void setProgress(int progress, long animTime) { if (animTime <= 0) setProgress(progress); else { ValueAnimator animator = ValueAnimator.ofInt(mProgress, progress); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) { mProgress = (int) animation.getAnimatedValue(); invalidate();} }); animator.setInterpolator(new OvershootInterpolator()); animator.setDuration(animTime); animator.start(); } } /** * 設置背景圓環(huán)寬度 * * @param width 背景圓環(huán)寬度 */ public void setBackWidth(int width) { mBackPaint.setStrokeWidth(width); invalidate(); } /** * 設置背景圓環(huán)顏色 * * @param color 背景圓環(huán)顏色 */ public void setBackColor(/*@ColorRes int color*/String color) { mBackPaint.setColor(Color.parseColor(color)); //畫筆顏色 invalidate(); } /** * 設置進度圓環(huán)寬度 * * @param width 進度圓環(huán)寬度 */ public void setProgWidth(int width) { mProgPaint.setStrokeWidth(width); invalidate(); } /** * 設置進度圓環(huán)顏色 * * @param color 景圓環(huán)顏色 */ public void setProgColor(/*@ColorRes int color*/String color) { mProgPaint.setColor(Color.parseColor(color)); //畫筆顏色 mProgPaint.setShader(null); invalidate(); } /** * 設置進度圓環(huán)顏色(支持漸變色) * * @param startColor 進度圓環(huán)開始顏色 * @param firstColor 進度圓環(huán)結束顏色 */ public void setProgColor(@ColorRes int startColor, @ColorRes int firstColor) { mColorArray = new int[]{ContextCompat.getColor(getContext(), startColor), ContextCompat.getColor(getContext(), firstColor)}; mProgPaint.setShader(new LinearGradient(0, 0, 0, getMeasuredWidth(), mColorArray, null, Shader.TileMode.MIRROR)); invalidate(); } /** * 設置進度圓環(huán)顏色(支持漸變色) * * @param colorArray 漸變色集合 */ public void setProgColor(@ColorRes int[] colorArray) { if (colorArray == null || colorArray.length < 2) return; mColorArray = new int[colorArray.length]; for (int index = 0; index < colorArray.length; index++) mColorArray[index] = ContextCompat.getColor(getContext(), colorArray[index]); mProgPaint.setShader(new LinearGradient(0, 0, 0, getMeasuredWidth(), mColorArray, null, Shader.TileMode.MIRROR)); invalidate(); }}

attrs.xml

<declare-styleable name='CircularProgressView'> <attr name='backWidth' format='dimension' /> <!--背景圓環(huán)寬度--> <attr name='progWidth' format='dimension' /> <!--進度圓環(huán)寬度--> <attr name='progbgColor' format='color' /> <!--背景圓環(huán)顏色--> <attr name='progColor' format='color' /> <!--進度圓環(huán)顏色--> <attr name='progStartColor' format='color' /> <!--進度圓環(huán)開始顏色--> <attr name='progFirstColor' format='color' /> <!--進度圓環(huán)結束顏色--> <attr name='progress' format='integer' /> <!--圓環(huán)進度--> </declare-styleable>

使用方法

<com.view.CircularProgressView android:layout_width='170dp' android:layout_height='170dp' android:layout_centerInParent='true' android:layout_centerHorizontal='true' app:backWidth='5dp' app:progWidth='5dp' app:progbgColor='#4C5098' app:progress='50' android:layout_marginTop='500dp' />

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Android
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
韩国精品主播一区二区在线观看 | 欧美日韩精品一区二区三区视频 | 红桃视频亚洲| 激情久久婷婷| 亚洲国产专区校园欧美| 国产尤物精品| 99国产精品久久久久久久成人热| 亚洲成av人片一区二区密柚| 999国产精品| 香蕉久久夜色精品国产| 日韩中文字幕无砖| 国产精品一区二区三区av| 久久精品国产在热久久| 桃色一区二区| 性一交一乱一区二区洋洋av| 婷婷综合一区| 日韩国产精品久久久久久亚洲| 国产极品久久久久久久久波多结野| 韩国久久久久久| 伊人久久亚洲美女图片| 日本成人中文字幕| 精品国产精品久久一区免费式| 精品久久在线| 久久精品官网| 亚州av一区| xxxxx性欧美特大| 爽好多水快深点欧美视频| 国产欧美二区| 欧美.日韩.国产.一区.二区| 日韩有码av| 亚洲黄色免费看| 蜜桃91丨九色丨蝌蚪91桃色| 欧美精品二区| 国户精品久久久久久久久久久不卡| 久久成人国产| 精品日韩一区| 中文字幕日韩亚洲| 久久精品九色| 久久性天堂网| 日韩电影免费在线观看| 日韩欧美高清一区二区三区| 欧美三区四区| 日韩超碰人人爽人人做人人添| 日韩欧美一区二区三区在线视频 | 久久国产免费看| 久久精品国内一区二区三区水蜜桃| 国产精品日韩| 久久精品亚洲| 美国欧美日韩国产在线播放| 国产精品一区亚洲| 中文在线不卡| 一区二区三区四区日本视频| 亚洲视频二区| 99精品视频精品精品视频| 日韩二区在线观看| 亚洲91久久| 国产一区二区三区久久 | 欧美韩日一区| 香蕉久久国产| 亚洲www免费| 美女视频免费精品| 日韩av电影一区| 亚洲女同一区| 精品国产第一福利网站| 97久久超碰| 免费观看久久久4p| 午夜av一区| 天堂8中文在线最新版在线| 国产日产精品一区二区三区四区的观看方式| 亚洲成av人片一区二区密柚| 你懂的亚洲视频| 涩涩涩久久久成人精品| 亚洲女同一区| 国产 日韩 欧美一区| 国产精品久一| 欧美日一区二区三区在线观看国产免| 国产精品美女久久久| 亚洲综合电影| 国产69精品久久| 国产精品chinese| 97久久亚洲| 亚洲丝袜啪啪| 六月丁香综合| 日韩亚洲精品在线| 91精品国产调教在线观看| 国产精品黄色| 日韩 欧美一区二区三区| 日韩中文字幕一区二区三区| 国产成人精品亚洲线观看| 国产探花一区在线观看| 亚洲美女久久| 亚洲精品极品| 国产一区 二区| 国产精品99久久免费| 国产精品极品在线观看| 国产欧美日韩一区二区三区在线| 欧美日韩夜夜| 欧美日韩一区二区三区不卡视频| 亚洲精品在线国产| 日韩精品免费观看视频| 日韩精品国产欧美| 欧美在线精品一区| 国产精品最新| 国产日韩中文在线中文字幕| 国产亚洲欧美日韩在线观看一区二区| 人人爱人人干婷婷丁香亚洲| 久久精品av麻豆的观看方式| 国产精品高潮呻吟久久久久| 精品久久久中文字幕| а√天堂8资源中文在线| 日本激情一区| av亚洲一区二区三区| 亚洲一级二级| 亚洲一区二区三区高清不卡| 日韩精品一二区| 国产午夜久久av| 国产一区二区三区亚洲| 色综合www| 不卡在线一区二区| 久久国产高清| 国产精品久久久久av蜜臀| 国产一区二区三区亚洲| 久久天堂av| 婷婷成人基地| 亚洲免费专区| 精品国产一区二区三区av片| 日韩不卡免费高清视频| 一区二区视频欧美| 亚洲日本三级| 精品国产美女a久久9999| 成人va天堂| 视频在线观看一区| 国产精品久久久亚洲一区| sm捆绑调教国产免费网站在线观看| 99久久精品网站| 伊人国产精品| 久久精品伊人| 欧美精品一线| 日本亚洲视频在线| 欧美xxxx中国| 三级在线观看一区二区| 国产精品观看| 99综合视频| 久久三级中文| 天堂av在线一区| 国产乱子精品一区二区在线观看| 成人国产精选| 美女国产精品| 精品视频在线观看网站| 91精品婷婷色在线观看| 中文字幕日韩欧美精品高清在线| 久久精品一区二区三区中文字幕| 激情久久婷婷| 国产精品久久久久av蜜臀| 久久免费高清| 国产欧美日韩一区二区三区四区| 亚洲v在线看| 国产精品99久久免费| 狠狠色狠狠色综合日日tαg| 久久99久久人婷婷精品综合| 亚洲一区日韩| 激情国产在线| 国产精品亚洲产品| 国产亚洲一区在线| 国产精品sm| 国产农村妇女精品一二区| 精品国产三区在线| 日韩精品免费视频人成 | 精品国产亚洲一区二区三区在线 | 精品网站aaa| 视频一区二区三区中文字幕| 免费一级欧美在线观看视频| 美女被久久久| 日韩精品看片| 精品视频在线观看网站| 日本不卡不码高清免费观看| 一区二区三区视频免费观看| 久久丁香四色| 日韩高清电影免费| 欧美日韩国产探花| 亚洲成人国产| 国产精品久久久久久久久久10秀| 日韩毛片一区| 日韩一区欧美二区| 亚洲大全视频| 日韩黄色大片网站| 国产精品地址| 国产欧美自拍| 婷婷亚洲成人| 蜜桃视频一区二区三区在线观看| 欧美1区免费| 久久久夜精品| 神马午夜久久| 日韩电影免费网站| 桃色av一区二区| 天堂av在线| 97精品视频在线看| 美女国产一区二区三区| 国产精品极品国产中出| 日韩在线黄色|