Προς το περιεχόμενο

Android πρόβλημα με το σταμάτημα animation


dancer_69

Προτεινόμενες αναρτήσεις

Με τον προγραμματισμό γενικότερα ασχολούμαι περιστασιακά και για προσωπική χρήση. Με το android studio ειδικότερα, είχα ασχοληθεί κατά την περίοδο των εκδόσεων 4 - 6. Από τότε μόνο κάποιες λίγες φορές που χρειάστηκε να γίνουν κάποιες μικρό διορθώσεις σε 1-2 ήδη υπάρχουσες εφαρμογές.Μετά από χρόνια λοιπόν το εγκατέστησα και πάλι και ξεκίνησα το porting ενός python προγράμματος, το οποίο μετά από αρκετό ψάξιμο και βοήθεια απ' τις υπάρχουσες πηγές στο διαδίκτυο κατάφερα να ολοκληρώσω.

Το πρόβλημα που δεν κατάφερα να λύσω ήταν αυτό του τίτλου. Το σταμάτημα δηλαδή του animation μεταξύ δύο εικόνων background το οποίο έχει υλοποιηθεί ως εξής:

public ValueAnimator animateBackground(){
        final ImageView backgroundOne = (ImageView) findViewById(R.id.ImageView1);
        final ImageView backgroundTwo = (ImageView) findViewById(R.id.ImageView2);
        final ValueAnimator animator = ValueAnimator.ofFloat(0.0f, 1.0f);
        animator.setRepeatCount(ValueAnimator.INFINITE);
        animator.setInterpolator(new LinearInterpolator());
        animator.setDuration(10000L);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                final float progress = (float) animation.getAnimatedValue();
                final float width = backgroundOne.getWidth();
                final float translationX = width * progress;
                backgroundOne.setTranslationX(translationX);
                backgroundTwo.setTranslationX(translationX - width);
            }
        });
        return animator;
    }

Ο παραπάνω κώδικας βρέθηκε σε μια ανάρτηση στο stack overflow και προσαρμόστηκε ελαφρώς. Λειτουργεί κανονικά έτσι, αλλά σε πιο αδύναμες συσκεύες προκαλεί κάποιες καθυστερήσεις και γι' αυτό έχω προσθέσει ένα κουμπί για το σταμάτημα του. Βέβαια δεν κατάφερα να το κάνω να λειτουργήσει μιας και ότι δοκίμασα από τις λίγες σχετικές αναρτήσεις που βρήκα στο διαδίκτυο δεν λειτούργησε. Χωρίς να εμφανίζεται κάποιο σφάλμα απλά η εντολή αγνοείται και η κίνηση δεν σταμάτα. Δε θυμάμαι τι ακριβώς δοκίμασα αφού έχουν περάσει 2-3 εβδομάδες και αφού δεν βρήκα τρόπο το άφησα έτσι.

Επειδή όμως τελικά στη συσκευή που κυρίως το χρησιμοποιώ υπάρχει πρόβλημα καθυστέρησης κάνω την ερώτηση εδώ μήπως και κάποιος πιο έμπειρος και γνώστης περί android programming μπορέσει να βοηθήσει να βρεθεί μια λύση.

Το κουμπί για τη λειτουργία εκκίνησης/διακοπής της animation(που δε λειτουργεί βέβαια) είναι αυτό:

case R.id.bAnim:
                animIcon();
                MainActivity activityAnim = (MainActivity)context;
                if (animState==true){
                    activityAnim.animateBackground().start();
                }
                else {
                    activityAnim.animateBackground().removeAllUpdateListeners();
                    activityAnim.animateBackground().cancel();
                }
                break;
        }

 

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν ασχολούμαι με android... βάσει αυτών που γράφεις πιθανόν να σε βοηθήσουν αυτά που αναφέρονται στο link: android - How to stop an animation (cancel() does not work) - Stack Overflow

 

  • Thanks 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το είχα δει αυτό, κάτι είχα δοκιμάσει από εκεί. Έκανα μια προσπάθεια πάλι, έβγαλα τις ImagView από τη μέθοδο και τις δήλωσα στην onCreate ώστε να μπορέσω να τις χρησιμοποιήσω και τροποποίησα τη μέθοδο κλικ του κουμπιού ως εξής:

