android'de sallama / yalpalama görünümü animasyonu


84

Android'de titreyen IOS simgesi gibi görüntü görünümünü sallamak için aşağıdaki gibi bir anim.xml dosyası oluşturdum. Ancak bana aynı sonucu vermiyor. Daha iyi bir fikir var mı?

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

Yanıtlar:


172

Ayarlamayı deneyin android:repeatMode="reverse". Aşağıdaki animasyon, Galaxy Nexus'umda çok makul bir taklit sağlar. Açıktır ki, parametreleri kendi zevkinize göre ince ayar yapabilirsiniz.

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

android geliştirmede yeniyim, Xamarin kullanıyorum, bu animasyonu tıklama vb. herhangi bir olayda bir resme / düğmeye nasıl uygulayabilirim lütfen söyler misiniz?
NK

@NK: Java ile aynı şekilde çalışmalıdır: animasyonu kaynak kimliğine göre yükleyin ve görünümünüze animasyonu parametre olarak geçirerek başlatmasını söyleyin. Gibi görünmelidir: view.StartAnimation(AnimationUtils.LoadAnimation(Resource.Animation.wobble)). Burada ve burada daha fazla ayrıntı .
MH.

3
Çalkalama arasındaki gecikmeyi nasıl ekleyebiliriz? örneğin 500 ms çalkalama gösterdikten sonra 1000 ms gecikmeli sonra tekrar tekrar et?
Damir Mailybayev

76

Güzel sallama animasyonu ;

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>

Bu nasıl kullanılır

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

Nasıl kullanılır (Daha basit sürüm):

btn_done.startAnimation(AnimationUtils.loadAnimation(this,R.anim.shake));

3
android:duration="50"Bence çok daha az dalgalı görünüyor ve çok daha iyi görünüyor
Ali Bdeir

45

Bunu deneyebilirsin:

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

10
hey sanırım içinde öznitelikle cycle_7.xmlikame edilebilirandroid:repeatCount="7"<translate .../>
Anup

28

bunu kullanmayı dene:

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

19

Böyle sallamak efekti yapmak için

görüntü açıklamasını buraya girin

Önce shake.xml olarak anim klasörünün içindeki sallama animasyonunu tanımlayın

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

Sonra kodda

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

14

Android'de bir sallama efekti oluşturdum ve GitHub'da yayınladım. Daha iyi çalışıp çalışmadığını görün.

https://github.com/teoinke/ShakeAnimation

İlgili kod:

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

1
Merkezden hareket ettiği ve diğer bazı öneriler gibi görüntüyü anında dengelemediği için benim için bu en iyi cevap. Pro!
Jonathan Dunn

13

Bu, iOS "yanlış PIN" titreyen bir klon olarak oldukça iyi çalışır (mükemmel olmasa da):

    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();

6
/**
 *
 * @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;
}

kullanım:

TextView tv;
makeMeShake(tv,20,5);    // it will shake quite fast

Mükemmel ve çok hızlı çalışır.
George Vrynios

3

IOS titremesine çok iyi bir yaklaşım oluşturdum (uygulamayı ana ekrandan kaldırmak için bir simgeye uzun bastığınızda). Rastgele sayı üretimi gerektirdiğinden, kodunuzun içinde programlı olarak başvurmanız gerekir:

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

Bu kod, bir bağdaştırıcının kılavuz görünümüne (getView) uygulanacak şekilde tasarlanmıştır, ancak son satırı şu şekilde değiştirerek herhangi bir görünüme de uygulayabilirsiniz:

yourViewName.setAnimations (s);


hiçbir şey yapmıyor
kullanıcı25

Lütfen bunun yalnızca itemViewViewGroup'a henüz eklenmemişse çalışacağını unutmayın. Zaten eklenmişse, itemView.startAnimation(s)bunun yerine kullanın.
Alex Semeniuk

2

Kotlin kullanıcıları için:

Önce shake.xml adlı bir Animasyon kaynak dosyası oluşturun . Android Studio'da res klasörüne sağ tıklayın, ardından Yeni> Android Kaynak Dosyası'na tıklayın> dosya adı için sallama girin ve Animasyon'u seçin Kaynak türü açılır için seçin. Tamam'ı tıklayın.

İçinde shake.xmlaşağıdaki yapıştırın:

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

Şimdi sadece manzaraya çağırın!

Bir parçanın içinden:

myView.startAnimation(AnimationUtils.loadAnimation(view!!.context, R.anim.shake))

Bir faaliyetin içinden:

myView.startAnimation(AnimationUtils.loadAnimation(this, R.anim.shake))

(Not - myView canlandırmak istediğiniz görünüme verilen kimliktir)

Animasyonda ince ayar yapmak isterseniz, içindeki değerleri değiştirmeniz yeterlidir shake.xml.


startAnimationve anim(içinde R.anim.shake) çözülmemiş referanslar, lütfen yardım edebilir misiniz? teşekkürler
Maff

res dizininde anim klasörü oluşturmanız gerekir @Maff
Aditya Patil

0

IOS yalpalama animasyonu, döndürürken pivot x ve y'yi rasgele değiştirmeye çalışmak o kadar basit değildir. Yine de değeri programatik olarak değiştirmelisiniz. Belki aynı anda çeviri animasyonunu da kullanabilirsiniz


0

İki saatten fazla bir süre kafamı salladığımda, bir manzarayı nasıl sallayıp sallayacağımı biliyordum.

Maalesef kabul edilen cevap, onCreateView parçası dışında çalışmayacaktır.

Örnek, onClick yönteminiz varsa ve içinde. Aşağıdaki gibi bir animasyonunuz var, çalışmayacak.

Lütfen kodu gözden geçirin.

    DoneStart.setOnClickListener(new OnClickListener() {

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

        }
    });

Kayıt yöntemi aşağıdaki kod gibi bazı kontrollere sahiptir

 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();
    }

Çağrı animasyonuServiceList.start (); asla aranmayacak

ÇÖZÜM: ObjectAnimator gibi PropertyAnimator'ı kullanın.


0

Diğer cevaplar da doğrudur, ancak bu onlardan biraz daha yumuşaktır çünkü bir enterpolatör kullanır, ileri bir hareket için düz sayılar üretir.

    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);
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.