计算子视图的预期LayoutParams而不添加到ViewGroup

时间:2013-12-08 22:42:31

标签: android animation layout

背景


要学习动画,我正在制作河内塔式游戏。 我的主要目标是将块的运动从一个塔移动到另一个塔。我有以下布局

  |------RelativeLayout------|
  |-Linear-|-Linear-|-Linear-|
  |-Block1-|-----------------|
  |-Block2-|-----------------|
  |-Block3-|-----------------|
  |--------------------------|
ID| Tower1 | Tower2 | Tower3 |

我在每个ViewGroup上设置了XML属性android:clipChildren="false"

例如,如果我尝试使用Block1设置Tower1Tower2移动到Block1.animate().setDuration(3000).translationX(1000)的动作。由于布局现在是正确的,Block1将在Tower1内制作动画,但 Block1会在其离开Tower1的第二个时间内被剪裁

我通过在XML文件中添加最后一个块来改变z顺序。但是,它并不可靠。

为了确保动画不会被剪裁,我决定将Block1(名为copyBlock)的副本添加到根RelativeLayout,位置copyBlock位于{ {1}},并将其设置为目标Block1(在坐标中定义)

要获取目标坐标,我计划向Tower2添加一个不可见的copyBlock,然后获取坐标。这样,我可以利用 LinearLayout的布局函数来解决诸如填充,重力等问题。否则,我必须获得Tower2的位置,计算最顶部的块,调整Tower2的坐标,使其位于最顶部的块顶部并居中。

但是,我很确定这种方式很糟糕,并且有更好的方式

问题


  • 如何在不向目标塔添加不可见视图的情况下获取上述目标坐标?有没有办法要求“prelayout”而无需将View添加到布局?
  • 您对动画被剪裁的原因有什么解释吗?有没有更好的方法来解决这个问题,而不是将新视图添加到根RelativeLayout ViewGroup?

1 个答案:

答案 0 :(得分:1)

好的,

1-您无法克服裁剪问题,因为您试图将孩子移到父级之外,除非您在同一父级内移动。

2-使用FrameLayout代替RelativeLayout,以便您可以正确控制视图边距;

3-您可以通过了解根布局和宽度的高度来获取目标坐标,它似乎是塔宽相等,因此(总宽度/ 3)将给出单元格宽度然后得到{{1} }坐标,(总高度 - 单元格高度)将给出塔的X坐标(假设你有塔高)