Browse Source

Using a smoother progress bar

master
Anthony Restaino 10 years ago
parent
commit
0116481022
  1. 9
      res/layout/animated_progress_bar.xml
  2. 133
      src/acr/browser/lightning/AnimatedProgressBar.java
  3. 5
      src/acr/browser/lightning/BrowserActivity.java
  4. 1
      src/acr/browser/lightning/BrowserController.java

9
res/layout/animated_progress_bar.xml

@ -2,12 +2,7 @@
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/progress_background" android:id="@+id/progress_background"
android:layout_width="match_parent" android:layout_width="match_parent"
android:orientation="horizontal" android:layout_height="5dp"
android:layout_height="5dp"> android:orientation="horizontal" >
<View
android:id="@android:id/progress"
android:layout_width="0dp"
android:layout_height="match_parent"/>
</LinearLayout> </LinearLayout>

133
src/acr/browser/lightning/AnimatedProgressBar.java

@ -3,13 +3,14 @@ package acr.browser.lightning;
import android.animation.ObjectAnimator; import android.animation.ObjectAnimator;
import android.content.Context; import android.content.Context;
import android.content.res.TypedArray; import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcelable; import android.os.Parcelable;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation; import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.DecelerateInterpolator; import android.view.animation.DecelerateInterpolator;
import android.view.animation.Transformation; import android.view.animation.Transformation;
import android.widget.LinearLayout; import android.widget.LinearLayout;
@ -31,13 +32,10 @@ import android.widget.LinearLayout;
*/ */
public class AnimatedProgressBar extends LinearLayout { public class AnimatedProgressBar extends LinearLayout {
private View mProgressView;
private int mProgress = 0; private int mProgress = 0;
private boolean mBidirectionalAnimate = true; private boolean mBidirectionalAnimate = true;
private Animation mAnimation; private int mDrawWidth = 0;
int mInitialWidth; private int mProgressColor;
int mDeltaWidth;
int mMaxWidth;
public AnimatedProgressBar(Context context, AttributeSet attrs) { public AnimatedProgressBar(Context context, AttributeSet attrs) {
super(context, attrs); super(context, attrs);
@ -49,11 +47,6 @@ public class AnimatedProgressBar extends LinearLayout {
init(context, attrs); init(context, attrs);
} }
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
/** /**
* Initialize the AnimatedProgressBar * Initialize the AnimatedProgressBar
* *
@ -61,71 +54,26 @@ public class AnimatedProgressBar extends LinearLayout {
* @param attrs is the attribute set passed by the constructor * @param attrs is the attribute set passed by the constructor
*/ */
private void init(final Context context, AttributeSet attrs) { private void init(final Context context, AttributeSet attrs) {
this.setLayerType(LAYER_TYPE_NONE, null); this.setLayerType(LAYER_TYPE_HARDWARE, null);
TypedArray array = context.getTheme().obtainStyledAttributes(attrs, R.styleable.AnimatedProgressBar, 0, 0); TypedArray array = context.getTheme().obtainStyledAttributes(attrs, R.styleable.AnimatedProgressBar, 0, 0);
int backgroundColor; int backgroundColor;
int progressColor;
try { // Retrieve the style of the progress bar that the user hopefully set try { // Retrieve the style of the progress bar that the user hopefully set
int DEFAULT_BACKGROUND_COLOR = 0x424242;
int DEFAULT_BACKGROUND_COLOR = 0x00000000;
int DEFAULT_PROGRESS_COLOR = 0x2196f3; int DEFAULT_PROGRESS_COLOR = 0x2196f3;
backgroundColor = array.getColor(R.styleable.AnimatedProgressBar_backgroundColor, DEFAULT_BACKGROUND_COLOR); backgroundColor = array.getColor(R.styleable.AnimatedProgressBar_backgroundColor, DEFAULT_BACKGROUND_COLOR);
progressColor = array.getColor(R.styleable.AnimatedProgressBar_progressColor, DEFAULT_PROGRESS_COLOR); mProgressColor = array.getColor(R.styleable.AnimatedProgressBar_progressColor, DEFAULT_PROGRESS_COLOR);
mBidirectionalAnimate = array.getBoolean(R.styleable.AnimatedProgressBar_bidirectionalAnimate, false); mBidirectionalAnimate = array.getBoolean(R.styleable.AnimatedProgressBar_bidirectionalAnimate, false);
} finally { } finally {
array.recycle(); array.recycle();
} }
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.animated_progress_bar, this, true); inflater.inflate(R.layout.animated_progress_bar, this, true);
mProgressView = findViewById(android.R.id.progress);
this.setBackgroundColor(backgroundColor); // set the background color for this view this.setBackgroundColor(backgroundColor); // set the background color for this view
mProgressView.setBackgroundColor(progressColor); // set the color of the progress bar
mAnimation = new Animation() {
int width;
@Override
protected void applyTransformation(float interpolatedTime, Transformation t) {
width = mInitialWidth + (int) (mDeltaWidth * interpolatedTime);
if (width <= mMaxWidth) {
mProgressView.getLayoutParams().width = width;
mProgressView.requestLayout();
}
}
@Override
public boolean willChangeBounds() {
return true;
}
};
mAnimation.setAnimationListener(new AnimationListener(){
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
if (mProgress >= 100) {
fadeOut();
}
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
mAnimation.setDuration(300);
mAnimation.setInterpolator(new DecelerateInterpolator());
} }
/** /**
@ -137,6 +85,16 @@ public class AnimatedProgressBar extends LinearLayout {
return mProgress; return mProgress;
} }
private final Paint mPaint = new Paint();
private final Rect mRect = new Rect();
@Override
protected void onDraw(Canvas canvas) {
mPaint.setColor(mProgressColor);
mPaint.setStrokeWidth(10);
mRect.right = mRect.left + mDrawWidth;
canvas.drawRect(mRect, mPaint);
}
/** /**
* sets the progress as an integer value between 0 and 100. * sets the progress as an integer value between 0 and 100.
@ -154,29 +112,30 @@ public class AnimatedProgressBar extends LinearLayout {
progress = 0; progress = 0;
} }
if (mProgressView.getAlpha() < 1.0f && progress < 100) { if (this.getAlpha() < 1.0f) {
fadeIn(); fadeIn();
} }
final int maxWidth = this.getMeasuredWidth(); // get the maximum width the view can be int mWidth = this.getMeasuredWidth();
int initialWidth = mProgressView.getMeasuredWidth(); // get the initial width of the view // Set the drawing bounds for the ProgressBar
mRect.left = 0;
mRect.top = 0;
mRect.bottom = this.getBottom() - this.getTop();
if (progress < mProgress && !mBidirectionalAnimate) { // if the we only animate the view in one direction if (progress < mProgress && !mBidirectionalAnimate) { // if the we only animate the view in one direction
// then reset the view width if it is less than the // then reset the view width if it is less than the
// previous progress // previous progress
mProgressView.getLayoutParams().width = 0; mDrawWidth = 0;
mProgressView.requestLayout();
initialWidth = 0;
} else if (progress == mProgress) { // we don't need to go any farther if the progress is unchanged } else if (progress == mProgress) { // we don't need to go any farther if the progress is unchanged
return; return;
} }
mProgress = progress; // save the progress mProgress = progress; // save the progress
final int deltaWidth = (maxWidth * mProgress / 100) - initialWidth; // calculate amount the width has to change final int deltaWidth = (mWidth * mProgress / 100) - mDrawWidth; // calculate amount the width has to change
animateView(initialWidth, maxWidth, deltaWidth); // animate the width change animateView(mDrawWidth, mWidth, deltaWidth); // animate the width change
} }
/** /**
@ -187,18 +146,38 @@ public class AnimatedProgressBar extends LinearLayout {
* @param deltaWidth is the amount by which the width of the progress view will change * @param deltaWidth is the amount by which the width of the progress view will change
*/ */
private void animateView(final int initialWidth, final int maxWidth, final int deltaWidth) { private void animateView(final int initialWidth, final int maxWidth, final int deltaWidth) {
mInitialWidth = initialWidth; Animation fill = new Animation() {
mMaxWidth = maxWidth;
mDeltaWidth = deltaWidth; @Override
mAnimation.reset(); protected void applyTransformation(float interpolatedTime, Transformation t) {
mProgressView.startAnimation(mAnimation); int width = initialWidth + (int) (deltaWidth * interpolatedTime);
if (width <= maxWidth) {
mDrawWidth = width;
invalidate();
}
if ((1.0f - interpolatedTime) < 0.0005) {
if (mProgress >= 100) {
fadeOut();
}
}
}
@Override
public boolean willChangeBounds() {
return false;
}
};
fill.setDuration(500);
fill.setInterpolator(new DecelerateInterpolator());
this.startAnimation(fill);
} }
/** /**
* fades in the progress bar * fades in the progress bar
*/ */
private void fadeIn() { private void fadeIn() {
ObjectAnimator fadeIn = ObjectAnimator.ofFloat(mProgressView, "alpha", 1.0f); ObjectAnimator fadeIn = ObjectAnimator.ofFloat(this, "alpha", 1.0f);
fadeIn.setDuration(200); fadeIn.setDuration(200);
fadeIn.setInterpolator(new DecelerateInterpolator()); fadeIn.setInterpolator(new DecelerateInterpolator());
fadeIn.start(); fadeIn.start();
@ -208,7 +187,7 @@ public class AnimatedProgressBar extends LinearLayout {
* fades out the progress bar * fades out the progress bar
*/ */
private void fadeOut() { private void fadeOut() {
ObjectAnimator fadeOut = ObjectAnimator.ofFloat(mProgressView, "alpha", 0.0f); ObjectAnimator fadeOut = ObjectAnimator.ofFloat(this, "alpha", 0.0f);
fadeOut.setDuration(200); fadeOut.setDuration(200);
fadeOut.setInterpolator(new DecelerateInterpolator()); fadeOut.setInterpolator(new DecelerateInterpolator());
fadeOut.start(); fadeOut.start();

5
src/acr/browser/lightning/BrowserActivity.java

@ -2626,11 +2626,6 @@ public class BrowserActivity extends ActionBarActivity implements BrowserControl
} }
} }
@Override
public boolean isActionBarShowing() {
return mToolbarLayout.isShown();
}
// Override this, use finish() for Incognito, moveTaskToBack for Main // Override this, use finish() for Incognito, moveTaskToBack for Main
public void closeActivity() { public void closeActivity() {
finish(); finish();

1
src/acr/browser/lightning/BrowserController.java

@ -48,7 +48,6 @@ public interface BrowserController {
public void openBookmarkPage(WebView view); public void openBookmarkPage(WebView view);
public boolean isActionBarShowing();
public void closeEmptyTab(); public void closeEmptyTab();

Loading…
Cancel
Save