当视图沿 Y 轴旋转时,如何找出 X 轴减少量?
我正在尝试结合使用旋转和平移来创建折叠动画。
我有 2 个 TextViews 并排坐着,如下面的 xml 所示:
<LinearLayout
android:id="@+id/colorBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:layout_marginBottom="10dp">
<TextView
android:id="@+id/left"
android:layout_width="150dp"
android:layout_height="150dp"
android:background="@android:color/holo_blue_dark"
android:text="A"
android:textSize="100sp"/>
<TextView
android:id="@+id/right"
android:layout_width="150dp"
android:layout_height="150dp"
android:background="@android:color/holo_green_dark"
android:text="B"
android:textSize="100sp" />
</LinearLayout>
我计划实现折叠动画的方式是同时旋转左右 textview,同时将右 textView 向左平移。我使用下面的代码实现了这一点:
left.setPivotX(0f);
left.setPivotY(left.getHeight()/2);
right.setPivotX(right.getWidth());
right.setPivotY(right.getHeight()/2);
ObjectAnimator rotateLeft;
rotateLeft = ObjectAnimator.ofFloat(left, "rotationY", left.getRotationY(), 45.0f);
ObjectAnimator rotateRight;
rotateRight = ObjectAnimator.ofFloat(right, "rotationY", right.getRotationY(), -45.0f);
ObjectAnimator translateRightX;
translateRightX = ObjectAnimator.ofFloat(right, "x", right.getX()-amountOfXToTranslate);
animateSet = new AnimatorSet();
animateSet.play(rotateRight).with(rotateLeft).with(translateRightX);
animateSet.setDuration(3000);
animateSet.setInterpolator(new DecelerateInterpolator());
animateSet.start();
我的问题是如何计算 的值amountOfXToTranslate
?
我尝试过各种数学计算。
方法1:基于当视图旋转90度时宽度为0并且完全消失的推理,并且当视图完全不旋转(0度旋转)时宽度处于最大值。我假设当它旋转 45 度时,它沿 X 轴的宽度应该是其最大宽度的一半。所以在这种情况下,按照这个逻辑,假设我有 2 个文本视图,每个 150dp 宽,当它们都处于 45 度角时,两个视图之间的空间量将为 (150/2)* 2. amountOfXToTranslate
150也是如此。
经过测试,我的假设被证明是错误的。出于某种原因,此公式适用于某些尺寸,而对于其他尺寸则失败得很惨。(例如:当两个文本视图的宽度都是 100dp 并且我进行 100dp 平移时,动画看起来很好,两个视图之间没有间隙。但是当它们每个宽度为 150dp 时,就会有间隙。所以公式出现了适用于小于 150dp 的宽度)
方法 2:因此,由于方法 1 的失败,我决定使用真正的数学方法并在 3 维平面中考虑这一点。使用我们在高中教过的基本数学,三角函数:
http ://www.suitcaseofdreams.net/Images/BackGround/SinCos.gif
我想我可以使用(AC和ABamountOfXToTranslate
的公式)计算值AC = AB cos 45
是基于附加链接中的图像)。所以我计算要翻译的 X 量的最终公式是(widthOfTextView * cos 45) * 2
. 不幸的是,在尝试了这个公式之后,它仍然不正确,并且 X 平移量不足,在 2 个视图之间留下了差距。
以下是我的问题和尝试的一些图像:http://i41.tinypic.com/20z8d4o.png、http : //i41.tinypic.com/2hmkbj4.png、http : //i40.tinypic.com/k12xbq 。 PNG
那么我如何找到 的价值amountOfXToTranslate
?
该问题部分与如何在 3d 空间中的 x 轴上旋转平面时计算底边的高度有关?但奇怪的是,反向方程不起作用(方法 2)。
编辑好吧,我决定做一些手动调查工作,结果令人难以置信。以下测试结果是在恒定视角高度 150dp 和沿 Y 轴旋转 45 度的情况下进行的。
结果1:每个view的宽度为150px时,旋转后关闭2个view之间的间隙需要平移120px
结果2:每个view的宽度为300px时,旋转后关闭2个view之间的间隙需要平移为290px
结果3:当每个view的宽度为450px时,旋转后缩小2个view之间间隙所需的平移为490px
结果4:当每个view的宽度为600px时,缩小2个view之间的间隙所需的平移旋转后为 712px
我只是觉得奇怪的是,当每个视图的宽度小于 300 时,所需的平移量却小于单个视图的宽度。但是,当每个视图的宽度超过 300 时,需要的平移量大于单个视图的宽度。