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

首頁 > 系統 > Android > 正文

Android中模仿抖音加載框之兩顆小球轉動效果

2019-12-12 00:32:15
字體:
來源:轉載
供稿:網友

安卓版抖音v2.5加載框:

效果圖如下所示:

抖音加載框

本控件效果圖:

本控件

使用方法

源碼地址:Android仿抖音加載框之兩顆小球轉動控件

1、xml引用:

 <com.douyinloadingview.DYLoadingView  android:id="@+id/dy3"  android:layout_width="match_parent"  android:layout_height="wrap_content"  android:background="#000000"  app:color1="#FF00EEEE"  app:color2="#FFFF4040"  app:....(其他可選屬性) />

2、java使用:

 @BindView(R.id.dy1) DYLoadingView dy1; @OnClick(R.id.b1) void start() { dy1.setXXXXX; //設置屬性(可選) dy1.start(); //開始動畫 } @OnClick(R.id.b2) void stop() { dy1.stop(); //停止動畫 }

就醬。

可用屬性

名稱 對應xml屬性 對應java方法 默認值
球1半徑 radius1 setRadius() 6dp
球2半徑 radius2 setRadius() 6dp
兩球間隔 gap setRadius() 0.8dp
球1顏色 color1 setColors() 0XFFFF4040
球2顏色 color2 setColors() 0XFF00EEEE
疊加色 mixColor setColors() 0XFF000000
從右往左移動時小球最大縮放倍數 rtlScale setScales() 0.7f
從左往右移動時小球最大縮放倍數 ltrScale setScales() 1.3f
一次移動動畫時長 duration setDuration() 350ms
一次移動動畫后停頓時長 pauseDuration setDuration() 80ms
動畫進度在[0,scaleStartFraction]期間,小球大小逐漸縮放 scaleStartFraction setStartEndFraction() 0.2f
動畫進度在[scaleEndFraction,1]期間,小球大小逐漸恢復 scaleEndFraction setStartEndFraction() 0.8f

(rtl = right to left, ltr = left to right)

部分屬性說明:

•color格式為32位ARGB
•scaleStartFraction范圍[0,0.5];scaleEndFraction范圍[0.5,1]
•假設ltrScale = 1.3,scaleStartFraction = 0.2,scaleEndFraction = 0.8;那么實際效果就是一顆小球從左邊開始向右移動

期間,進度在0%~20%時半徑逐漸從1倍放大到1.3倍,在20%~80%期間大小保持1.3倍,在80%~100%時半徑逐漸從1.3倍恢復至1倍

實現思路

要讓小球動,當然要有一個動畫,通過動畫來獲得一個進度百分比fraction,然后小球在動畫過程中的坐標、大小就可以通過這個值來計算:

   

 private void initAnim() { fraction = 0.0f; stop(); anim = ValueAnimator.ofFloat(0.0f, 1.0f); anim.setDuration(duration); if (pauseDuration > 0) {  anim.setStartDelay(pauseDuration);  anim.setInterpolator(new AccelerateDecelerateInterpolator()); } else {  anim.setRepeatCount(ValueAnimator.INFINITE);  anim.setRepeatMode(ValueAnimator.RESTART);  anim.setInterpolator(new LinearInterpolator()); } anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {  @Override  public void onAnimationUpdate(ValueAnimator animation) {  fraction = animation.getAnimatedFraction();  invalidate();  } }); anim.addListener(new AnimatorListenerAdapter() {  @Override  public void onAnimationStart(Animator animation) {  isLtr = !isLtr;  }  @Override  public void onAnimationRepeat(Animator animation) {  isLtr = !isLtr;  }  @Override  public void onAnimationCancel(Animator animation) {  isAnimCanceled = true;  }  @Override  public void onAnimationEnd(Animator animation) {  if (!isAnimCanceled) {   anim.start();  }  } }); }

