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

How to programatically alter "x-delta" of an Animation instance?

假设我们想要一个水平 "shakes" 视图的动画。

我们这样做:

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中定义的"shake distance"是dp/pixels中解释的静态距离,因此将在不同的设备上会有所不同——在高分辨率设备上,运动会很微妙……就像电动牙刷一样,但在低分辨率设备上,运动会很剧烈,就像在旧车场里挥舞着的充气娃娃一样。

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

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

但是......为了做到这一点,我们必须能够在代码中设置 "x-delta"......但我看不出这样做的方式。

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

是否可以通过编程方式更改动画实例的 "x-delta"?

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

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