我希望为gridview的项目设置动画,使每个项目集中到视图中心并且一个项目可见,然后网格项目再次移回其原始位置。为清晰起见,我添加了图片。动画流程如图1-图2-图3 - 图4 - 图1.如何完成?
答案 0 :(得分:6)
我用这种方式解决了问题:
一个。找到Gridview的总宽度(W)和高度(H)。
W = (widthOfEachItem*totalItem) + (spacingBetweenItems*(totalItem-1))
H = (heightOfTheItem*totalItem) + (spacingBetweenItems*(totalItem-1))
B中。找到Gridview的中心(Cx,Cy); Cx =宽度/ 2,Cy =高度/ 2。 x坐标(Cx)将针对一行中的每个项目进行更改。 y坐标(Cy)将针对列中的每个项目进行更改。
下进行。
对于矩阵位置(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" />
<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" />