代碼中看到,如果小球一次移動后不需要停頓(pauseDuration = 0),那么直接通過anim.setRepeatCount(ValueAnimator.INFINITE)讓動畫無限循環,否則的話就要通過anim.setStartDelay(pauseDuration)來設置停頓時間,然后在監聽的onAnimationEnd里重啟動畫,以此實現每一次移動后小球能停頓一定時間。在onAnimationUpdate里,我們記錄了當前動畫百分比fraction,然后通過invalidate()重繪,在之后的onDraw里將通過該值畫出小球。另外,每次動畫開始時(或是重復時),會將isLtr取反,這個標志位的作用是標明當前哪顆球在【從左往右】移動,因為兩顆球的顏色、初始半徑是不一樣的嘛,onDraw里畫小球時是需要這個標志位協助的。

有了動畫進度fraction和標志位isLtr后,就可以在onDraw里畫出小球了。

**首先要計算小球當前的坐標**。y坐標永遠是固定的,不談,x坐標隨著`fraction`的變化而變化。兩顆球之間最遠距離為球1半徑+球2半徑+兩球間隔,即`distance = gap + radius1 + radius2;`,這個值就是兩顆球的移動范圍,由此可計算出,當前【從左往右】移動的小球的x坐標和當前【從右往左】移動的小球x坐標分別為:

float ltrX = getMeasuredWidth() / 2.0f - distance / 2.0f;ltrX = ltrX + (distance * fraction);float rtlX = getMeasuredWidth() / 2.0f + distance / 2.0f;rtlX = rtlX - (distance * fraction);

**接下來要計算小球當前的大小**。小球的大小也是隨著動畫進度變化的,上面已經說明了`scaleStartFraction`和`scaleEndFraction`屬性的含義。 以當前小球【從左往右】移動為例,當動畫進度為0時,小球大小為初始1倍大小;當動畫進度到scaleStartFraction時,小球大小將縮放到`ltrScale`倍,當動畫進度為[scaleStartFraction,scaleEndFraction]范圍時,小球大小保持`ltrScale`倍,當動畫進度到[scaleEndFraction,1]范圍時,小球則從`ltrScale`倍逐漸恢復至1倍。 為了便于計算,首先將`[0,scaleStartFraction]`轉換為`[0,1.0]`的真實百分比,根據`y = kx + b`(就這么個入門公式。。我都要在紙上算一遍T-T),可以得出:`float scaleFraction = 1.0f / scaleStartFraction * fraction; `,有了這個真實百分比,那么該區間里小球當前半徑就好計算了:

ltrBallRadius = ltrInitRadius * (1 + (ltrScale - 1) * scaleFraction);rtlBallRadius = rtlInitRadius * (1 + (rtlScale - 1) * scaleFraction);

應該好懂的吧。另外[scaleEndFraction,1]區間里小球當前半徑計算思路是一樣的,不談。

最后就是要畫出小球。這里主要是如何畫出實現兩球疊加的部分的顏色。

 思路1:通過xfermode方式實現:

xfermode

從上圖可以看出用Darken、Lighten、Screen模式可以做到讓疊加處上色,但是顏色不能自定義。

 思路2:通過path的OP操作實現(API19):

op

