android自訂之 5.0 風格progressBar,androidprogressbar
最近做項目,用到了ProgressBar ,就想到了要使用Android5.0 的效果,就隨手實現了一下。:
大概的思路:1. 圓圈通過Canvas去繪製2.圓圈的動畫通過Animator去控制
代碼:1.繪製圓的代碼是很簡單的,@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawArc(arcRectf, startAngle + incrementAngele , sweepAngle, false, arcPaint) ; if (animatorSet == null || !animatorSet.isRunning()) {startAnimation() ;}}
通過canvas.draw Arc 去繪製 startAngle則是繪製開始的角度 通過加上 incrementAngle這一個變數是為了更好去做動畫控制。2.動畫控制碼: (這個才是最重要的代碼)private void startAnimation(){if (animatorSet != null && animatorSet.isRunning()) {animatorSet.cancel() ; // 取消動畫 }animatorSet = new AnimatorSet() ; //設定一個動畫集合AnimatorSet set = circuAnimator(); // 建立運行一圈動畫的AnimatorSetanimatorSet.play(set) ; animatorSet.addListener(new AnimatorListener() {private boolean isCancel = false ; @Overridepublic void onAnimationStart(Animator animation) {}@Overridepublic void onAnimationRepeat(Animator animation) {}@Overridepublic void onAnimationEnd(Animator animation) {if (!isCancel) {startAnimation() ; // 不停的去迴圈動畫}}@Overridepublic void onAnimationCancel(Animator animation) {isCancel = true ;}}) ;animatorSet.start() ;}//預設的動畫時間private int DEFULT_DURATION = 660 ;/** * 迴圈的動畫 */private AnimatorSet circuAnimator(){//從小圈到大圈ValueAnimator holdAnimator1 = ValueAnimator.ofFloat(incrementAngele + DEFULT_MIN_ANGLE , incrementAngele + 115f) ; holdAnimator1.addUpdateListener(new AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {incrementAngele = (float) animation.getAnimatedValue() ;}}) ; holdAnimator1.setDuration(DEFULT_DURATION ) ; holdAnimator1.setInterpolator(new LinearInterpolator()) ;ValueAnimator expandAnimator = ValueAnimator.ofFloat(DEFULT_MIN_ANGLE , DEFULT_MAX_ANGLE) ;expandAnimator.addUpdateListener(new AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {sweepAngle = (float) animation.getAnimatedValue() ;incrementAngele -= sweepAngle ;invalidate() ; }}) ;expandAnimator.setDuration(DEFULT_DURATION) ;expandAnimator.setInterpolator(new DecelerateInterpolator(2)) ;//從大圈到小圈ValueAnimator holdAnimator = ValueAnimator.ofFloat(startAngle , startAngle + 115f) ;holdAnimator.addUpdateListener(new AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {startAngle = (float) animation.getAnimatedValue() ;}});holdAnimator.setDuration(DEFULT_DURATION ) ; holdAnimator.setInterpolator(new LinearInterpolator()) ;ValueAnimator narrowAnimator = ValueAnimator.ofFloat(DEFULT_MAX_ANGLE , DEFULT_MIN_ANGLE) ;narrowAnimator.addUpdateListener(new AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {sweepAngle = (float) animation.getAnimatedValue() ;invalidate() ; }}) ;narrowAnimator.setDuration(DEFULT_DURATION) ;narrowAnimator.setInterpolator(new DecelerateInterpolator(2)) ;AnimatorSet set = new AnimatorSet() ;set.play(holdAnimator1 ).with(expandAnimator) ;set.play(holdAnimator).with(narrowAnimator).after(holdAnimator1);return set ; }
OK。這個實現思路主要就是Animator的動畫運用,很簡單的方式,可以隨手練習一個Animator的使用。沒有什麼痛點。
網盤源碼: http://pan.baidu.com/s/1dD71XlR
github地址: https://github.com/flyme2012/EastTrain
部落格園地址:http://www.cnblogs.com/flyme2012/p/8ec2c75d44f1896aec817ca441aa5b7c.html