एंड्रॉयड में मिलाते / डगमगाने दृश्य एनीमेशन


84

मैंने Android में IOS आइकन हिलाने जैसी छवि बनाने के लिए नीचे एक anim.xml फ़ाइल बनाई। हालांकि यह मुझे एक ही परिणाम प्रदान नहीं करता है। क्या कोई बेहतर विचार है?

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

जवाबों:


172

सेटिंग का प्रयास करें android:repeatMode="reverse"। नीचे दिया गया एनीमेशन मेरे गैलेक्सी नेक्सस पर एक बहुत ही उचित अपरिपक्वता देता है। जाहिर है आप अपनी पसंद के अनुसार मापदंडों को ठीक कर सकते हैं।

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

मैं एंड्रॉइड डेवलपमेंट के लिए नया हूं, मैं ज़मारिन का उपयोग कर रहा हूं, क्या आप मुझे बता सकते हैं कि मैं इस एनीमेशन को किसी भी घटना जैसे क्लिक आदि पर छवि / बटन पर कैसे लागू कर सकता हूं
एनके

@ एनके: यह जावा में समान काम करना चाहिए: एनीमेशन को इसकी संसाधन आईडी द्वारा लोड करें और इस पैरामीटर से गुजरते हुए एनीमेशन शुरू करने के लिए अपना दृष्टिकोण बताएं। कुछ ऐसा दिखाई देगा: view.StartAnimation(AnimationUtils.LoadAnimation(Resource.Animation.wobble))। अधिक जानकारी के लिए यहां और यहां
एमएच।

3
हम झटकों के बीच देरी को कैसे जोड़ सकते हैं। उदाहरण के लिए 500 एमएस के लिए शेक तो 1000 एमएस के लिए देरी फिर दोबारा दोहराएं?
दामिर मेलीबायेव

76

अच्छा शेक एनीमेशन ;

रेस / ऐनिमेशन / शेक। 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>

इसका इस्तेमाल कैसे करें

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

इसका उपयोग कैसे करें (सरल संस्करण):

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

3
android:duration="50"मेरी राय में रास्ता कम तड़का हुआ और बेहतर लग रहा है
अली बदीर

45

आप यह कोशिश कर सकते हैं:

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
अरे मुझे लगता है कि विशेषता के cycle_7.xmlलिए प्रतिस्थापित किया जा सकता android:repeatCount="7"है<translate .../>
अनूप

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>

19

इस तरह हिला प्रभाव बनाने के लिए

यहाँ छवि विवरण दर्ज करें

पहले शैंपू के रूप में एनीमेशन फ़ोल्डर के अंदर हिला एनीमेशन को परिभाषित करें

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

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>

1
मेरे लिए यह सबसे अच्छा उत्तर है, क्योंकि यह केंद्र से एनिमेट करता है और कुछ अन्य सुझावों की तरह छवि को तुरंत ऑफसेट नहीं करता है। समर्थक!
जोनाथन डन

13

यह एक बहुत अच्छी तरह से काम करता है (हालांकि पूरी तरह से नहीं) एक iOS "गलत पिन" के रूप में मिलाते हुए क्लोन:

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

उपयोग:

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

पूरी तरह से और बहुत तेजी से काम करता है।
जॉर्ज व्रीनिओस

3

मैंने 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);

यह कोड एडेप्टर के ग्रिडव्यू (getView) के अंदर लगाने के लिए डिज़ाइन किया गया था, लेकिन आप अंतिम पंक्ति को बदलकर किसी भी दृश्य पर लागू कर सकते हैं:

yourViewName.setAnimations (रों);


लगता है कि यह कुछ नहीं करता है
user25

कृपया ध्यान रखें कि यह केवल तभी काम करेगा जब itemViewViewGroup में जोड़ा नहीं गया था। यदि यह पहले से ही जोड़ा गया था, तो itemView.startAnimation(s)इसके बजाय उपयोग करें ।
एलेक्स सेमेनिएक

2

Kotlin उपयोगकर्ताओं के लिए:

पहले एक एनीमेशन संसाधन फ़ाइल बनाएँ, जिसे sha.xml कहा जाता है । Android Studio में Res फ़ोल्डर पर राइट क्लिक करें, फिर New> Android संसाधन फ़ाइल> फ़ाइल नाम के लिए शेक दर्ज करें और संसाधन प्रकार ड्रॉपडाउन के लिए एनीमेशन का चयन करें । ओके पर क्लिक करें।

अंदर 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>

अब बस इसे एक दृश्य पर कॉल करें!

एक टुकड़े के भीतर से:

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

एक गतिविधि के भीतर से:

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

(ध्यान दें - myViewक्या वह आईडी है जिसे आप चेतन करना चाहते हैं)

यदि आप एनीमेशन को फाइन-ट्यून करना चाहते हैं, तो बस मानों को संशोधित करें shake.xml


startAnimationऔर anim(भीतर R.anim.shake) दोनों अनसुलझे संदर्भ हैं, क्या आप मदद कर सकते हैं? धन्यवाद
Maff

आपको रेस डायरेक्टरी @Maff
Aditya Patil

0

IOS डगमगाने वाला एनीमेशन यह नहीं है कि रोटेट करते समय सरलता से धुरी x और y को बदलने की कोशिश करें। हालांकि आपको प्रोग्राम में मूल्य बदलना चाहिए। हो सकता है कि आप भी एक साथ अनुवाद एनीमेशन का उपयोग कर सकते हैं


0

दो घंटे से अधिक समय तक मेरे सिर को पीटना, मुझे पता था कि कैसे एक दृश्य को हिला और डगमगाना है।

दुर्भाग्य से स्वीकृत जवाब टुकड़े के onCreateView के अलावा काम नहीं करेगा।

उदाहरण यदि आपके पास ऑनक्लिक विधि और उसके अंदर है। आपके पास एनीमेशन होगा जैसे कि यह काम नहीं करेगा।

कृपया कोड के माध्यम से जाओ।

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

कॉल एनिमेशनसर्विस्टस्टार्ट (); कभी नहीं बुलाया जाएगा,

समाधान: ObjectAnimator की तरह PropertyAnimator का उपयोग करें।


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);
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.