(圖片摘自http://www.gcssloop.com/customview/Path_Over

 因此,可以先構造兩個小球的Path,然后再將這兩個Path進行INTERSECT操作,即可獲得疊加處的Path,這樣就可以做到自定義疊加處的顏色了。

onDraw完整代碼:

@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); float centerY = getMeasuredHeight() / 2.0f; float ltrInitRadius, rtlInitRadius; Paint ltrPaint, rtlPaint; //確定當前【從左往右】移動的是哪顆小球 if (isLtr) {  ltrInitRadius = radius1;  rtlInitRadius = radius2;  ltrPaint = paint1;  rtlPaint = paint2; } else {  ltrInitRadius = radius2;  rtlInitRadius = radius1;  ltrPaint = paint2;  rtlPaint = paint1; } float ltrX = getMeasuredWidth() / 2.0f - distance / 2.0f; ltrX = ltrX + (distance * fraction);//當前從左往右的球的X坐標 float rtlX = getMeasuredWidth() / 2.0f + distance / 2.0f; rtlX = rtlX - (distance * fraction);//當前從右往左的球的X坐標 //計算小球移動過程中的大小變化 float ltrBallRadius, rtlBallRadius; if (fraction <= scaleStartFraction) { //動畫進度[0,scaleStartFraction]時,球大小由1倍逐漸縮放至ltrScale/rtlScale倍  float scaleFraction = 1.0f / scaleStartFraction * fraction; //百分比轉換 [0,scaleStartFraction]] -> [0,1]  ltrBallRadius = ltrInitRadius * (1 + (ltrScale - 1) * scaleFraction);  rtlBallRadius = rtlInitRadius * (1 + (rtlScale - 1) * scaleFraction); } else if (fraction >= scaleEndFraction) { //動畫進度[scaleEndFraction,1],球大小由ltrScale/rtlScale倍逐漸恢復至1倍  float scaleFraction = (fraction - 1) / (scaleEndFraction - 1); //百分比轉換,[scaleEndFraction,1] -> [1,0]  ltrBallRadius = ltrInitRadius * (1 + (ltrScale - 1) * scaleFraction);  rtlBallRadius = rtlInitRadius * (1 + (rtlScale - 1) * scaleFraction); } else { //動畫進度[scaleStartFraction,scaleEndFraction],球保持縮放后的大小  ltrBallRadius = ltrInitRadius * ltrScale;  rtlBallRadius = rtlInitRadius * rtlScale; } ltrPath.reset(); ltrPath.addCircle(ltrX, centerY, ltrBallRadius, Path.Direction.CW); rtlPath.reset(); rtlPath.addCircle(rtlX, centerY, rtlBallRadius, Path.Direction.CW); mixPath.op(ltrPath, rtlPath, Path.Op.INTERSECT); canvas.drawPath(ltrPath, ltrPaint); canvas.drawPath(rtlPath, rtlPaint); canvas.drawPath(mixPath, mixPaint); }

總結

