亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

android仿愛奇藝加載動畫實例

2019-10-23 20:08:49
字體:
來源:轉載
供稿:網友

本篇文章介紹了android仿愛奇藝加載動畫實例,具體代碼如下:

效果圖:

android,加載中動畫,正在加載動畫,加載等待動畫

用到的知識點:

  1. Path
  2. ValueAnimator

如果對Path和ValueAnimator還不熟悉推薦去看這幾個大神的Blog自定義view的目前講的最適合我的文章 ,自定義view的詳細教程和實踐,這個也是教程和實踐,感謝他們的付出!(希望大家可以認真看完,可以得到很多啟發)。

拆解動畫

  1. 一個圓先順時針的慢慢畫出來(圓不是一個閉合的圓)
  2. 這一步是一個組合動畫,圓慢慢的消失,同時三角形順時針旋轉

android,加載中動畫,正在加載動畫,加載等待動畫

這里的難點主要就是對坐標的計算,接下來我會詳細的說一下:

  1. 我們這里把圓心作為 x,y軸的起點,向下方向為x軸正向,向右方向是y軸的正向。如果設置view的大小是等寬高的,這個時候就可以把圓的半徑設置成寬或者高的一半,如果不是等寬高的就要取寬或者高的最小值的一半,作為圓的半徑。
  2. 接下來就是三角形,也是確定坐標的難點,這個三角形是一個等邊三角形,我們希望,三角形旋轉的時候也是繞圓心進行旋轉。所以圓心到三角形的各個頂點的距離都是相等的,我這里設置的是,三角形的邊長是圓的半徑。

android,加載中動畫,正在加載動畫,加載等待動畫

相信這張圖拿出來了,結合正弦、余弦函數,p1,p2,p3的坐標也就出來了。

p1.x = -(int) ((radius / 2 * Math.tan(30 * Math.PI / 180)));
p1.y = -radius / 2;
p2.x = p1.x;
p2.y = radius / 2;
p3.x = (int) (radius / 2 / Math.sin(60 * Math.PI / 180));
p3.y = 0;

定義一些屬性

private static final String DEFAULT_COLOR = "#00ba9b";private static final int DEFAULT_SIZE = 50;  //默認大小private static final int DRAW_CIRCLE = 10001; //狀態標記 畫出圓形和三角形 執行畫出圓形的動畫private static final int ROTATE_TRIANGLE = 10002; //狀態標記 執行旋轉三角形和收回圓形的動畫private Context mContext;private Paint trianglePaint;  //三角形的畫筆private Paint circlePaint;  //圓形畫筆private float paintStrokeWidth = 1; // 設置圓形的寬度private long duration = 800; //執行時間private int mWidth; //View的寬高private int mHeight;private Path trianglePath; //三角形的路徑private Path circlePath;  //圓形的路徑private Path dst; //由pathMeasure計算后的pathprivate Point p1, p2, p3; //三角形的三個點private ValueAnimator animator; //屬性動畫 主要是獲取0-1的值來執行動畫private float mAnimatorValue = 0;  //存放獲取到的0-1的值private int mCurrentState = 0;  //當前的狀態 private int radius = 0; //圓的半徑private float startSegment; //圓開始畫的長度private PathMeasure mMeasure; //測量pathprivate int triangleColor = -1;private int circleColor = -1;

設置path

1.因為三角形是一直存在的,就先畫三角,用path來畫,我們已經知道三角形的三個頂點的坐標了,畫三角形就變得很容易了。

trianglePath = new Path();p1 = new Point();p2 = new Point();p3 = new Point();trianglePath.moveTo(p1.x, p1.y);trianglePath.lineTo(p2.x, p2.y);trianglePath.lineTo(p3.x, p3.y);trianglePath.close();

這樣三角形的path就被設置好了,只要調用 canvans.drawPath() 就可以把三角形畫到畫布上。

2.然后就是畫圓,前面說過圓是有一個缺口的,我們這里也把圓添加到path里面,之所以沒有直接畫到canvas上面,是因為后面我們還要對圓的周長進行計算,這些操作path會幫我們操作,

circlePath = new Path();RectF circleRect = new RectF(-radius, -radius, radius, radius);circlePath.addArc(circleRect, 268, 358); // 這個是從圓的268°開始畫,畫258°空出兩度的一個缺口

設置屬性動畫

由于動畫需要一組0-1的數據
這里我們借用屬性動畫提供給我們的數值來實現動畫。

