android自訂之 5.0 風格progressBar,androidprogressbar

來源:互聯網
上載者:User

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 



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.