有时候我们需要用Lottie来播放一些,相对与某些位置的非固定动画,这时候就需要给他进行定位缩放了,请看我的方法。
刚开始的时候,我觉得这是一件非常简单的事情,不就是确定一个点,然后不同设备根据这个点的比例来缩放和移动lottie组件就可以了。
但在实际使用中,我发现
lottie组件的大小并不是固定的其本身的px大小,而是会根据不同设备来自动伸缩的,具体怎么伸缩的我不知道。
lottie组件使用setScaleX缩放之后,并不是就整个组件缩小,而是里面的动画缩小,并且居中了。
这就很尴尬了,特别是第二点。
所以,我现在有两个结论
- 组件大小不能根据json文件中的大小而定,需要实际获取
- 缩放之后并不是组件缩放,所以不能单单根据宽高缩放了多少来反向移动,还需要计算其缩放之后又居中带来的移动。
//首先是固定一个点,我这里是金币增加动画以组件位置为点
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组件的起始位置计算进去。