带梯度效果的圆形进度View
2015-12-02 20:00
239 查看
带梯度效果的圆形进度View
测试:
public class GradientProgressView extends View { private static final String TAG = GradientProgressView.class.getSimpleName(); private static final float MAX_PROGRESS = 100f; private static final float CIRCLE_STROKE_WIDTH = 7.0F; private static final float CIRCLE_WIDTH = 210.0F; private static int GRADIENT = 100; private Paint mActivePaint; private int mCenterX; private int mCenterY; private Context mContext; private Paint mIdlePaint; private int mProgress; private int mRadius; public GradientProgressView(Context context) { super(context); initVariable(context); } public GradientProgressView(Context context, AttributeSet attributeSet) { super(context, attributeSet); initVariable(context); } public GradientProgressView(Context context, AttributeSet attributeSet, int defStyleAttr) { super(context, attributeSet, defStyleAttr); initVariable(context); } private int dip2px(Context context, float dp) { final float scale = context.getResources().getDisplayMetrics().density; return (int) (dp * scale + 0.5f); } private void drawActiveArc(Canvas canvas, int progress) { float f1 = mCenterX - mRadius; float f2 = mCenterY - mRadius; float f3 = 2 * mRadius; float f4 = 2 * mRadius; float f5 = progress * 360 / MAX_PROGRESS; canvas.drawArc(new RectF(f1, f2, f1 + f3, f2 + f4), 0, f5, false, mActivePaint); } private void drawIdleArc(Canvas paramCanvas) { float f1 = mCenterX - mRadius; float f2 = mCenterY - mRadius; float f3 = 2 * mRadius; float f4 = 2 * mRadius; paramCanvas.drawArc(new RectF(f1, f2, f1 + f3, f2 + f4), -90f, 360f, false, mIdlePaint); } private void initPaint() { float[] intervals = new float[4]; float circumference = (float)(2 * Math.PI * mRadius); float pathLineWidth = circumference / GRADIENT * 0.4f; float pathSpaceWidth = circumference / GRADIENT * 0.6f; intervals[0] = pathLineWidth; intervals[1] = pathSpaceWidth; intervals[2] = pathLineWidth; intervals[3] = pathSpaceWidth; DashPathEffect localDashPathEffect = new DashPathEffect(intervals, 0F); mActivePaint = new Paint(); mActivePaint.setAntiAlias(true); mActivePaint.setStyle(Paint.Style.STROKE); mActivePaint.setColor(Color.BLACK); mActivePaint.setStrokeWidth(dip2px(mContext, CIRCLE_STROKE_WIDTH)); mActivePaint.setPathEffect(localDashPathEffect); mIdlePaint = new Paint(); mIdlePaint.setAntiAlias(true); mIdlePaint.setStyle(Paint.Style.STROKE); mIdlePaint.setColor(Color.BLUE); mIdlePaint.setStrokeWidth(dip2px(mContext, CIRCLE_STROKE_WIDTH)); mIdlePaint.setPathEffect(localDashPathEffect); } private void initVariable(Context context) { mContext = context; mRadius = (dip2px(context, CIRCLE_WIDTH) / 2); initPaint(); } protected void onDraw(Canvas paramCanvas) { super.onDraw(paramCanvas); drawIdleArc(paramCanvas); drawActiveArc(paramCanvas, mProgress); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); mCenterX = View.MeasureSpec.getSize(widthMeasureSpec) / 2; mCenterY = View.MeasureSpec.getSize(heightMeasureSpec) / 2; setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec)); Log.d(TAG, "width--->" + View.MeasureSpec.getSize(widthMeasureSpec)); Log.d(TAG, "height-->"+View.MeasureSpec.getSize(heightMeasureSpec)); } public void updateProgress(int progress) { if (progress > MAX_PROGRESS) return; mProgress = progress; invalidate(); } }
测试:
private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); mProgressView.updateProgress(++currentProgress); sendEmptyMessageDelayed(1, 100); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mProgressView = new GradientProgressView(this); setContentView(mProgressView); mProgressView.updateProgress(currentProgress); handler.sendEmptyMessageDelayed(1,100); }
相关文章推荐
- android自定义View的用法
- android自定义控件实例
- 自定义view的自定义属性的引用
- android在自定义View的xml中设置自定义的成员属性
- 自定义android进度条
- android基础之自定义view
- 自定义View(一)
- Android自定义组件:一个波浪形的组件
- ipad开发中UIPopoverController中自定义view在Xcode6中尺寸匹配问题
- android自定义view的实现
- 自定义View步骤
- 自定义View的回调函数
- Android中的UI界面控制方式和自定义View
- Android之自定义View的封装
- Android自定义View画曲线
- 自定义View---自定义组合控件
- 最简单的实现圆形图片的方式
- Android 图片轮番 继承ViewGroup实现 可以直接使用
- 使用xib封装一个自定义view
- 【安卓自定义控件】自定义ViewGroup实现透明背景的ViewPager效果