如何以编程方式更改动画实例的“x-delta”?

Posted

技术标签:

【中文标题】如何以编程方式更改动画实例的“x-delta”?【英文标题】:How to programatically alter "x-delta" of an Animation instance? 【发布时间】:2018-08-06 07:26:43 【问题描述】:

假设我们想要一个水平“摇动”视图的动画。

我们这样做:

Java:

private void shakeView(final View v) 

        v.clearAnimation();

        Animation animShake = AnimationUtils.loadAnimation(this, R.anim.shake);

        v.startAnimation(animShake); 

xml:

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate
        android:duration="60"
        android:fromXDelta="-20"
        android:toXDelta="20"
        android:repeatCount="14"
        android:repeatMode="reverse"
        android:interpolator="@android:anim/linear_interpolator" />
</set>

但是,由于我们非常细致,我们意识到在 xml 中定义的“摇动距离”是以 dp/pixels 解释的静态距离,因此在不同的设备上会有所不同——高分辨率设备,运动会很微妙……就像电动牙刷一样,但在低分辨率设备上,运动会像二手车场中的一个吹气球一样剧烈。

最好将“x-delta”表示为视图宽度的比率:

float ratio = 14f/392f;
float valueOfXTranslation = ratio*v.getWidth();

但是...为了做到这一点,我们必须能够在代码中设置“x-delta”...我认为没有办法这样做。

我尝试输入“animShake”。 -- "dot" -- 查看可用的选项......虽然有一些设置器,但似乎没有一个允许设置“x-delta”。我想我应该放弃并使用其他动画技术尝试完全不同的方法,但我简直不敢相信这是不可能的。

是否可以以编程方式更改动画实例的“x-delta”?

【问题讨论】:

你不能使用 android:toXDelta="5%p"/android:fromXDelta="-5%p" 之类的东西来使它在屏幕尺寸之间更加统一吗? 这就是答案!你应该把它放进去,我会奖励你的! 【参考方案1】:

您可以在 xml 中使用可选的 %p 来控制相对于父大小的移动量。喜欢:

android:fromXDelta="-5%p"
android:toXDelta="5%p"

【讨论】:

对我来说,我只做了 5% 没有 'p' ...但我完全不知道您可以像这样在 xml 中定义百分比,所以谢谢!。 @BooberBunz 是的,% 基于基本大小 - %p 在某些父容器上。

以上是关于如何以编程方式更改动画实例的“x-delta”?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式创建的动画 NSLayoutConstraint

以编程方式滑动时更改ViewPager动画持续时间

如果约束是使用 VFL 以编程方式创建的,如何为约束更改设置动画?

如何在不制作 IBOutlet 的情况下以编程方式在 Swift 中为 UIView 高度约束设置动画?

以编程方式更改中心 X / Y 的对齐约束的乘数

如何更改 JavaScript 中的动画计时功能?