当视图沿Y轴旋转时,如何计算X轴缩减

时间:2013-10-07 03:36:41

标签: android android-animation android-view trigonometry

当沿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.pnghttp://i41.tinypic.com/2hmkbj4.pnghttp://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时,所需的平移量大于单个视图的宽度。

0 个答案:

没有答案