2012-02-25 3 views
54

Я создал файл anim.xml, например, ниже, чтобы встряхнуть изображение, например, значок IOS, сотрясающий в android. Однако он не дает мне такого же результата. Есть ли лучшая идея?shaking/wobble view animation in 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" /> 

ответ

132

Попробуйте установить 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" /> 
+0

Это работает, но теперь мое приложение пропускает кадры :( – Tom

+0

Я новичок в разработке android, я использую Xamarin, не могли бы вы рассказать мне, как я могу применить эту анимацию к изображению/кнопке на любом событии, таком как клик и т. Д. –

+0

@ NK: Он должен работать так же, как и в Java: загружать анимацию по его идентификатору ресурса и сообщать вашему представлению о запуске анимации, передав ее как параметр. Должен выглядеть примерно так: 'view.StartAnimation (AnimationUtils.LoadAnimation (Resource.Animation. wobble)) '. Подробнее [здесь] (https://developer.xamarin.com/guides/android/application_fundamentals/graphics_and_animation/#View_Animations) и [здесь] (http://stackoverflow.com/a/30841945/1029225) –

36

Вы можете попробовать это:

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" /> 

cycle_7.xml

<cycleInterpolator xmlns:android="http://schemas.android.com/apk/res/android" 
        android:cycles="7" /> 
+6

эй я думаю, 'cycle_7.xml' может быть заменен на' андроида: RepeatCount = "7" 'attribute в' ' – Anup

+0

Это потрясающая и идеальная анимация для неверного пароля или эффекта встряхивания. Благодаря!!! –

0

IOS вобуляция анимации не так просто попытаться изменить поворот x и y случайным образом при вращении. Вы должны изменить значение программно, хотя. Может быть, вы также можете использовать анимацию переводить одновременно

24

попробовать использовать этот один:

<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> 
9

Я создал встряхивания эффект на 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> 
+2

Хотя эта ссылка может ответить на вопрос, ter, чтобы включить основные части ответа здесь и предоставить ссылку для справки. Ответные ссылки могут стать недействительными, если связанная страница изменится. – Anthon

+0

Хорошо, я обновил свой ответ, включая код. –

0

ударяться головой в течение более двух часов, я знал, как дрожать и качаться с видом.

К сожалению, принятый ответ не будет работать отдельно от onCreateView фрагмента.

Пример, если у вас есть метод onClick и внутри него. У вас есть анимация, как внизу, это не сработает.

Пожалуйста, ознакомьтесь с кодом.

DoneStart.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View view) { 
      register(view); 

     } 
    }); 

Метод регистр имеет некоторые проверки, как показано ниже кода

private void register(View view) { 
    String type = typedThings.getText.toString(); 
    String km = Km_Now.getText().toString(); 

    if (serviceType == null) { 
     animationServiceList = AnimationUtils.loadAnimation(getActivity(), R.anim.shake_wobble); 
     silverServiceButton.setAnimation(animationServiceList); 
     generalServiceButton.setAnimation(animationServiceList); 
     platinumServiceButton.setAnimation(animationServiceList); 
     animationServiceList.start(); 
    } else if (km == null) { 
     animationEditText = AnimationUtils.loadAnimation(getActivity(), R.anim.shake_wobble); 
     Km_Now.setAnimation(animationEditText); 
     animationEditText.start(); 
    } 

вызовов animationServiceList.start(); никогда не будет называться,

РЕШЕНИЕ: Используйте PropertyAnimator как ObjectAnimator.

16

Моя анимация встряхивания ниже;

res/anim shake.MXL

<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> 

Как использовать

final Animation animShake = AnimationUtils.loadAnimation(this, R.anim.shake); 
btn_done = (Button) findViewById(R.id.btn_act_confirmation_done); 
btn_done.startAnimation(animShake); 
3

Для того, чтобы встряхнуть эффект, как этот

enter image description here

Сначала определим сотрясения анимации внутри папки Anim как 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> 

Затем в коде

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

Другие ответы правильны как хорошо, но это немного более гладкой, чем их, так как он использует интерпол производит гладкие числа для СПИНКИ поступательное движение

public class WobblyView extends ImageView implements ValueAnimator.AnimatorUpdateListener { 
    private final ValueAnimator va = ValueAnimator.ofInt(-10, 10); 

    public WobblyView(Context context) { 
     this(context, null); 
    } 

    public WobblyView(Context context, @Nullable AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public WobblyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     setAdjustViewBounds(true); 
     setImageResource(R.drawable.ic_logo); 
     va.setInterpolator(new AccelerateDecelerateInterpolator()); 
     va.setRepeatMode(ValueAnimator.REVERSE); 
     va.setRepeatCount(ValueAnimator.INFINITE); 
     va.setDuration(1000); 
    } 

    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     va.addUpdateListener(this); 
     va.start(); 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     va.removeUpdateListener(this); 
    } 

    @Override 
    public void onAnimationUpdate(ValueAnimator animation) { 
     int heading = (int) animation.getAnimatedValue(); 
     setRotation(heading); 
    } 
} 
1

Я создал очень хорошее приближение iOS встряхивания (когда вы долго нажимаете значок, чтобы удалить приложение с рабочего стола). Вы должны обратиться в свой код, программно, так как это требует генерации случайных чисел:

int dur1 = 70 + (int)(Math.random() * 30); 
int dur2 = 70 + (int)(Math.random() * 30); 

// Create an animation instance 
Animation an = new RotateAnimation(-3, 3, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 

// Set the animation's parameters 
an.setDuration(dur1);    // duration in ms 
an.setRepeatCount(-1);    // -1 = infinite repeated 
an.setRepeatMode(Animation.REVERSE); 
an.setFillAfter(true);    // keep rotation after animation 


// Create an animation instance 
Animation an2 = new TranslateAnimation(-TranslateAnimation.RELATIVE_TO_SELF,0.02f, 
     TranslateAnimation.RELATIVE_TO_SELF,0.02f, 
     -TranslateAnimation.RELATIVE_TO_SELF,0.02f, 
     TranslateAnimation.RELATIVE_TO_SELF,0.02f); 

// Set the animation's parameters 
an2.setDuration(dur2);    // duration in ms 
an2.setRepeatCount(-1);    // -1 = infinite repeated 
an2.setRepeatMode(Animation.REVERSE); 
an2.setFillAfter(true);    // keep rotation after animation 

AnimationSet s = new AnimationSet(false);//false means don't share interpolators 
s.addAnimation(an); 
s.addAnimation(an2); 

// Apply animation to image view 
itemView.setAnimation(s); 

Этот код был дизайн для применения внутри GridView закрепительной (в GetView), но вы можете применить к любому мнению, изменив последний line to:

yourViewName.setAnimations (s);

3

Это один работает довольно хорошо (хотя и не идеально) как 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();