在不添加到ViewGroup的情况下计算子视图的预期LayoutParams



背景


为了学习动画,我正在创建一个河内塔类型的游戏我的主要目标是使方块从一个塔移动到另一个塔我有以下布局

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

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

例如,如果我尝试使用Block1.animate().setDuration(3000).translationX(1000)Block1Tower1Tower2的移动设置动画。按照现在的布局,Block1将在Tower1中设置动画,但Block1在离开Tower1的那一刻就被剪裁

我已经尝试过通过在XML文件中最后添加块来更改z顺序。不过,它并不可靠。

为了确保动画不会被剪切,我决定将Block1(名为copyBlock)的副本添加到根RelativeLayout,将copyBlock定位在Block1的顶部,并将其动画化到目标Tower2(在坐标中定义)

为了得到目的地坐标,我计划在Tower2中添加一个不可见的copyBlock,然后得到坐标。这样,我就可以利用LinearLayout的布局函数来解决填充、重力等问题。否则,我必须得到Tower2的位置,计算最上面的块,调整Block1的坐标,使其位于最上面的区块的顶部并居中。

但是,我敢肯定这种方式很难,还有更好的方式

问题


  • 如何在不必向目标塔添加不可见视图的情况下获得上述目标坐标有没有一种方法可以要求"预布局"而不必将视图添加到布局中
  • 你对动画被剪辑的原因有什么解释吗?有没有更好的方法来解决这个问题,而不是向根RelativeLayout ViewGroup添加新视图

好的,

1-您无法解决剪裁问题,因为您试图将子对象移动到父对象尺寸之外,除非您在同一个父对象中移动。

2-使用FrameLayout而不是RelativeLayout,这样可以正确控制视图边距;

3-你可以通过知道根布局的高度和宽度来获得目的地坐标,看起来塔的宽度是相等的,所以(总宽度/3)会给出单元宽度,然后得到X坐标,(总高度-单元高度)会给出塔的Y坐标(假设你有塔的高度)

最新更新