Saya kesulitan menggambarkan masalah ini dengan kata-kata, itulah sebabnya saya membuat video (45 detik) untuk menggambarkannya. Ini adalah preview dari pertanyaan-pertanyaan tersebut, silakan lihat di Vimeo: http://vimeo.com/epologee/perfect-crossfade
Masalah membuat crossfade sempurna atau melarutkan dua gambar atau bentuk telah berulang kepada saya di sejumlah bidang selama dekade terakhir. Pertama dalam pengeditan video, kemudian dalam animasi Flash dan sekarang dalam pemrograman iOS. Ketika Anda mulai mencari di Google, ada banyak solusi yang dapat ditemukan, tetapi saya benar-benar ingin menyelesaikan ini tanpa peretasan saat ini.
Ringkasan:
Apa nama teknik atau kurva untuk diterapkan dalam crossfading dua bitmap semi-transparan, berwarna sama, jika Anda ingin transparansi yang dihasilkan sesuai dengan yang asli dari salah satu dari itu?
Apakah ada fungsi (matematis) untuk menghitung nilai transparansi / alpha parsial yang diperlukan selama fade?
Apakah ada bahasa pemrograman yang memiliki fungsi-fungsi ini sebagai preset, mirip dengan ease in
, ease out
atau ease in out
fungsi yang ditemukan di ActionScript atau Cocoa?
Pembaruan: Selain video, saya telah membuat proyek sampel (memerlukan Xcode dan iOS SDK) dan mempostingnya di github. Ini menunjukkan animasi yang sama dengan video tetapi kali ini dengan kotak: https://github.com/epologee/StackOverflow-Example-Code
Jawaban:
Saya khawatir itu tidak mungkin. Ini adalah bagaimana transparansi dihitung ketika dua objek overlay: http://en.wikipedia.org/wiki/Alpha_compositing
Salah satu objek harus memiliki opacity 1 jika Anda tidak ingin area overlay dilihat.
sumber
Saya tidak tahu nama apa yang mungkin ada dalam dunia pengeditan video, tapi saya akan menyebut kurva itu kurva S-kurva atau kurva sigmoid . Seharusnya sangat sederhana untuk menghasilkan cross-fade yang Anda cari di iOS menggunakan Core Animation's kCAMediaTimingFunctionEaseInEaseOut fungsi waktu. Hanya menghidupkan
alpha
properti dari dua tampilan dalam arah yang berlawanan (satu 0-> 1, satu 1-> 0) menggunakan fungsi pengaturan waktu:Catatan: Anda harus benar-benar menggunakan metode animasi berbasis blok alih-alih metode kenyamanan UIView. Saya menggunakan metode UIView di atas karena sangat mudah dimengerti, dan mudah diketik dari memori. Namun, menggunakan blok tidak jauh lebih sulit.
Tambahan: Jika Anda tidak menyukai UIViewAnimationEaseInOut, Anda dapat membuat fungsi pengaturan waktu Anda sendiri seperti yang dijelaskan dalam Pengaturan Waktu, Ruang Waktu, dan CAAnimation . Itu sedikit lebih maju daripada animasi sederhana yang digambarkan di atas, tetapi memberi Anda semua kontrol yang Anda inginkan.
sumber
kCAMediaTimingFunctionEaseInEaseOut
. Bisakah Anda berartiUIViewAnimationCurveEaseInOut
? Masalah dengan kurva itu adalah sama (turun di tengah), karena pada suatu titik waktu, dua nilai alpha dalam penambahan sederhana akan sama1.0
, di mana seperti pada kurva tweak manual saya perlu melebihi1.0
untuk mendapatkan hasil yang diinginkan .initialTransparency
nilainya, tidak ada gunanya. Anda tidak akan memiliki petunjuk apa yang harus dicoba selanjutnya?Dalam grafik komputer, fungsi semacam ini disebut smoothstep . Ketika digunakan untuk crossfade, itu menentukan nilai alpha global untuk komposisi.
Jika gambar input memiliki saluran alfa, Anda harus terlebih dahulu memastikan bahwa alfa adalah pra - ditanamkan . Kemudian, Anda dapat melakukan komposisi crossfade secara langsung, menggunakan smoothstep
alpha
pada setiap saluran [X = A*alpha + B*(1-alpha)
], dan mengharapkan hasil yang masuk akal.sumber
Anda dapat menggunakan fungsi peluruhan eksponensial:
Grafik Anda lebih mirip:
sumber
1 - Alpha1(time)
persamaan tidak akan menangani penurunan, karena dua gambar 0,5 alpha campuran tidak akan menghasilkan gambar yang dikomposisi dengan 1,0 alpha. Kurva khusus yang saya gambar tidak dicerminkan secara vertikal.