dancer_69 Δημοσ. 25 Ιανουαρίου 2021 Δημοσ. 25 Ιανουαρίου 2021 Με τον προγραμματισμό γενικότερα ασχολούμαι περιστασιακά και για προσωπική χρήση. Με το 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; }
marios28 Δημοσ. 25 Ιανουαρίου 2021 Δημοσ. 25 Ιανουαρίου 2021 Δεν ασχολούμαι με android... βάσει αυτών που γράφεις πιθανόν να σε βοηθήσουν αυτά που αναφέρονται στο link: android - How to stop an animation (cancel() does not work) - Stack Overflow 1
dancer_69 Δημοσ. 26 Ιανουαρίου 2021 Μέλος Δημοσ. 26 Ιανουαρίου 2021 Το είχα δει αυτό, κάτι είχα δοκιμάσει από εκεί. Έκανα μια προσπάθεια πάλι, έβγαλα τις 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 που προτείνει κάποιος, αλλά ούτε αυτό λειτούργησε.
ralloss Δημοσ. 4 Μαΐου 2021 Δημοσ. 4 Μαΐου 2021 Γεια σου φιλε, έχει περάσει λίγος καιρός και ίσως έχεις βρει λύση, παρόλα αυτά θα πω κι εγώ τη γνώμη μου. Όπως βλέπω τον κώδικα , κάθε φορά που τρέχεις την 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 και τουμπαλιν. Ελπίζω να βοήθησα.. 1
dancer_69 Δημοσ. 7 Μαΐου 2021 Μέλος Δημοσ. 7 Μαΐου 2021 (επεξεργασμένο) Πράγματι έχει περάσει αρκετός καιρός και αφού δε βρήκα λύση το άφησα έτσι. Με το android studio δεν ασχολήθηκα από τότε μιας και άρχισα ν' ασχολούμαι με την godot. Αυτός είναι κι ο λόγος που είδα την απάντησή σου(τυχαία) μιας και έκανα μια ερώτηση σχετικά με την python πριν λίγο. Ευχαριστώ πάντως, θα κάνω μια προσπάθεια μήπως και διορθωθεί. EDIT: Τελικά, παρ' όλο που πίστευα ότι δε θα βγάλω άκρη μιας και έχω πολύ καιρό ν' ανοίξω το android studio και το project, τελικά με τη βοήθειά σου ήταν αρκετά εύκολο. Το άλλαξα και λειτουργεί μια χαρά τώρα. Ευχαριστώ και πάλι. Επεξ/σία 7 Μαΐου 2021 από dancer_69 1
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα