当沿Y轴旋转视图时,如何找出X轴减少?
我尝试使用旋转和平移的组合创建折叠动画。
我有2个TextView并排坐在一起,如下面的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翻译到左侧。我使用下面的代码实现了这一点:
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轴的宽度应该是其最大宽度的一半。所以在这种情况下,按照这个逻辑,假设我有两个文本视图,每个文本视图宽150dp,当它们都是45度角时,两个视图之间的空间量将是(150/2)* 2。所以amountOfXToTranslate
将是150。
经过测试,我的假设被证明是错误的。出于某种原因,这个公式适用于某些尺寸,而对其他尺寸则惨遭失败。 (例如:当textview的宽度都是100dp并且我做了100dp的翻译时,动画看起来很好,两个视图之间没有间隙。但是当它们每个宽150dp时,会有一个间隙。所以公式出现工作宽度小于150dp)
方法2:因此,在方法1失败的情况下,我决定使用真正的数学方法并在三维平面中考虑这一点。使用我们在高中教授的基本数学,三角函数:
http://www.suitcaseofdreams.net/Images/BackGround/SinCos.gif
我想我可以使用公式amountOfXToTranslate
计算AC = AB cos 45
的值(AC和AB基于附加链接的图像)。所以我计算要翻译的X量的最终公式是(widthOfTextView * cos 45) * 2
。不幸的是,在尝试这个公式之后,它仍然是不正确的,并且X转换的数量不足,在两个视图之间留下了空白。
以下是我的问题和尝试的一些图片:http://i41.tinypic.com/20z8d4o.png,http://i41.tinypic.com/2hmkbj4.png,http://i40.tinypic.com/k12xbq.png
那么如何找到amountOfXToTranslate
的价值?
这个问题部分与How do I calculate the height of the bottom edge when rotating a plane on the x-axis in 3d space?有关,但奇怪的是反向方程不起作用(方法2)。
EDITTED
好吧,我决定做一些手动调查工作,结果只是令人难以置信。
以下测试结果以恒定的视图高度150dp和沿Y轴旋转45度进行
结果1:当每个视图的宽度为150px时,旋转后两个视图之间的间隙需要平移为120px
结果2:当每个视图的宽度为300px时,旋转后两个视图之间的间隙所需的平移为290px
结果3:当每个视图的宽度为450px时,旋转后两个视图之间的间隙需要平移为490px
结果4:当每个视图的宽度为600px时,旋转后两个视图之间的间隙需要平移为712px
我觉得奇怪的是,当每个视图的宽度小于300时,所需的平移量小于单个视图的宽度。但是,当每个视图的宽度大于300时,所需的平移量大于单个视图的宽度。