自动旋转的圆环

从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

嗯,博客里主要谢了一些主要修改的地方,并没有把全部源码写上,如果有什么问题,欢迎交流啊。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值