从Q群里获取到一个圆环随机转动的开源demo,是从一个apk里面下载到的,自己改了改。
下面说一下主要修改的地方:
Activity类里主要修改了一下Animation监听这一块,感觉原来demo里面的监听都没必要,就删除掉了;而且,如果设置的转动圈数比较大时,在旋转结束与重新开始旋转的时候旋转画面会出问题。
原demo:
private void animate(final HoloCircularProgressBar progressBar, final AnimatorListener listener,
final float progress, final int duration) {
/** 旋转360度 */
mProgressBarAnimator = ObjectAnimator.ofFloat(progressBar, "progress", 6);
// mProgressBarAnimator = ObjectAnimator.ofFloat(progressBar, "progress", progress);
mProgressBarAnimator.setDuration(duration);
mProgressBarAnimator.addListener(new AnimatorListener() {
@Override
public void onAnimationCancel(final Animator animation) {
}
@Override
public void onAnimationEnd(final Animator animation) {
progressBar.setProgress(progress);
}
@Override
public void onAnimationRepeat(final Animator animation) {
}
@Override
public void onAnimationStart(final Animator animation) {
}
});
if (listener != null) {
mProgressBarAnimator.addListener(listener);
}
mProgressBarAnimator.reverse();
mProgressBarAnimator.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(final ValueAnimator animation) {
progressBar.setProgress((Float) animation.getAnimatedValue());
}
});
progressBar.setMarkerProgress(progress);
mProgressBarAnimator.start();
}
修改后:
private void animate(final HoloCircularProgressBar progressBar, final AnimatorListener listener,
final float progress, final int duration) {
/** 旋转360度 */
mProgressBarAnimator = ObjectAnimator.ofFloat(progressBar, "progress", progress);
mProgressBarAnimator.setDuration(duration);
mProgressBarAnimator.addListener(listener);
mProgressBarAnimator.reverse();
progressBar.setMarkerProgress(progress);
mProgressBarAnimator.start();
}
在自定义View里面修改了一下onDraw方法,使旋转的时候可以每次都从上定点开始(如果你想要从其他点开始也可以修改旋转开始位置及初始化位置):
/*
* (non-Javadoc)
* 旋转360度,需调整Activity调用类里的动画调用是传入的progres设为1,及setProgress方法
* @see android.view.View#onDraw(android.graphics.Canvas)
*/
@Override
protected void onDraw(final Canvas canvas) {
// All of our positions are using our internal coordinate system.
// Instead of translating
// them we let Canvas do the work for us.
canvas.translate(mTranslationOffsetX, mTranslationOffsetY);
final float progressRotation = getCurrentRotation();
// draw the background
if (!mOverrdraw) {
canvas.drawArc(mCircleBounds, -90, 450, false, mBackgroundColorPaint);//每次旋转完成后初始化圆环背景
}
// draw the progress or a full circle if overdraw is true
canvas.drawArc(mCircleBounds, -90, progressRotation, false, mProgressColorPaint);
// draw the marker at the correct rotated position
if (mIsMarkerEnabled) {//画一个短线标示起始点
canvas.save();
canvas.rotate(-90);
canvas.drawLine((float) (mThumbPosX + mThumbRadius / 2 * 1.4), mThumbPosY,
(float) (mThumbPosX - mThumbRadius / 2 * 1.4), mThumbPosY, mMarkerColorPaint);
canvas.restore();
}
if (isThumbEnabled()) {//画出圆环转动时的箭头
// draw the thumb square at the correct rotated position
canvas.save();
canvas.rotate(progressRotation - 90);//从上定点开始,根据每次动画自动调用时位置-90获得
// rotate the square by 45 degrees
canvas.rotate(45, mThumbPosX, mThumbPosY);//箭头45°
mSquareRect.left = mThumbPosX - mThumbRadius / 3;
mSquareRect.right = mThumbPosX + mThumbRadius / 3;
mSquareRect.top = mThumbPosY - mThumbRadius / 3;
mSquareRect.bottom = mThumbPosY + mThumbRadius / 3;
canvas.drawRect(mSquareRect, mThumbColorPaint);
canvas.restore();
}
}
感觉这个依靠动画去自动完成圆环的转动在开始一直到结束的时候圆环转动的速度不是恒定的,这一点不好,不过正在改,如果有某位大神已经修改完成了,希望可以共享个看看啊。哈哈……
下载地址:CircularProgressBarSampleMine
嗯,博客里主要谢了一些主要修改的地方,并没有把全部源码写上,如果有什么问题,欢迎交流啊。