以上所述是小編給大家介紹的Android中模仿抖音加載框之兩顆小球轉動控件效果,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對武林網網站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩美女视频中文字幕| 欧美激情一区二区三级高清视频| 国产精品九九久久久久久久| 国产精品一区二区久久精品| 亚洲电影免费观看高清完整版| 亚洲日韩中文字幕| 亚洲视频在线免费观看| 欧美日本高清一区| 国产精品一区二区三区成人| 国产精品男女猛烈高潮激情| 亚洲wwwav| 亚洲图片欧洲图片av| 久久久999精品免费| 亚洲另类欧美自拍| 亚洲精品xxxx| 国产成人综合一区二区三区| 国产一区私人高清影院| 亚洲欧美日韩成人| 精品国产成人av| 日韩欧美国产视频| 国产亚洲美女精品久久久| 国产成人一区二区三区电影| 欧美xxxx综合视频| 久久久国产精品免费| 欧美午夜宅男影院在线观看| 欧美大片欧美激情性色a∨久久| 国产精品久久久久久久久久三级| 中文字幕亚洲欧美一区二区三区| 神马久久久久久| 97av在线视频免费播放| 中日韩美女免费视频网址在线观看| 68精品国产免费久久久久久婷婷| 亚洲欧洲日产国码av系列天堂| 欧美激情免费在线| 欧美日韩性视频在线| 日日噜噜噜夜夜爽亚洲精品| 亚洲视频日韩精品| 亚洲毛片在线观看| 日韩美女毛茸茸| 亚洲无线码在线一区观看| 亚洲成人在线网| 国产成人精品日本亚洲专区61| 中文字幕免费精品一区| 在线日韩av观看| 国产精品夫妻激情| 成人h猎奇视频网站| 久久久久久久激情视频| 日韩成人在线播放| 国产91在线视频| 91精品视频在线免费观看| 91欧美激情另类亚洲| 亚洲欧洲日产国码av系列天堂| 另类图片亚洲另类| 精品久久中文字幕| www国产亚洲精品久久网站| 日韩电影在线观看免费| 亚洲韩国青草视频| 国产精品电影网站| 成人中文字幕在线观看| 国内外成人免费激情在线视频| 麻豆一区二区在线观看| 日韩电影第一页| 3344国产精品免费看| 成人免费xxxxx在线观看| 欧美洲成人男女午夜视频| 欧美专区日韩视频| 91麻豆国产精品| 国产97在线视频| 国产视频综合在线| 欧美猛少妇色xxxxx| 一本色道久久88亚洲综合88| 97精品免费视频| 日韩视频精品在线| 欧美激情第99页| 精品国产一区久久久| 日韩精品在线看| 欧美激情精品久久久久久大尺度| 日韩成人在线播放| 久久久久久12| 国产97在线|亚洲| 91综合免费在线| 国产精品久久久久久网站| 亚洲精品小视频在线观看| 欧美午夜www高清视频| 国产亚洲精品久久久久久| 欧日韩在线观看| 亚洲精品资源美女情侣酒店| 日韩中文字幕在线播放| 欧美精品videosex极品1| 欧洲成人在线视频| 国产精品第七影院| 美女久久久久久久久久久| 欧美精品999| 国产成人久久久| 国产在线视频2019最新视频| 正在播放欧美一区| xx视频.9999.com| 日本伊人精品一区二区三区介绍| 国内精品国产三级国产在线专| 色综合久综合久久综合久鬼88| 精品久久久中文| 92国产精品视频| 国产精品视频网址| 日韩av在线免费播放| 亚洲bt天天射| 亚洲黄色av女优在线观看| 精品日韩中文字幕| 91精品久久久久久久久不口人| 久久精品欧美视频| 亚洲欧美自拍一区| 91免费国产视频| 久久精品成人欧美大片古装| 欧美电影在线观看网站| 91久久久国产精品| 精品国产91乱高清在线观看| 亚洲免费伊人电影在线观看av| 亚洲第一页在线| 亚洲女同精品视频| 国内精品美女av在线播放| 久久久久成人精品| 亚洲精品国精品久久99热| 亚洲人在线观看| 91国偷自产一区二区三区的观看方式| 性欧美xxxx视频在线观看| 国产精品99免视看9| 国产成人黄色av| 视频在线观看一区二区| 日韩av不卡在线| 97人洗澡人人免费公开视频碰碰碰| 成人97在线观看视频| 日韩av在线导航| 久久在线观看视频| 亚洲精品av在线播放| 国产精品igao视频| 97精品伊人久久久大香线蕉| 岛国av一区二区三区| 中文字幕欧美精品在线| 亚洲国产精品字幕| 97热在线精品视频在线观看| 亚洲精品视频免费在线观看| 国产一区视频在线播放| 欧美成人精品一区| 久久亚洲综合国产精品99麻豆精品福利| 亚洲自拍偷拍视频| 久热99视频在线观看| 亚洲成人动漫在线播放| 久久视频国产精品免费视频在线| 日韩电影第一页| 久久久久久久久综合| 日韩经典一区二区三区| 国产美女高潮久久白浆| 色伦专区97中文字幕| 91国产视频在线播放| 国产香蕉一区二区三区在线视频| 亚洲国产高潮在线观看| 国产精品美女在线| 日韩国产欧美精品在线| 精品视频—区二区三区免费| 国产婷婷成人久久av免费高清| 欧美一区三区三区高中清蜜桃| 亚洲国产精品人久久电影| 91免费综合在线| 亚洲女性裸体视频| 青青草一区二区|