forked from zhanghai/MaterialProgressBar
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIndeterminateProgressDrawable.java
More file actions
142 lines (114 loc) · 4.31 KB
/
IndeterminateProgressDrawable.java
File metadata and controls
142 lines (114 loc) · 4.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
/*
* Copyright (c) 2015 Zhang Hai <Dreaming.in.Code.ZH@Gmail.com>
* All Rights Reserved.
*/
package me.zhanghai.android.materialprogressbar;
import android.animation.Animator;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.support.annotation.Keep;
/**
* A backported {@code Drawable} for indeterminate circular {@code ProgressBar}.
*/
public class IndeterminateProgressDrawable extends IndeterminateProgressDrawableBase {
private static final float PROGRESS_INTRINSIC_SIZE_DP = 3.2f;
private static final float PADDED_INTRINSIC_SIZE_DP = 16;
private static final RectF RECT_BOUND = new RectF(-21, -21, 21, 21);
private static final RectF RECT_PADDED_BOUND = new RectF(-24, -24, 24, 24);
private static final RectF RECT_PROGRESS = new RectF(-19, -19, 19, 19);
private int mProgressIntrinsicSize;
private int mPaddedIntrinsicSize;
private RingPathTransform mRingPathTransform = new RingPathTransform();
private RingRotation mRingRotation = new RingRotation();
/**
* Create a new {@code IndeterminateProgressDrawable}.
*
* @param context the {@code Context} for retrieving style information.
*/
public IndeterminateProgressDrawable(Context context) {
super(context);
float density = context.getResources().getDisplayMetrics().density;
mProgressIntrinsicSize = Math.round(PROGRESS_INTRINSIC_SIZE_DP * density);
mPaddedIntrinsicSize = Math.round(PADDED_INTRINSIC_SIZE_DP * density);
mAnimators = new Animator[] {
Animators.createIndeterminate(mRingPathTransform),
Animators.createIndeterminateRotation(mRingRotation)
};
}
private int getIntrinsicSize() {
return mUseIntrinsicPadding ? mPaddedIntrinsicSize : mProgressIntrinsicSize;
}
/**
* {@inheritDoc}
*/
@Override
public int getIntrinsicWidth() {
return getIntrinsicSize();
}
/**
* {@inheritDoc}
*/
@Override
public int getIntrinsicHeight() {
return getIntrinsicSize();
}
@Override
protected void onPreparePaint(Paint paint) {
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(4);
paint.setStrokeCap(Paint.Cap.SQUARE);
paint.setStrokeJoin(Paint.Join.MITER);
}
@Override
protected void onDraw(Canvas canvas, int width, int height, Paint paint) {
if (mUseIntrinsicPadding) {
canvas.scale(width / RECT_PADDED_BOUND.width(), height / RECT_PADDED_BOUND.height());
canvas.translate(RECT_PADDED_BOUND.width() / 2, RECT_PADDED_BOUND.height() / 2);
} else {
canvas.scale(width / RECT_BOUND.width(), height / RECT_BOUND.height());
canvas.translate(RECT_BOUND.width() / 2, RECT_BOUND.height() / 2);
}
drawRing(canvas, paint);
}
private void drawRing(Canvas canvas, Paint paint) {
int saveCount = canvas.save();
canvas.rotate(mRingRotation.mRotation);
// startAngle starts at 3 o'clock on a watch.
float startAngle = -90 + 360 * (mRingPathTransform.mTrimPathOffset
+ mRingPathTransform.mTrimPathStart);
float sweepAngle = 360 * (mRingPathTransform.mTrimPathEnd
- mRingPathTransform.mTrimPathStart);
canvas.drawArc(RECT_PROGRESS, startAngle, sweepAngle, false, paint);
canvas.restoreToCount(saveCount);
}
private static class RingPathTransform {
public float mTrimPathStart;
public float mTrimPathEnd;
public float mTrimPathOffset;
@Keep
@SuppressWarnings("unused")
public void setTrimPathStart(float trimPathStart) {
mTrimPathStart = trimPathStart;
}
@Keep
@SuppressWarnings("unused")
public void setTrimPathEnd(float trimPathEnd) {
mTrimPathEnd = trimPathEnd;
}
@Keep
@SuppressWarnings("unused")
public void setTrimPathOffset(float trimPathOffset) {
mTrimPathOffset = trimPathOffset;
}
}
private static class RingRotation {
private float mRotation;
@Keep
@SuppressWarnings("unused")
public void setRotation(float rotation) {
mRotation = rotation;
}
}
}