2015-05-12 8 views
7

Obserwuję błąd z animacją tętnienia na przycisku w systemie Android. Zasadniczo mam grupę ViewGroup, nazwij ją ButtonContainer, która zawiera 2 przyciski, nazwij je OkButton i CancelButton. Gdy użytkownik kliknie przycisk Anuluj, chcę ukryć ButtonContainer, ustawiając widoczność na GONE. Ale powoduje to efekt uboczny, że animacja ripple na CancelButton jest ustawiana w kolejce, ale nigdy nie jest odtwarzana, i odtwarza się następnym razem, gdy ButtonContainer stanie się widoczny. Dzieje się tak, ponieważ przycisk OnClickListener przycisku jest uruchamiany przed animacją marszczyć ma szansę zagrać. Ten artykuł opisuje dokładnie ten błąd, i pokazuje, jak dokładnie zachowuje pogląd: linkMasz przycisk wykonać OnClickListener na końcu animacji ripple (Material theme)

Autorka sugeruje obejścia problemu, ale zastanawiam się, czy jest jakiś sposób, aby mieć OnClickListener wylecieć po tętnienia animacji na dany przycisk jest grał?

Odpowiedz

4

Krótka odpowiedź: niezupełnie i zgodnie z Wytycznymi dotyczącymi materiałów (AFAIK) nie należy opóźniać wykonania onClick w taki sposób. Moim zdaniem spowodowałoby to dość słaby UX - podoba mi się guziki i nie lubię czekać na fantazyjne animacje.

Medium długości pół-odpowiedź: można zrobić szybko siekać i owinąć mięso logiki onClick w .postDelayed(...) rozmowy z wystarczającym opóźnieniem. Przy odpowiednim opóźnieniu akcja nastąpiłaby po fali. To jest hack, jest kruchy i chciałbym odradzić ci to rozwiązanie.

Długa odpowiedź: można określić, czy animacja zakończyła animację, chociaż ta ścieżka jest nieco skomplikowana. Ripple jest Drawable, i tak jak wszystkie animowane Drawables, informuje swój widok, kiedy zrobić animację (i kiedy ją zakończyć) z callback. Możesz skorzystać z tego wywołania zwrotnego, aby powiedzieć, kiedy animacja faktycznie się zakończyła.

E.g. możesz zaimplementować własne wywołanie zwrotne, które przesyła wszystkie wywołania do grupy ViewGroup hostingu, a także informuje, kiedy animacja została zakończona, abyś mógł prowadzić interesy.

W dolnej linii, myślę, że należy albo:

  • rozwiązać ten problem, ponieważ artykuł nie które połączone
  • Wystarczy zapomnieć o odzew w tej sprawie, czy to opcja.