/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.browser; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Path; import android.graphics.RectF; import android.util.AttributeSet; import android.widget.ImageButton; /** * */ public class CircularProgressView extends ImageButton { private static final int[] ALPHAS = { 64, 96, 128, 160, 192, 192, 160, 128, 96, 64 }; // 100 ms delay between frames, 10fps private static int ALPHA_REFRESH_DELAY = 100; private int mEndAngle; private int mProgress; private Paint mPaint; private int mAlpha; private boolean mAnimated; private RectF mRect; private int mMaxProgress; /** * @param context * @param attrs * @param defStyle */ public CircularProgressView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); init(context); } /** * @param context * @param attrs */ public CircularProgressView(Context context, AttributeSet attrs) { super(context, attrs); init(context); } /** * @param context */ public CircularProgressView(Context context) { super(context); init(context); } private void init(Context ctx) { mEndAngle = 0; mProgress = 0; mMaxProgress = 100; mPaint = new Paint(); mPaint.setAntiAlias(true); mPaint.setColor(Color.BLACK); mRect = new RectF(); } void setMaxProgress(int max) { mMaxProgress = max; } private synchronized boolean isAnimated() { return mAnimated; } private synchronized void setAnimated(boolean animated) { mAnimated = animated; } void setProgress(int progress) { mProgress = progress; mEndAngle = 360 * progress / mMaxProgress; invalidate(); if (!isAnimated() && (progress > 0) && (progress < mMaxProgress)) { setAnimated(true); mAlpha = 0; post(new Runnable() { @Override public void run() { if (isAnimated()) { mAlpha = (mAlpha + 1) % ALPHAS.length; mPaint.setAlpha(ALPHAS[mAlpha]); invalidate(); postDelayed(this, ALPHA_REFRESH_DELAY); } } }); } else if ((progress <= 0) || (progress >= mMaxProgress)) { setAnimated(false); } } @Override public void onDraw(Canvas canvas) { int w = getWidth(); int h = getHeight(); float cx = w * 0.5f; float cy = h * 0.5f; mRect.set(0, 0, w, h); if ((mProgress > 0) && (mProgress < mMaxProgress)) { Path p = new Path(); p.moveTo(cx, cy); p.lineTo(cx, 0); p.arcTo(mRect, 270, mEndAngle); p.lineTo(cx, cy); int state = canvas.save(); canvas.drawPath(p, mPaint); canvas.restoreToCount(state); } super.onDraw(canvas); } }