case R.id.bAnim:
                animIcon();
                MainActivity activityAnim = (MainActivity)context;
                if (animState==true){
                    activityAnim.animateBackground().start();
                }
                else {
                    System.out.println(animState);
                    activityAnim.animateBackground().cancel();
                    activityAnim.backgroundOne.clearAnimation();
                    activityAnim.backgroundTwo.clearAnimation();
                    activityAnim.animateBackground().removeAllUpdateListeners();
                }
                break;

Και πάλι όμως δε σταματάει. Η "else" εκτελείται, οπότε οι εντολές εκτελούνται, αλλά δεν έχουν κάποιο αποτέλεσμα.

Πριν απ' αυτό δοκίμασα και το setAnimation(null) στις ImageViews που προτείνει κάποιος, αλλά ούτε αυτό λειτούργησε.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 3 μήνες μετά...

Γεια σου φιλε,

έχει περάσει λίγος καιρός και ίσως έχεις βρει λύση, παρόλα αυτά θα πω κι εγώ τη γνώμη μου.

Όπως βλέπω τον κώδικα , κάθε φορά που τρέχεις την animateBackground παίρνεις καινούργιο animator γιατί τον δημιουργείς εκεί.
Δοκίμασε να τον βάλεις σε global scope, δηλαδή να τον δηλώσεις στο mainActivity , και να τον κάνεις instantiate, αν είναι null, μέσα στην animateBackground.
Έτσι κάθε φορά που θα τρέχεις την animateBackground
 θα παίρνεις πίσω το ιδιο object ,  όπως το έχεις τώρα παίρνεις κάθε φορά καινούργιο.
Όπως το έκανες στις imgviews δηλαδή όπου btw νομίζω πως το clearAnimation() δεν βοηθάει κάπου.
 πχ..

ValueAnimator animator;
...
public ValueAnimator animateBackground(){
	if(animator == null)
		animator = ValueAnimator.ofFloat(0.0f, 1.0f);
  	...
  	return animator;
}

 

Επίσης , το context που παίρνεις στη μέθοδο του κουμπιού , τι context είναι ; Το κουμπί είναι σε fragment ;

Κατα τα άλλα , έτσι όπως είναι το κουμπί , αν δούλευε θα δούλευε μια φορά μόνο , διότι κάνεις έλεγχο στο boolean σου ώστε  να ξεκινήσεις/ακυρώσεις το animation, αλλά μετά δεν το αλλάζεις. Πχ. αν το animState ήταν true να το κάνεις false και τουμπαλιν.

Ελπίζω να βοήθησα..

 

 

 

 


 

  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημοσ. (επεξεργασμένο)

Πράγματι έχει περάσει αρκετός καιρός και αφού δε βρήκα λύση το άφησα έτσι. Με το android studio δεν ασχολήθηκα από τότε μιας και άρχισα ν' ασχολούμαι με την godot. Αυτός είναι κι ο λόγος που είδα την απάντησή σου(τυχαία) μιας και έκανα μια ερώτηση σχετικά με την python  πριν λίγο. Ευχαριστώ πάντως, θα κάνω μια προσπάθεια μήπως και διορθωθεί.

EDIT:

Τελικά, παρ' όλο που πίστευα ότι δε θα βγάλω άκρη μιας και έχω πολύ καιρό ν' ανοίξω το android studio και το project, τελικά με τη βοήθειά σου ήταν αρκετά εύκολο. Το άλλαξα και λειτουργεί μια χαρά τώρα. Ευχαριστώ και πάλι.

Επεξ/σία από dancer_69
  • Like 1
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...