Trudno mi opisać ten problem słowami, dlatego nakręciłem film (45 sekund), aby go zilustrować. Oto podgląd pytań, spójrz na to na Vimeo: http://vimeo.com/epologee/perfect-crossfade
Problem tworzenia bezproblemowego przenikania lub rozpuszczania dwóch obrazów lub kształtów powtarzał mi się w wielu dziedzinach w ciągu ostatniej dekady. Najpierw w edycji wideo, potem w animacji Flash, a teraz w programowaniu na iOS. Kiedy zaczniesz googlować, istnieje wiele obejść, ale tym razem naprawdę chcę rozwiązać ten problem bez włamania.
Podsumowanie:
Jak nazywa się technika lub krzywa, która ma być stosowana przy przenikaniu dwóch półprzezroczystych map bitowych o tym samym kolorze, jeśli chcesz, aby wynikowa przezroczystość była zgodna z oryginałem jednego?
Czy istnieje funkcja (matematyczna) do obliczania niezbędnych wartości częściowej przezroczystości / alfa podczas zanikania?
Czy są języki programowania, które mają te funkcje jako preset, podobne do ease in
, ease out
lub ease in out
funkcje znalezione w języku ActionScript lub kakao?
Aktualizacja: Oprócz wideo stworzyłem przykładowy projekt (wymaga Xcode i iOS SDK) i opublikowałem go na github. Pokazuje tę samą animację co wideo, ale tym razem z kwadratami: https://github.com/epologee/StackOverflow-Example-Code
Odpowiedzi:
Obawiam się, że to niemożliwe. Tak obliczana jest przezroczystość, gdy nakładają się dwa obiekty: http://en.wikipedia.org/wiki/Alpha_compositing
Jeden z obiektów musi mieć krycie 1, jeśli nie chcesz, aby obszar nakładki był widoczny.
źródło
Nie wiem, jak mogłaby się nazywać w dziedzinie edycji wideo, ale nazwałbym krzywą krzywą S lub krzywą sigmoidalną . Stworzenie efektu przenikania, którego szukasz w systemie iOS, powinno być bardzo proste, korzystając z funkcji kCAMediaTimingFunctionEaseInEaseOut Core Animation . Wystarczy animować
alpha
właściwość dwóch widoków w przeciwnych kierunkach (jeden 0-> 1, jeden 1-> 0) za pomocą tej funkcji pomiaru czasu:Uwaga: Naprawdę powinieneś używać metod animacji opartych na blokach zamiast wygodnych metod UIView. Użyłem powyższych metod UIView, ponieważ jest to bardzo łatwe do zrozumienia i łatwe do pisania z pamięci. Korzystanie z bloków nie jest jednak dużo trudniejsze.
Dodatek: Jeśli nie podoba Ci się UIViewAnimationEaseInOut, możesz utworzyć własną funkcję pomiaru czasu opisaną w rozdziałach Czas, Przestrzenie czasowe i CAAnimation . Jest to nieco bardziej zaawansowane niż prosta animacja pokazana powyżej, ale daje Ci pełną kontrolę, jakiej potrzebujesz.
źródło
kCAMediaTimingFunctionEaseInEaseOut
. Miałeś na myśliUIViewAnimationCurveEaseInOut
? Problem z tą krzywą jest jednak taki sam (spadek na środku), ponieważ w dowolnym momencie dwie wartości alfa w prostym dodaniu będą równe1.0
, gdzie jak w mojej ręcznie wyregulowanej krzywej trzeba ją przekroczyć,1.0
aby uzyskać pożądane wyniki .initialTransparency
wartość, nie ma sensu. Nie miałbyś pojęcia, co dalej?W grafice komputerowej ta funkcja nazywa się gładkim krokiem . W przypadku płynnego przenikania określa globalną wartość alfa kompozycji.
Jeśli obrazy wejściowe mają kanał alfa, najpierw upewnij się, że alfa jest wstępnie pomnożone . Następnie możesz wykonać kompozycję crossfade od razu, korzystając z płynnego przejścia
alpha
na każdym kanale [X = A*alpha + B*(1-alpha)
] i oczekiwać rozsądnych rezultatów.źródło
Możesz użyć funkcji rozkładu wykładniczego:
Twój wykres wygląda bardziej jak:
źródło
1 - Alpha1(time)
równania nie zajmie się zapadnięciem, ponieważ dwa zmieszane obrazy 0,5 alfa nie dadzą złożonego obrazu z 1,0 alfa. Narysowane przeze mnie niestandardowe krzywe nie są odbijane pionowo.