在android中摇动/摆动视图动画

Tyl*_*r I 71 android android-animation

我创建了一个anim.xml文件,如下面的动摇图像视图像IOS图标震动在android中.但它并没有给我同样的结果.有什么好主意吗?

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"

    android:fromDegrees="-2"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="infinite"
    android:toDegrees="2" />
Run Code Online (Sandbox Code Playgroud)

MH.*_*MH. 159

尝试设置android:repeatMode="reverse".下面的动画给我的Galaxy Nexus一个非常合理的模仿.显然你可以根据自己的喜好微调参数.

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="100"
    android:fromDegrees="-5"
    android:pivotX="50%"
    android:pivotY="50%"
    android:repeatCount="infinite"
    android:repeatMode="reverse"
    android:toDegrees="5" />
Run Code Online (Sandbox Code Playgroud)

  • 我们如何添加抖动之间的延迟。例如显示抖动 500 毫秒然后延迟 1000 毫秒然后再次重复? (3认同)

Sam*_*Sam 57

好动摇动画 ;

res/anim/shake.xml

<set xmlns:android="http://schemas.android.com/apk/res/android">

    <translate android:duration="150"
        android:fromXDelta="-10%"
        android:repeatCount="5"
        android:repeatMode="reverse"
        android:toXDelta="10%"/>
</set>
Run Code Online (Sandbox Code Playgroud)

如何使用它

final Animation animShake = AnimationUtils.loadAnimation(this, R.anim.shake);
btn_done = (Button) findViewById(R.id.btn_act_confirm_done); 
btn_done.startAnimation(animShake);
Run Code Online (Sandbox Code Playgroud)

  • 在我看来, `android:duration="50"` 看起来不那么不稳定,而且看起来更好 (3认同)

adn*_*eal 44

你可以试试这个:

shake.xml

<translate xmlns:android="http://schemas.android.com/apk/res/android" 
           android:fromXDelta="0" 
           android:toXDelta="10" 
           android:duration="1000" 
           android:interpolator="@anim/cycle_7" />
Run Code Online (Sandbox Code Playgroud)

cycle_7.xml

<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" 
                   android:cycles="7" />
Run Code Online (Sandbox Code Playgroud)

  • 嘿,我想`cycle_7.xml`可以替换为`<translate ... />中的`android:repeatCount ="7"`属性 (8认同)

Sim*_*mon 28

尝试使用这个:

<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:duration="70"
        android:fromDegrees="-5"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="5"
        android:repeatMode="reverse"
        android:interpolator="@android:anim/linear_interpolator"
        android:toDegrees="5" />
    <translate
        android:fromXDelta="-10"
        android:toXDelta="10"
        android:repeatCount="5"
        android:repeatMode="reverse"
        android:interpolator="@android:anim/linear_interpolator"
        android:duration="70" />
</set>
Run Code Online (Sandbox Code Playgroud)


Teo*_*nke 14

我在Android上创建了一个摇动效果并发布在GitHub中.看看它是否更好.

https://github.com/teoinke/ShakeAnimation

相关代码:

<?xml version="1.0" encoding="utf-8"?>
<set
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@android:anim/overshoot_interpolator"
    android:fillAfter="true">

    <translate
        android:startOffset="100"
        android:fromXDelta="0%p"
        android:toXDelta="10%p"
        android:duration="50" />

    <translate
        android:startOffset="150"
        android:fromXDelta="0%p"
        android:toXDelta="-25%p"
        android:duration="110" />


    <translate
        android:startOffset="260"
        android:fromXDelta="0%p"
        android:toXDelta="25%p"
        android:duration="120" />


    <translate
        android:startOffset="380"
        android:fromXDelta="0%p"
        android:toXDelta="-20%p"
        android:duration="130" />


    <translate
        android:startOffset="510"
        android:fromXDelta="0%p"
        android:toXDelta="10%p"
        android:duration="140" />

</set>
Run Code Online (Sandbox Code Playgroud)


Hit*_*ahu 14

像这样制造震动效果

在此输入图像描述

首先在anim文件夹中将shake动画定义为shake.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <rotate
        android:duration="70"
        android:fromDegrees="-5"
        android:interpolator="@android:anim/linear_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:repeatCount="5"
        android:repeatMode="reverse"
        android:toDegrees="5" />
    <translate
        android:duration="70"
        android:fromXDelta="-10"
        android:interpolator="@android:anim/linear_interpolator"
        android:repeatCount="5"
        android:repeatMode="reverse"
        android:toXDelta="10" />
</set>
Run Code Online (Sandbox Code Playgroud)

然后在代码中

if (TextUtils.isEmpty(phone.getText())
 || phone.getText().length() < 10)
    {
     //shake animation
    phone.startAnimation(AnimationUtils.loadAnimation(getActivity(), R.anim.shake));
     }
Run Code Online (Sandbox Code Playgroud)


小智 11

这个非常好(虽然不完美)作为iOS"错误的PIN"震动克隆:

    final float FREQ = 3f;
    final float DECAY = 2f;
    // interpolator that goes 1 -> -1 -> 1 -> -1 in a sine wave pattern.
    TimeInterpolator decayingSineWave = new TimeInterpolator() {
                @Override
                public float getInterpolation(float input) {
                    double raw = Math.sin(FREQ * input * 2 * Math.PI);
                    return (float)(raw * Math.exp(-input * DECAY));
                }
            };

    shakeField.animate()
            .xBy(-100)
            .setInterpolator(decayingSineWave)
            .setDuration(500)
            .start();
Run Code Online (Sandbox Code Playgroud)


小智 8

/**
 *
 * @param view      view that will be animated
 * @param duration  for how long in ms will it shake
 * @param offset    start offset of the animation
 * @return          returns the same view with animation properties
 */
public static View makeMeShake(View view, int duration, int offset) {
    Animation anim = new TranslateAnimation(-offset,offset,0,0);
    anim.setDuration(duration);
    anim.setRepeatMode(Animation.REVERSE);
    anim.setRepeatCount(5);
    view.startAnimation(anim);
    return view;
}
Run Code Online (Sandbox Code Playgroud)

用:

TextView tv;
makeMeShake(tv,20,5);    // it will shake quite fast
Run Code Online (Sandbox Code Playgroud)

  • 工作完美而且非常快。 (2认同)

Joe*_*Joe 5

对于 Kotlin 用户:

首先创建一个名为shake.xml的动画资源文件。右键单击 Android Studio 中的 res 文件夹,然后单击新建 > Android 资源文件 >在文件名中输入shake,然后在资源类型下拉列表中选择动画。单击确定。

里面shake.xml粘贴以下内容:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
    <translate android:duration="200"
               android:fromXDelta="-5%"
               android:repeatCount="3"
               android:repeatMode="reverse"
               android:toXDelta="5%"/>
</set>
Run Code Online (Sandbox Code Playgroud)

现在只需在视图上调用它!

从片段中:

myView.startAnimation(AnimationUtils.loadAnimation(view!!.context, R.anim.shake))
Run Code Online (Sandbox Code Playgroud)

从活动中:

myView.startAnimation(AnimationUtils.loadAnimation(this, R.anim.shake))
Run Code Online (Sandbox Code Playgroud)

(注意 -myView是给要动画的视图的 ID)

如果您想微调动画,只需修改shake.xml.