Her Kare Kusursuz
(tonsky.me)- UI, kullanıcıların bir uygulamanın kalitesini değerlendirdiği neredeyse tek yüzeydir; hangi anda ekran görüntüsü alınırsa alınsın ekran durumu anlamlı olmalı ki güven oluşsun
- Yüksek derecede tamamlanmış bir UI, geliştiricinin ince ayar için zaman harcadığının işareti olur ve kod kalitesinin de benzer şekilde parlatılmış olduğuna dair makul bir sezgisel çıkarım sağlar
- Gerçek ölçüt; ekran geçişleri arasında beyaz yanıp sönmeleri, kısmi yüklemeyi, yükleme sırasında yeniden yerleşimi, durum metinlerindeki tutarsızlıkları ve hatalı animasyonları ortadan kaldırmaktır
- Başlangıç ve bitiş durumu iyi olsa bile ara kareler bozulursa bileşenler senkronize değilmiş hissi yaratır ve Photos örneğinde olduğu gibi gerçekte bir değişim olmayan geçişlerde bile sahte bir his oluşturabilir
- Animasyonlar geçişin anlaşılmasına yardımcı olmalıdır; yalnızca başlangıç ve bitişi değil, aradaki tüm kareleri de yönetmek UI’ı hassas bir araç gibi hissettirir
Temel ilke
- Wayland’in açık hedefi olan “every frame is perfect”, modern GPU yığınının karmaşıklığı içinde kontrolü geri kazanmayı amaçlayan teknik bir hedeftir
- Aynı ilke UI için de geçerlidir; uygulamanın herhangi bir anında alınan ekran görüntüsünde ekran doğal ve tutarlı görünmelidir
- Kullanıcılar kodu göremediği için, bir uygulamanın kalitesini değerlendirdikleri tek yüzey UI olur
- UI iyi parlatılmışsa bu, geliştiricinin ince işçilik için zaman harcadığının sinyalidir ve kodun da benzer düzeyde özenle işlendiği yargısına yol açar
Gerçek ölçütler ve örnekler
- Kusursuz kareler için ekranlar arasında beyaz yanıp sönme olmamalı; içerik kısmen yüklenmiş görünmemeli ve yükleme sırasında yerleşim yeniden akmamalıdır
- UI içindeki durum tutarlı olmalıdır; bir bölüm “1 güncelleme mevcut” derken başka bir bölüm “Güncellemeler denetleniyor...” dememelidir
- Animasyonlar sık sık unutulur; başlangıç ve bitiş durumu iyi olsa bile arası tuhafsa, ara ekran görüntüleri anlamsız karelere dönüşür
- Safari örneğinde yer tutucu metin ortadan hareket ederken imleç soldaki konumdan animasyonlanır; bu da iki bileşenin birbirine senkronize olmadığı hissini yaratır
- Photos örneğinde Crop ve Adjust modları arasında geçiş yapılırken fotoğraf anında yerine gider, ancak crop çerçevesi animasyonlu hareket eder; bu da mod geçişi sırasında sanki ince bir şey değişiyormuş gibi sahte bir his üretir
- Arama UI örneğinde, geçişi anlamayı kolaylaştırması gereken animasyon tam tersine büyüteç hareketini takip etmeyi zorlaştırır
- Youtube örneğinde, bir dikdörtgeni bir konumdan diğerine taşıma gibi basit bir işlemde bile garip hareketler ortaya çıkar; sebebi ne olursa olsun sonuç kusursuz olmayan karelerdir
- Preview uygulamasındaki yakınlaştırma animasyonu da dahil olmak üzere asıl nokta, yalnızca başlangıç ve bitiş durumlarına değil, aradaki her ana da dikkat edilmesi gerektiğidir
2 yorum
Hacker News yorumları
Yazarın verdiği örneklerin bazılarının kötü animasyon olduğu doğru, ancak yazının öncülüne katılmak zor
Bilgisayar grafikleri, insan görsel sisteminin özelliklerinden yararlanan bir alan ve hareket edenle duran şey farklı algılanır. Ayrı ayrı bakıldığında “yanlış” görünen kareler, gerçek zaman akışı içinde aslında en iyi görünen kareler olabilir
Sinemadan örnek verirsek, hızlı tracking shot'larda motion blur yüzünden tek tek kareler kötü görünebilir ve geniş açı çekimlerde distorsiyon yüzünden nesneler “yanlış” görünebilir, ama sinema salonunda amaçlanan sanatsal etkiyi yaratıyorsa bu doğru tercihtir
Harekete doğru blur eklendiğinde daha net hissedilir, ama durdurulmuş kareye bakınca elbette daha net görünmez. Kilit nokta, doğru motion blur'un o hızda insanın algılayabileceği hareketli detay kadar net görünmesini garanti etmesidir. Bu yüzden durmuş bir motion blur karesini netlik ya da yorumlanabilirlik ölçütüyle değerlendirmek yanlıştır
Yazının geri kalanı uygulama ayrıntılarına odaklanıyor, ama baştan bu animasyonların bazılarının gerçekten var olması gerekip gerekmediğini sorgulama fırsatını kaçırıyor. Hareket, sınırlı kullanıldığında iyi bir affordance olabilir; ancak bugün aşırı kullanımın ötesine geçip kullanıcının görüş alanına ve bilişsel yüküne müdahale ettiği durumlar da var. Tasarımcılar ve PM'ler bunu “cilalı modern UX”in işareti gibi görüyor, ama bu artık gerçekten iyi tasarım olmaktan çok, iyi tasarımı taklit eden moda bir süse dönüşmüş durumda
Gösterilen bazı animasyonlar gerçekten iyileştirilebilir görünüyor. Eskiden önceliği düşük olduğu için zaman ayırmak zordu; bu tür küçük keyifleri daha ileri taşımakta AI bana epey iyi bir araç gibi geliyor
Animasyondaki ara karelerin biraz “garip” görünmesi ama mantıksal olarak doğru olması başka şey, ara durumun gerçekten anlamsız olup sadece animasyon sırasında ne olduğuna hiç dikkat edilmemesinin sonucu olması başka şey. Eğer ikincisiyse, bence animasyonu kaldırmak ya da daha basit hale getirmek daha iyi olur
Yazının, UI cilasını yazılım kalitesinin vekil göstergesi olarak gören bakış açısı iyi ve kötü animasyonları işaret etmesi de doğru. Ama kare bazlı tutarlılık, animasyonun “iyi”liğini ölçmek için en iyi kıstas değil
Bazı cihazlarda hâlâ Sonoma var ve insan ancak sürekli geriye gittiğini söyleyebiliyor
Kaydetme iletişim kutusu biraz sallanıyor ama örnekteki kadar kafa karıştırıcı değil. Notes'taki düğme paneller arasında kusursuz biçimde akıcı hareket ediyor. Safari çubuğuna art arda odaklanıp odaktan çıkarınca animasyon bazen bozuluyor, ama imleç metinle tam zamanlı eşleşiyor ve ancak metin sola kaymayı bitirdikten sonra fade-in oluyor. Preview hatası da yeni bir sorun gibi görünüyor; bende yeniden üretilemiyor
https://streamable.com/kx7op6
Apple, Sony, IBM gibi şirketlerin çok küçük detaylara önem verdiği zamanları özlüyorum. Özellikle Apple bugünkü değerini iPhone'la kazandı; o dönemde Windows Mobile ya da Symbian PDA'lerle kıyaslandığında olağanüstü özellikler yaptığı için değil, hatta işlevsel olarak geri kaldığı yanlar da vardı, ama birkaç dakika kullanıp duvara fırlatmak istemeyeceğiniz tam dokunmatik bir cihaz olduğu için. Bugünkü bu animasyonlar bana tam olarak Windows Mobile ve Symbian hissini geri getiriyor
Steve'in OS X animasyonlarını ne kadar sevdiğini hatırlıyorum. Sahnede defalarca, ağır çekimde tekrar oynatırdı. Bugünküler, iPhone 4 anten işinden sorumlu kişinin yaşadığı akıbete bunları yapanların da uğramasını yadırgatmayacak seviyede
Bu tür kusurlu kareleri olmayan bir UI daha iyi hissettirirmiş gibi geliyor, ama artık birinin her klibi düzeltip gerçekte nasıl görüneceğini göstermesini istiyorum
Aynı zamanda neden her şeyde hareket gerektiğini de sorguluyorum. Bildiğim kadarıyla hareket, toast gibi kullanıcının eylemi başlattığı yerden farklı bir bölgede UI hafifçe değiştiğinde kullanılmalı
Buradaki geçişlerin önemli bir kısmı gereksiz görünüyor; anında değişip anlık yeniden yerleşim olsa bile yeterince iyi hissettirebilir
İmlecin solda görünmesinin sebebi, kullanıcının gerçekten o noktadan yazmaya başlayacak olması. UI'ı bilen biri büyük ihtimalle oraya bakar. İmleci ekranın ortasında gösterip sonra hareket ettirmek gereksiz ve dikkat dağıtıcı olur
Yer tutucu metnin sola kayması, alışık olmayan kullanıcıların dikkatini çekmek içindir
$BRANDtasarım dilinin alternatiflerinden üstün olduğu diye böbürlenme bahanesi veriyorÖrneklerin çoğu, animasyon olmasa muhtemelen daha iyi hissettirirdi. Düğmeye bastıysam sonucu gösterin. Dans ettirip sonra göstermek yerine doğrudan gösterin
Hareket olmazsa, yenilemeden sonra beynin çoğu zaman tüm sayfayı baştan taraması gerekir
Bu yazıdaki argümanın zayıf ortaya konduğunu düşünüyorum. Daha iyi bir alternatif de yok ve öne sürülen şeylerin kullanıcı için neden olumsuz olduğu da gerçekten açıklanmıyor. Olumsuz olabilirler ama medyadaki smear frame ya da geçiş anlarını işaret edip eleştiren boş bir yaklaşıma benziyor
“Her frame anlamlı olmalı” ölçütü de taşınması zor bir standart. Bunun imkânsız olduğunu düşünüyorum; pencere boyutu değiştirilirken bile her frame’i nasıl kusursuz tutacağını sormak isterim
Yazarın kendisi de söylediği standardı uygulamaktansa kusurlu frame’leri işaret etmenin daha kolay tarafında duruyor gibi görünüyor. Blogun üst bölümündeki bağlantılara tıklayınca animasyon tıklama bittikten sonra oynuyor. Kendi UI projelerine bakınca da metin ve nesnelerin konteyner içinde kalmadığı yerler var. Böyle ilkelerin izlenmesi gerektiğini söylüyorsa bunu kendisi de gösterebilmeli
Daha iyi yazılmış bir metin, öne sürülen şeylerin son kullanıcı için neden kötü olduğuna ve bunun yerine nasıl ele alınacağına odaklanırdı. İyi eleştiri sadece “ne”yi değil neden ve nasılı da içermeli
Yazı bir çözüm değil, bir fikir ortaya koyuyor. Bunu göremeyip çeşitli korkuluk safsataları kurarak eleştirmiş oluyorsun
Daha önemlisi, yazı buyurgan bir tonda yazılmamış. “I think”, “Next thought:”, “Probably”, “So yeah.” gibi ihtiyatlı ifadeler kullanılmış. Bu yazı, bir kişinin kendi düşüncelerini paylaşması; ayrıca epey olgunlaşmış düşünceler, çünkü birçok makul insanı benzer yönde düşündürebiliyor
Yazar çözüm sunmadı diye bunu mutlaka yapmak zorunda olması için bir sebep yok. Böyle bir ölçüt tuhaf ve mantıksız
Yazarın sitesine saldırmak da pek iyi görünmüyor. Zevk farkları iyi bilinen bir şey ve kavramsal katkının uygulamadaki teknik becerinin önüne geçmesi yüzünden birini cezalandırmak oldukça itici
Daha yerinde bir eleştiri, bu topluluğun ruhuna uygun biçimde daha cömert olurdu
Yazarın çözüm örnekleri de eklemesini isteyen birkaç tepki gördüm. Yakın zamanda bu yazıya çok benzeyen bir yazı yazdı; burada olduğu gibi animasyon sorunlarını ayrıntılı ele alıp bunları nasıl iyileştirdiğini de anlattı
Merak edenler burada görebilir: https://www.thisischris.dev/projects/project-6/
Sonradan gelecek kusursuz frame’dense şimdi gelen kusurlu frame’in daha iyi olduğunu düşünüyorum. Tüm UI’larda gecikme en yüksek öncelik olmalı. Gecikme yeterince düşük olunca insan kendi bedeninin bir parçasıymış gibi hissediyor ve bilişsel yük azalıyor. Animasyon burada özellikle kötü, çünkü yüzlerce milisaniyelik ek gecikme katıyor
Keşke olumsuz örneklerin yanında olumlu örnekler de olsaydı. Şu an vardığım sonuç sadece animasyondan kaçınmak gerektiği; ama yazarın gerçekten söylemek istediği şey bu değil gibi görünüyor
İyi animasyonun, her frame’de kusursuz görünmektense hareket sırasında biraz hile yapması az görülen bir şey değil. Çizgi filmlerdeki smear frame gibi: yanlış anda durdurulursa tuhaf görünür ama bütün animasyon içinde hareketi görsel olarak ikna edici kılar
Geliştirici değilim ama simgelerin ya da pencerelerin eskisi gibi, hatta olması gerektiği gibi yerleşmediği veya hareket etmediği alanlar hissediliyordu
Bu yamalı bohça hissi zaman geçse de değişmedi. OS ve uygulamalar genelinde “zaten hep böyleydi” demek isteyecek kadar çok örnek var ama gerçekte öyle değildi. Apple bir standart koymuştu, o standart yüksekti ve kalite çok iyiydi
SwiftUI ile aynı UI yerleşimini ya da animasyonu elde etmeye çalışmak, sanki çok sayıda hack gerektiriyormuş gibi geliyor
Son olarak sık sık şunu düşünüyorum: analog üretim gerçekten zordu ve hâlâ da zor. Dijitalde ise sonra dönüp düzeltiriz diye düşündük ama pratikte bunu yapmıyor, çoğu zaman kötünün üstüne daha kötüsünü yığıyoruz; bu da üzücü
[1]: https://youtu.be/vIdeGmN__Pw?t=550
Hiç animasyonu olmayan bir uygulama korkunç hissettirirdi. Android’iniz varsa bunu Geliştirici seçeneklerinde animasyon hızını 0x yaparak bizzat deneyebilirsiniz. Anlık değişim rahatsız edici oluyor ve beynin ne olduğunu işlemesi yine yaklaşık 1 saniye sürüyor; bu süreç, animasyon varken olduğundan bile daha yavaş olabilir
Benim ayarım 0.5x ve bence yeterli. Hâlâ hızlı ama uygulamanın açılıp kapandığını görebiliyorsunuz
0x’in sorunu, sanki UI’nin yalnızca %90’ına uygulanıyormuş gibi görünmesi. Bazı şeylerde hâlâ animasyon var ve sonuç olarak ritim çok tuhaf hissettiriyor
0.5x’te, animasyon hızı ayarından garip şekilde etkilenmeyen şeyler daha az göze batıyor
Düzgün çalışsa 0x kullanırdım
Gerekirse işlem için 1 saniye harcamayı tercih ederim, hatta buna gerçekten gerek olduğunu da sanmıyorum. Uygulama her sayfa değiştirdiğinde animasyon yüzünden 1 saniye yavaşlamasındansa bu çok daha iyi; gezinirken her şey pekmez içindeymiş gibi geliyor
Bu yazıyla empati kurdum ama keşke olumlu örnekler de olsaydı. Tonu şikâyet gibi gelmedi ama iyi bir UI kurgusu hakkında çok bilgisi olmayan biri olarak, neyi kutup yıldızı almam gerektiğine dair daha netleşmiş hissetmedim
Merak ediyorsanız burada görebilirsiniz: https://www.thisischris.dev/projects/project-6/
Lobste.rs görüşleri
Bu yazının temel varsayımının yanlış olduğunu düşünüyorum. Bu tür uygulamalar kare düzeyinde kullanılmaz
Sadece temel bir animasyon dersi alsanız bile, hareketi algılama biçimimizin durağan görüntülerden farklı olduğunu öğrenirsiniz. "squash and stretch" demolarına bakarsanız, kare kare incelendiğinde bir nesnenin boyutlarının tek tek bakınca saçma göründüğü ama hareket içinde gayet güzel çalıştığı örnekleri görebilirsiniz
Hatta kırpma örneğinde olduğu gibi programın durumunu yanlış bile gösterebilir. Kullanıcı, arayüz yeniden bir araya gelirken yaklaşık üçte bir saniye boyunca beynini kapatıp beklemek zorunda kalıyor; ancak ondan sonra programı kullanmaya devam edebiliyor
Wayland projesinin kastettiği frame perfectness'ın bununla hiç ilgisi olmadığını düşünüyorum
Daha çok pencere yeniden boyutlandırma gibi daha düşük seviyeli teknik ayrıntılardan söz ediyorlar. Örneğin içeriğin eşzamansız yeniden boyutlandırılması, dikey senkronizasyonun bozulup ekran yırtılması ya da garip diyagonal artefaktlar oluşması veya hasarlı bölge raporlamasının dikdörtgen alt bölgeler üzerinden yapılması gibi şeyler
Elbette hem düşük seviyeli ayrıntıların hem de üst seviyeli animasyonların kare düzeyinde kusursuz olması güzel olurdu
Diyelim ki bu tür animasyonları test etmek ve zaman içinde bu özelliklerin bozulmadığını doğrulayan testler yazmak istiyorsunuz
Günümüz web uygulamaları ve yerel uygulamalarda bu tür özellikleri test etmek için kullanılan güncel yöntemler neler? Olay döngüsünü kontrol edemediğiniz için yazmak istediğiniz belirli test kategorileri pratikte imkânsız ya da çok mu zor oluyor?
Ya da Paparazzi gibi araçlarla tüm geçişi Animated PNG olarak kaydedip otomatik regresyon testi yapabilirsiniz
Böylece iki noktayı ayrı ayrı doğrular, en sonunda da sadece nihai durumu kontrol edersiniz. Animasyonlar zamana sabit bağlı olmak yerine dışarıdan adım adım sürülebilmelidir
YouTube örneği, View Transitions için neredeyse tam yerinde bir kullanım örneği gibi görünüyor
“Bu öğe değiştiğinde otomatik olarak biçim değiştirsin” diye deklaratif biçimde tanımlıyorsunuz; sonuç olarak teknik açıdan etkileyici ama biraz peltemsi görünen geçişler ortaya çıkıyor, öğeler havada süzülüyor ve birbirine dönüşüyor
Çok havalı bir teknoloji ama gezinme sırasında küçük vurgu efektleri dışında gerçekten harika göründüğü örnekleri neredeyse hiç görmedim. Dikkat dağıtmaması için çok ölçülü kullanılmalı