Android 自定义View ProgressBarCircle,圆形进度条,仿微博图片加载
2017-08-18 15:10
429 查看
仿微博进度条,感觉那样加载比较优雅,就抄了一个。
class类源码:
attrs属性
抛砖引玉~~~
class类源码:
/** * Created by work on 2017/8/8. * 图形进度条不带百分比 * * @author chris zou * @mail chrisSpringSmell@gmail.com */ public class ProgressBarCircle extends View { /*轮廓:最外圈*/ int outlineColor; int outlineWidth; Paint outlinePaint; /*end*/ /*内外圈*/ int outlineAndInteriorSpaceWidth;//内外圈之间间距 int outlineAndInteriorSpaceColor;//颜色 Paint outlineAndInteriorSpacePaint; /*end*/ /*内圈*/ int interiorColorCover; int interiorColorBg; Paint interiorCoverPaint; Paint interiorBgPaint; RectF interiorBounds; /*end*/ int w, h; int compareMinSize;//高与宽较小那个 float radius; boolean isLoop;//超出360的,是否循环显示 PointF middleLocation = new PointF(); float progress; public ProgressBarCircle(Context context) { this(context, null); } public ProgressBarCircle(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public ProgressBarCircle(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(context.obtainStyledAttributes(attrs, R.styleable.ProgressBarCircle)); } public void init(TypedArray typedArray) { setupParams(typedArray); setupPaint(); } /** * 设置参数 */ public void setupParams(TypedArray typedArray) { interiorColorCover = typedArray.getColor(R.styleable.ProgressBarCircle_pbcInteriorColorCover, Color.BLACK); interiorColorBg = typedArray.getColor(R.styleable.ProgressBarCircle_pbcInteriorColorBg, Color.TRANSPARENT); outlineColor = typedArray.getColor(R.styleable.ProgressBarCircle_pbcOutlineColor, Color.BLACK); outlineWidth = typedArray.getDimensionPixelSize(R.styleable.ProgressBarCircle_pbcOutlineWidth, 0); outlineAndInteriorSpaceWidth = typedArray.getDimensionPixelSize(R.styleable.ProgressBarCircle_pbcOAndISpaceWidth, 0); outlineAndInteriorSpaceColor = typedArray.getColor(R.styleable.ProgressBarCircle_pbcOAndISpaceColor, Color.TRANSPARENT); isLoop = typedArray.getBoolean(R.styleable.ProgressBarCircle_pbcIsLoop, false); progress = typedArray.getFloat(R.styleable.ProgressBarCircle_pbcProgress, 0); } public void setupPaint() { interiorCoverPaint = new Paint(); interiorCoverPaint.setAntiAlias(true); interiorCoverPaint.setColor(interiorColorCover); interiorCoverPaint.setStyle(Paint.Style.FILL_AND_STROKE); interiorBgPaint = new Paint(); interiorBgPaint.setAntiAlias(true); interiorBgPaint.setColor(interiorColorBg); interiorBgPaint.setStyle(Paint.Style.FILL); outlinePaint = new Paint(); outlinePaint.setAntiAlias(true); outlinePaint.setStyle(Paint.Style.STROKE); outlinePaint.setColor(outlineColor); outlinePaint.setStrokeWidth(outlineWidth); outlineAndInteriorSpacePaint = new Paint(); outlineAndInteriorSpacePaint.setAntiAlias(true); outlineAndInteriorSpacePaint.setStyle(Paint.Style.STROKE); outlineAndInteriorSpacePaint.setColor(outlineAndInteriorSpaceColor); outlineAndInteriorSpacePaint.setStrokeWidth(outlineAndInteriorSpaceWidth); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); this.w = w; this.h = h; middleLocation.x = w / 2.0f; middleLocation.y = h / 2.0f; compareMinSize = w > h ? h : w; radius = compareMinSize / 2.0f; // int left = (int) (middleLocation.x - radius + getComparePaddingSize() + outlineAndInteriorSpaceWidth + outlineWidth); // int top = h - compareMinSize + getComparePaddingSize() + outlineAndInteriorSpaceWidth + outlineWidth; // int right = (int) (middleLocation.x + radius - getComparePaddingSize() - outlineAndInteriorSpaceWidth - outlineWidth); // int bottom = compareMinSize - getComparePaddingSize() - outlineAndInteriorSpaceWidth - outlineWidth; float left = middleLocation.x - radius + getComparePaddingSize() + outlineAndInteriorSpaceWidth + outlineWidth; float top = middleLocation.y - radius + getComparePaddingSize() + outlineAndInteriorSpaceWidth + outlineWidth; float right = middleLocation.x + radius - getComparePaddingSize() - outlineAndInteriorSpaceWidth - outlineWidth; float bottom = middleLocation.y + radius - getComparePaddingSize() - outlineAndInteriorSpaceWidth - outlineWidth; interiorBounds = new RectF(left, top, right, bottom); } public int getComparePaddingSize() { int a; int b; if (getPaddingLeft() > getPaddingRight()) a = getPaddingLeft(); else a = getPaddingRight(); if (getPaddingTop() > getPaddingBottom()) b = getPaddingTop(); else b = getPaddingBottom(); return a > b ? a : b; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (outlineWidth > 0) { /*画外圈*/ canvas.drawCircle(middleLocation.x, middleLocation.y, radius - getComparePaddingSize() - outlineWidth / 2.0f, outlinePaint); } if (outlineAndInteriorSpaceWidth > 0 && outlineAndInteriorSpaceColor != Color.TRANSPARENT) { /*画间隔圈*/ canvas.drawCircle(middleLocation.x, middleLocation.y, radius - getComparePaddingSize() - outlineWidth - outlineAndInteriorSpaceWidth / 2.0f, outlineAndInteriorSpacePaint); } if (interiorColorBg != Color.TRANSPARENT) { canvas.drawOval(interiorBounds, interiorBgPaint); } /*画内圈-弧形进度*/ int temp = (int) Math.abs((progress / 360)); if (isLoop && temp > 0 && progress % 360 != 0) { if (progress > 0) progress -= temp * 360; else progress += temp * 360; } canvas.drawArc(interiorBounds, -90, progress, true, interiorCoverPaint); } /** * @param progress */ public void setProgress(float progress) { this.progress = progress; postInvalidate(); } public float getProgress() { return progress; } }
attrs属性
<declare-styleable name="ProgressBarCircle"> <attr name="pbcOutlineColor" format="color" /> <attr name="pbcOutlineWidth" format="dimension" /> <attr name="pbcOAndISpaceWidth" format="dimension" /> <attr name="pbcOAndISpaceColor" format="color" /> <attr name="pbcInteriorColorCover" format="color" /> <attr name="pbcInteriorColorBg" format="color" /> <attr name="pbcIsLoop" format="boolean" /> <attr name="pbcProgress" format="float" /> </declare-styleable>
抛砖引玉~~~
相关文章推荐
- Android 自定义圆形头像CircleImageView支持加载网络图片的实现代码
- 【Android自定义View实战】之自定义圆形头像CircleImageView支持加载网络图片
- android自定义的弧形进度条和圆形进度条-SemicircleProgress
- Glide加载CircleImageView自定义圆形图片时解决不能加载成圆形图片问题
- Android自定义view之图片加载进度
- Android自定义View仿华为圆形加载进度条
- Android 自定义圆形旋转进度条,仿微博头像加载效果
- Android Glide+CircleImageView实现加载圆形图片列表
- android 自定义View加载圆形进度条
- Android中自定义圆形图片的CircleImageView和RoundedImageView基本使用效果
- Android自定义View基础开发之图片加载进度条
- 详解Android中Glide与CircleImageView加载圆形图片的问题
- Android自定义View-圆形加载进度条
- Android--自定义View加载网络图片,实现缩放,圆形剪裁
- Android自定义圆形图片控件CircleImageView
- android 自定义View简单的ProgressView圆形进度条
- 【Android Util】CircleProgressView 圆形进度条
- Android 自定义View之仿华为圆形加载进度条
- Android 高手进阶之自定义View,自定义属性(带进度的圆形进度条)
- android开源系列:CircleImageView自定义圆形控件的使用