Rah*_*hul 7 animation android android-animation android-gridview




我希望为gridview的项目设置动画,使每个项目集中到视图中心并且一个项目可见,然后网格项目再次移回其原始位置.为清晰起见,我添加了图片.动画流程如图1-图2-图3 - 图4 - 图1.怎么做?
我用这种方式解决了这个问题:
A.找到Gridview的总宽度(W)和高度(H).
W = (widthOfEachItem*totalItem) + (spacingBetweenItems*(totalItem-1))
H = (heightOfTheItem*totalItem) + (spacingBetweenItems*(totalItem-1))
Run Code Online (Sandbox Code Playgroud)
B.找到Gridview的中心(Cx,Cy); Cx =宽度/ 2,Cy =高度/ 2.x坐标(Cx)将针对一行中的每个项目进行更改.y坐标(Cy)将针对列中的每个项目进行更改.
C.
对于矩阵位置(0,0)的gridItem.
找到翻译的百分比
x%=(Cx/W)*100,y%=(Cy/W)*100
将项目从XDelta = 0转换为XDelta = x%p从YDelta = 0到YDelta = y%p
对于矩阵位置(0,1)的gridItem.GridView中心的x坐标对于此项更接近,因此我们必须减去(widthOfEachItem + spacingBetweenItems).
现在Cx = Cx - (widthOfEachItem + spacingBetweenItems)
在这种情况下,只有x坐标会发生变化.y坐标将保持不变.
找到翻译的百分比:
x%=(Cx/W)*100,y%=(Cy/W)*100
将项目从XDelta = 0转换为XDelta = x%p从YDelta = 0到YDelta = y%p
对于矩阵位置(1,0)的gridItem.
Gridview中心的y坐标对于此项更接近,因此我们必须减去(heightOfTheItem + spacingBetweenItems).
现在Cy = Cy - (heightOfTheItem + spacingBetweenItems)
在这种情况下,只有y坐标会发生变化.x坐标将保持与(0,0)项的坐标相同.
找到翻译的百分比 -
x%=(Cx/W)*100,y%=(Cy/W)*100
将项目从XDelta = 0转换为XDelta = x%p从YDelta = 0到YDelta = y%p
对于矩阵位置(1,1)处的网格项.
GridView中心的x坐标对于此项更接近,因此我们必须减去(widthOfEachItem + spacingBetweenItems).
现在Cx = Cx - (widthOfEachItem + spacingBetweenItems)
GridView中心的y坐标对于此项更接近,因此我们必须减去(heightOfTheItem + spacingBetweenItems).
现在Cy = Cy - (heightOfTheItem + spacingBetweenItems)
在这种情况下,x和y坐标都会改变.
找到翻译的百分比 -
x%=(Cx/W)*100,y%=(Cy/W)*100;
将项目从XDelta = 0转换为XDelta = x%p从YDelta = 0到YDelta = y%p
以这种方式计算GridView中所有项的x%和y%的值.
对于超出中心项目的行中的项目,toXDelta将为-ve.
对于超出中心项目的列中的项目,toYDelta将为-ve.
为了更准确地对齐中心的项目(在动画之后),考虑将每个项目的中心的坐标添加到Gridview的中心并将其扣除.
将项目从原始位置转换为中心后,如果要将它们转换回原始位置,只需将值设为*Delta -ve.
这是我为(0,0)的GridView项目所做的:
<translate
android:duration="600"
android:fromXDelta="0%p"
android:fromYDelta="0%p"
android:toXDelta="-7.8%p"
android:toYDelta="33.40%p" />
<translate
android:duration="600"
android:fromXDelta="0%p"
android:fromYDelta="0%p"
android:startOffset="1050"
android:toXDelta="7.8%p"
android:toYDelta="-33.40%p" />
Run Code Online (Sandbox Code Playgroud)