要学习动画,我正在制作河内塔式游戏。 我的主要目标是将块的运动从一个塔移动到另一个塔。我有以下布局
|------RelativeLayout------|
|-Linear-|-Linear-|-Linear-|
|-Block1-|-----------------|
|-Block2-|-----------------|
|-Block3-|-----------------|
|--------------------------|
ID| Tower1 | Tower2 | Tower3 |
我在每个ViewGroup上设置了XML属性android:clipChildren="false"
。
例如,如果我尝试使用Block1
设置Tower1
从Tower2
移动到Block1.animate().setDuration(3000).translationX(1000)
的动作。由于布局现在是正确的,Block1
将在Tower1
内制作动画,但 Block1
会在其离开Tower1
的第二个时间内被剪裁。
我通过在XML文件中添加最后一个块来改变z顺序。但是,它并不可靠。
为了确保动画不会被剪裁,我决定将Block1
(名为copyBlock
)的副本添加到根RelativeLayout,位置copyBlock
位于{ {1}},并将其设置为目标Block1
(在坐标中定义)
要获取目标坐标,我计划向Tower2
添加一个不可见的copyBlock
,然后获取坐标。这样,我可以利用 LinearLayout的布局函数来解决诸如填充,重力等问题。否则,我必须获得Tower2
的位置,计算最顶部的块,调整Tower2
的坐标,使其位于最顶部的块顶部并居中。
但是,我很确定这种方式很糟糕,并且有更好的方式
答案 0 :(得分:1)
好的,
1-您无法克服裁剪问题,因为您试图将孩子移到父级之外,除非您在同一父级内移动。
2-使用FrameLayout
代替RelativeLayout
,以便您可以正确控制视图边距;
3-您可以通过了解根布局和宽度的高度来获取目标坐标,它似乎是塔宽相等,因此(总宽度/ 3)将给出单元格宽度然后得到{{1} }坐标,(总高度 - 单元格高度)将给出塔的X
坐标(假设你有塔高)