代码之家  ›  专栏  ›  技术社区  ›  Nerdy Bunz

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

  •  3
  • Nerdy Bunz  · 技术社区  · 6 年前

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

    我们这样做:

    爪哇语:

    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/像素表示,因此在不同的设备上会有所不同——在高分辨率设备上,移动会很微妙。。。就像电动牙刷一样,但在低分辨率设备上,这种运动会非常剧烈,就像旧车停车场里的那些挥舞着的充气娃娃一样。

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

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

    但是。。。为了做到这一点,我们必须能够在代码中设置“x-delta”。。。我看不出有什么办法。

    我试过键入“animShake。”--“dot”--并查看可用的选项。。。虽然有一些二传手,但他们似乎都不允许设置“x-delta”,我想我应该放弃使用其他动画技术尝试完全不同的方法,但我不敢相信这是不可能的。

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

    1 回复  |  直到 6 年前
        1
  •  3
  •   Worthless    6 年前

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

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