private void initAnimation() {    TimeInterpolator timeInterpolator = new AccelerateDecelerateInterpolator();    animator = ValueAnimator.ofFloat(0, 1).setDuration(duration);    animator.setInterpolator(timeInterpolator);    animator.setRepeatMode(ValueAnimator.RESTART);    animator.setRepeatCount(ValueAnimator.INFINITE);    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {      @Override      public void onAnimationUpdate(ValueAnimator animation) {        mAnimatorValue = (float) animation.getAnimatedValue(); //這里我們將會拿到一個0-1的值        invalidate(); // 這里進行重繪      }    });    animator.addListener(new Animator.AnimatorListener() {      @Override      public void onAnimationStart(Animator animation) {      }      @Override      public void onAnimationEnd(Animator animation) {      }      @Override      public void onAnimationCancel(Animator animation) {      }      @Override      public void onAnimationRepeat(Animator animation) {        //這里進行狀態轉換,執行不同的動畫        switch (mCurrentState) {          case DRAW_CIRCLE:            mCurrentState = ROTATE_TRIANGLE;            break;          case ROTATE_TRIANGLE:            mCurrentState = DRAW_CIRCLE;            break;          default:            break;        }      }    });  }

onDraw

分析onDraw方法

protected void onDraw(Canvas canvas) {    super.onDraw(canvas);    //將原點移動到中心位置    canvas.translate(mWidth / 2, mHeight / 2);    // 重置path dst    dst.reset();    //判斷當前的狀態    switch (mCurrentState) {     //這里就是我們說的第一種狀態      case DRAW_CIRCLE:      //這一行是獲取需要截取的path(dst)的開始位置,我們仔細觀察動畫可以看出,圓的開始是由一個位置向      //兩端去畫的,這個位置大約是圓的1/5,當畫到了圓的起點的時候就從圓的起點開始繪制,我把執行這個動畫      //的時間大致的設置為0-1 的0.3的位置左右。        startSegment = (float) (mMeasure.getLength() / 5 * ((0.3 - mAnimatorValue) > 0 ? (0.3 - mAnimatorValue) : 0));        //這里沒什么就是繪制三角形        trianglePaint.setStyle(Paint.Style.FILL_AND_STROKE);        canvas.drawPath(trianglePath, trianglePaint);        //這個方法就是獲取你要截取的片段,第一個參數是開始的位置,第二個參數是結束的位置,第三個參        //數是截取后的path,添加到path(dst),注意是添加不是替換所以前面要reset,第四個參數是,是        //否要移動起點到當前路徑的起點保持dst中的路徑不變(舉個例子,如果dst中之前是有path的,這里        //設置了false,此時就會保證dst的連續性而移動dst后加入的路徑的起點到上一個路徑的終點,從而保持連續性)        mMeasure.getSegment(startSegment, mMeasure.getLength() * mAnimatorValue, dst, true);        canvas.drawPath(dst, circlePaint);        break;         //第二種動畫      case ROTATE_TRIANGLE:      //對畫布進行保存,因為要執行兩個動畫,保存初始狀態下的畫布        canvas.save();        //然后先執行三角形的旋轉        trianglePaint.setStyle(Paint.Style.FILL_AND_STROKE);        canvas.rotate(360 * mAnimatorValue);        canvas.drawPath(trianglePath, trianglePaint);        //恢復畫布        canvas.restore();        //然后是外面圓的消失,消失其實和畫圓的道理是一樣的,這里我們有一組0-1的變化的值,我們只需要        //截取片段的時候讓起點不斷的向總長度靠近,就會出現消失的效果        mMeasure.getSegment(mMeasure.getLength() * mAnimatorValue, mMeasure.getLength(), dst, true);        canvas.drawPath(dst, circlePaint);        break;      default:        break;    }  }

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲色图色老头| 亚洲欧美国产精品专区久久| 色中色综合影院手机版在线观看| 亚洲а∨天堂久久精品9966| 国产精品日本精品| 国内精品中文字幕| 国产精品久久久av| 国产成人欧美在线观看| 亚洲人成在线一二| 黑人狂躁日本妞一区二区三区| 日韩亚洲综合在线| 日本欧美一二三区| 日韩亚洲第一页| 欧美最猛黑人xxxx黑人猛叫黄| 欧美极品少妇xxxxⅹ裸体艺术| 91欧美日韩一区| 成人激情视频小说免费下载| 久久久欧美一区二区| 精品国产乱码久久久久久虫虫漫画| 日韩精品极品在线观看播放免费视频| 日韩电影免费在线观看中文字幕| 91美女高潮出水| 国产精自产拍久久久久久蜜| 成人免费淫片aa视频免费| 久久人人看视频| 国产视频精品免费播放| 一区二区三区精品99久久| 亚洲免费成人av电影| 欧美美最猛性xxxxxx| 午夜精品久久久久久久久久久久久| 美女扒开尿口让男人操亚洲视频网站| 97久久精品人人澡人人爽缅北| 国产精品色午夜在线观看| 国产亚洲欧洲黄色| 日韩成人av在线播放| 国产欧美精品一区二区三区介绍| 亚洲国产精品网站| 欧美在线视频一二三| 国产亚洲免费的视频看| 中文在线资源观看视频网站免费不卡| 亚洲成人999| 成人在线视频福利| 久久久精品美女| 亚洲欧美精品中文字幕在线| 国产精品久久久久久久久久新婚| 亚洲美女精品成人在线视频| 成人黄色激情网| 亚洲精品久久在线| 4p变态网欧美系列| 亚洲天堂av高清| 欧美在线观看网址综合| 国产91在线播放精品91| 日韩欧美中文字幕在线播放| 久久精品国产69国产精品亚洲| 亚洲欧洲国产一区| 国产日韩av在线播放| 538国产精品视频一区二区| 久久精品成人动漫| 精品亚洲一区二区三区四区五区| 国语自产精品视频在免费| 日韩欧美成人精品| 久久天天躁狠狠躁夜夜av| 国内精品久久久久久久久| 国产专区欧美专区| 国产欧美婷婷中文| 永久免费看mv网站入口亚洲| 91嫩草在线视频| 中文字幕在线亚洲| 国产精品第一页在线| 国产99在线|中文| 国产玖玖精品视频| 中文字幕免费国产精品| 精品一区电影国产| 国产成人综合av| 色噜噜狠狠狠综合曰曰曰| 国产精品一区二区三区免费视频| 久久国产精品免费视频| 久久97久久97精品免视看| 成人两性免费视频| 亚洲免费影视第一页| 成人亚洲欧美一区二区三区| 成人乱人伦精品视频在线观看| 91精品国产91| 国产美女搞久久| 日韩女优在线播放| 欧美激情第三页| 九九热精品在线| 国产精品 欧美在线| 亚洲国产精品va在线| 久久精品视频在线播放| 久久久久久久91| 日本国产欧美一区二区三区| 最近日韩中文字幕中文| 亚洲国产高清自拍| 精品国内自产拍在线观看| 国产精品91久久久| 中文字幕亚洲综合久久| 欧日韩在线观看| 亚洲深夜福利网站| 韩剧1988在线观看免费完整版| 欧洲亚洲女同hd| 97视频在线免费观看| 久久婷婷国产麻豆91天堂| 日韩欧美在线一区| 日本久久中文字幕| 国产偷国产偷亚洲清高网站| 亚洲第一区第一页| 久久久亚洲欧洲日产国码aⅴ| 亚洲色图18p| www日韩欧美| 欧美一区二区.| 中文字幕综合在线| 尤物九九久久国产精品的分类| 亚洲综合最新在线| 国产脚交av在线一区二区| 国产精品99久久久久久久久久久久| 亚洲国产99精品国自产| 欧美另类交人妖| 欧美精品一本久久男人的天堂| 97人人模人人爽人人喊中文字| 菠萝蜜影院一区二区免费| 久久男人av资源网站| 日本精品视频在线播放| 日本高清不卡的在线| 岛国精品视频在线播放| 蜜臀久久99精品久久久无需会员| 97免费中文视频在线观看| 夜夜狂射影院欧美极品| 国产一区二区精品丝袜| 97视频在线观看免费高清完整版在线观看| 欧美专区在线视频| 国外成人性视频| 亚洲国产日韩欧美综合久久| 亚洲天堂av网| 国产69精品99久久久久久宅男| 好吊成人免视频| 国产成人一区二| 欧美性高潮床叫视频| 日韩av电影中文字幕| 亚洲最大福利网| 国产视频精品xxxx| 久久久久久69| 欧美人成在线视频| 成人福利免费观看| 亚洲专区在线视频| 九九久久国产精品| 欧美一区二区影院| 国产成+人+综合+亚洲欧洲| 亚洲另类激情图| 81精品国产乱码久久久久久| 欧美激情亚洲另类| 亚洲毛片在线看| 久久久久久这里只有精品| 国产成人一区二区三区电影| 亚洲精品电影久久久| 欧美精品video| 国产欧美中文字幕| 久久综合免费视频影院| 日韩激情在线视频| 91免费精品国偷自产在线| 欧美xxxx做受欧美.88| 日本精品va在线观看| 精品久久久久久久久中文字幕| 69视频在线播放|