日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Loading(二)--ThreeBodyLoadingView

發布時間:2025/3/20 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Loading(二)--ThreeBodyLoadingView 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

這是第二個

這里展示了兩個不同大小的View效果,當然真正的三體幾乎是沒有規律的

思路

1、根據View的寬高計算三個小球的初始位置

我這里是根據寬高比重計算小球的位置,先確定中間位置,為了增加容錯性,三個小球的直徑最大為View寬度的5/6,并且最大為Vieww高度的4/5;左右小球的圓心距離中間小球的圓心是一個小球的直徑大小。 使用drawCircle繪制出來,效果是這樣

2、使用屬性動畫計算小球的位置和半徑變化大小

我使用屬性動畫,改變一個rate的成員變量,使他從0到3勻速變化大小,0~1,1~2,2~3,分別對應小球運動的三個狀態:左->中,中->右,右->左。

rate數值0~1

小球位置變換
球1左->中
球2中->右
球3右->左

rate數值1~2

小球位置變換
球1中->右
球2右->左
球3左->中

rate數值2~3

小球位置變換
球1右->左
球2中->右
球3中->右
/*** 記錄三個小球的初始位置* Body記錄小球參數的內部實體類*/private Body[] originalBodys = new Body[3];/*** 記錄三個小球的最新位置*/private Body[] bodys = new Body[3]; //計算新位置private void computePosition() {if (rate <= 1.0f) {bodys[0].centerX = (int) (originalBodys[0].centerX + movingDistance * 0.5f * rate);bodys[0].radius = (int) (originalBodys[0].radius + radiusRange * rate);bodys[1].centerX = (int) (originalBodys[1].centerX + movingDistance * 0.5f * rate);bodys[1].radius = (int) (originalBodys[1].radius + radiusRange * (1 - rate));bodys[2].centerX = (int) (originalBodys[2].centerX - movingDistance * rate);bodys[2].radius = originalBodys[2].radius;} else if (rate > 1.0f && rate <= 2.0f) { bodys[0].centerX = (int) (originalBodys[0].centerX + movingDistance * 0.5f + movingDistance * 0.5f * (rate - 1));bodys[0].radius = (int) (originalBodys[0].radius + radiusRange * (2 - rate));bodys[1].centerX = (int) (originalBodys[1].centerX + movingDistance * 0.5f - movingDistance * (rate - 1));bodys[1].radius = originalBodys[1].radius;bodys[2].centerX = (int) (originalBodys[2].centerX - movingDistance + movingDistance * 0.5f * (rate - 1));bodys[2].radius = (int) (originalBodys[2].radius + radiusRange * (rate - 1));} else if (rate > 2.0f && rate <= 3.0f) {bodys[0].centerX = (int) (originalBodys[0].centerX + movingDistance - movingDistance * (rate - 2));bodys[0].radius = originalBodys[0].radius;bodys[1].centerX = (int) (originalBodys[1].centerX - movingDistance * 0.5f + movingDistance * 0.5f * (rate - 2)); rate));bodys[1].radius = (int) (originalBodys[1].radius + radiusRange * (rate - 2));bodys[2].centerX = (int) (originalBodys[2].centerX - movingDistance * 0.5f + movingDistance * 0.5f * (rate - 2));bodys[2].radius = (int) (originalBodys[2].radius + radiusRange - radiusRange * (rate - 2));}} 復制代碼

3、確定繪制順序

因為先繪制的圖層會在下面,所以右->左這個運動位置的小球一定是最先繪制的

if (rate <= 1.0f) {drawOrders[0] = 2;drawOrders[1] = 1;drawOrders[2] = 0;} else if (rate > 1.0f && rate <= 2.0f) {drawOrders[0] = 1;drawOrders[1] = 0;drawOrders[2] = 2;} else if (rate > 2.0f && rate <= 3.0f) {drawOrders[0] = 0;drawOrders[1] = 1;drawOrders[2] = 2;} 復制代碼

4、動畫開啟和結束

@Overrideprotected void onAttachedToWindow() {super.onAttachedToWindow();animStart();}@Overrideprotected void onDetachedFromWindow() {super.onDetachedFromWindow();animStop();} 復制代碼

使用

xml

<com.riverlet.loading.ThreeBodyLoadingViewandroid:layout_width="100dp"android:layout_height="100dp"android:layout_marginTop="50dp"app:firstColor="#FFFF0000"app:secondColor="#FF1C86EE"app:thirdColor="#FFEE9A00" /> 復制代碼
  • app:firstColor,球1顏色
  • app:secondColor,球2顏色
  • app:thirdColor,球3顏色

#代碼 其他具體看代碼吧:Loading

-----------------------------目錄-----------------------------

  • 1、CircleLoadingView
  • 2、ThreeBodyLoadingView

總結

以上是生活随笔為你收集整理的Loading(二)--ThreeBodyLoadingView的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。