मैं एक रिंगिंग बेल एनीमेशन बना रहा हूं (एक इमेजव्यू 10 डिग्री और फिर -10 घुमाया गया)। मैं दो RotateAnimations और AnimationListeners सेट कर रहा हूं, दोनों के onAnimationEnd में मैं ImageView पर अन्य एनीमेशन शुरू करता हूं। ऐसे:

ऑनक्रिएट:

final RotateAnimation rotateAnimationLeft = new RotateAnimation(-10, 10, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
final RotateAnimation rotateAnimationRight = new RotateAnimation(10, -10, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

rotateAnimationLeft.setDuration(150);
rotateAnimationRight.setDuration(150);

rotateAnimationLeft.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        ivBell.startAnimation(rotateAnimationRight);
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
    }
});

rotateAnimationRight.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        ivBell.startAnimation(rotateAnimationLeft);
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
    }
});

ivBell.startAnimation(rotateAnimationRight);

मैंने एक ऑन टच लिस्टनर स्थापित किया है जिसमें मैं एनीमेशन को रोकना चाहता हूं।

ivBell.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        final int X = (int) event.getRawX();

        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                ivBell.clearAnimation();
                break;
        }
    }
}

यह काम नहीं करता है। इसे रोकने की क्या जरूरत है?

(या अगर यह गलत तरीका है, तो मैं कुछ सिफारिशों की सराहना करता हूं कि मुझे उस घंटी को कैसे बजाना चाहिए :) धन्यवाद!)

0
Mitulát báti 29 जुलाई 2019, 23:35

1 उत्तर

सबसे बढ़िया उत्तर

यहां मुद्दा यह है कि जब आप वर्तमान में चल रहे एनीमेशन को साफ़ कर रहे हैं, तो एनीमेशन अंत अगले एनीमेशन को ट्रिगर करता है (एक नया चक्र शुरू करता है)। आपको एनीमेशन श्रोता को हटाने की जरूरत है (इसे शून्य पर सेट करें) और फिर एनीमेशन को साफ़ करें,

if(ivBell.getAnimation() != null) {
    ivBell.getAnimation().setAnimationListener(null);
    ivBell.clearAnimation();
}

लेकिन इस मामले में, आपको श्रोता को एक अलग चर में संग्रहीत करना होगा (यदि आप इसे फिर से उपयोग करना चाहते हैं)। हो सकता है कि एक बहुत आसान विकल्प केवल एक बूलियन ध्वज का उपयोग करना होगा जिसका उपयोग यह निर्धारित करने के लिए किया जा सकता है कि एनीमेशन श्रोताओं में 'बाद के' एनिमेशन शुरू किए जाने चाहिए या नहीं।

public class Main2Activity extends AppCompatActivity {

    boolean shouldAnimateFlag = true;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        final ImageView ivBell = findViewById(R.id.ivBell);

        final RotateAnimation rotateAnimationLeft = new RotateAnimation(-10, 10, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
        final RotateAnimation rotateAnimationRight = new RotateAnimation(10, -10, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);

        rotateAnimationLeft.setDuration(150);
        rotateAnimationRight.setDuration(150);

        rotateAnimationLeft.setAnimationListener(new Animation.AnimationListener() {
            @Override public void onAnimationStart(Animation animation) { }

            @Override
            public void onAnimationEnd(Animation animation) {
                if(shouldAnimateFlag) {
                    ivBell.startAnimation(rotateAnimationRight);
                }
            }

            @Override public void onAnimationRepeat(Animation animation) { }
        });

        rotateAnimationRight.setAnimationListener(new Animation.AnimationListener() {
            @Override public void onAnimationStart(Animation animation) { }

            @Override
            public void onAnimationEnd(Animation animation) {
                if (shouldAnimateFlag) {
                    ivBell.startAnimation(rotateAnimationLeft);
                }
            }

            @Override public void onAnimationRepeat(Animation animation) { }
        });

        ivBell.startAnimation(rotateAnimationRight);

        ivBell.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //The following line will just stop the animation
//                shouldAnimateFlag = false;
                //You can start/stop using the following lines
                if(shouldAnimateFlag) {
                    shouldAnimateFlag = false;
                } else {
                    shouldAnimateFlag = true;
                    ivBell.startAnimation(rotateAnimationRight);
                }
            }
        });
    }
}
1
Chrisvin Jem 30 जुलाई 2019, 00:22