Lottie動畫動態定位以及縮放

有時候我們需要用Lottie來播放一些,相對與某些位置的非固定動畫,這時候就需要給他進行定位縮放了,請看我的方法。

剛開始的時候,我覺得這是一件非常簡單的事情,不就是確定一個點,然後不同設備根據這個點的比例來縮放和移動lottie組件就可以了。

但在實際使用中,我發現

  1. lottie組件的大小並不是固定的其本身的px大小,而是會根據不同設備來自動伸縮的,具體怎麼伸縮的我不知道。

  2. lottie組件使用setScaleX縮放之後,並不是就整個組件縮小,而是裏面的動畫縮小,並且居中了。

這就很尷尬了,特別是第二點。

所以,我現在有兩個結論

  1. 組件大小不能根據json文件中的大小而定,需要實際獲取
  2. 縮放之後並不是組件縮放,所以不能單單根據寬高縮放了多少來反向移動,還需要計算其縮放之後又居中帶來的移動。
//首先是固定一個點,我這裏是金幣增加動畫以組件位置爲點
int[] location = new  int[2] ;
iv_coin.getLocationInWindow(location); //獲取在當前窗口內的絕對座標
iv_coin.getLocationOnScreen(location);//獲取在整個屏幕內的絕對座標

float rightScale = 0.86f;//這裏因爲美工做的動畫留有邊距,所以要去掉一點,沒有邊距直接1.0f
float scale = (float)(location[0])/(float) (animation_view.getWidth()*rightScale);//用目標寬度/組件當前寬度,獲得當前縮放比例
if(scale<1)//如果是需要縮小
  {
     animation_view.setScaleX(scale);//設置動畫縮放比例,用setScale()應該也行
     animation_view.setScaleY(scale);
     float nowAnimWidth = (float) animation_view.getWidth()*scale;//獲取縮放之後的寬高
     float nowAnimHeight = (float)animation_view.getHeight()*scale;//無論是不是寬高相等都是需要等比例縮放的,只是可以根據具體情況,看是以寬還是高爲先。
     animation_view.setX((int) (nowAnimWidth-animation_view.getWidth())/2);//設置絕對位置,需要納入動畫居中的情況/2
     animation_view.setY((int) (nowAnimHeight-animation_view.getHeight())/2+location[1]);
  }
  else
  {
      animation_view.setX(location[0]-animation_view.getWidth()*rightScale);
      animation_view.setY(location[1]);
  }

這裏寫圖片描述
上面的算法是根據我的那個動畫來寫的。
我是沒有左邊距的,因爲組件的起始位置就在左上角,0,0,所以如果是其他的動畫的話。就需要在我上面算法的基礎上將lottie組件的起始位置計算進去。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章