Suar | Visualisasi Data untuk Web

Flare memudahkan untuk membuat visualisasi data interaktif

Untuk mula membuat visualisasi anda sendiri, muat turun suar dan ikuti tutorial di bawah. Perlukan lebih banyak pertolongan? Lawati forum bantuan (anda akan memerlukan SourceForge log masuk ke siaran).

Flare adalah perisian sumber terbuka yang dikeluarkan di bawah lesen BSD, yang bermaksud ia boleh digunakan dan diubah secara bebas (dan bahkan dijual dengan harga $$). Reka bentuk Flare diadaptasi dari pendahulunya, kit alat visualisasi untuk Java.

Permohonan

  • 2010.03.12: Berita BBC menggunakan Flare untuk memetakan 100 laman web teratas di Internet.
  • 2010.01.29: Flare digunakan untuk menolong Selamat Pagi Amerika ABC News menunjukkan bahawa George Stephanopoulos mungkin berkaitan dengan Hillary Clinton (pergi ke 4:48 dalam video).
  • 2009.09.25: Majalah slate menggunakan Flare untuk pelbagai grafik data interaktif.
  • 2009.02.20: Wired Italia menggunakan Flare untuk antara muka visual mereka ke kandungan multimedia.
  • 2009.02.10: MemeTracker merangkak 1.6 juta laman media dan blog arus perdana, menganalisis perkara yang dibincangkan orang, dan menggambarkan hasilnya menggunakan Flare.
  • 2009.01.28: Memvisualisasikan aliran maklumat dalam sains menggabungkan metrik eigenfactor dengan Flare untuk memvisualisasikan rangkaian petikan penerbitan ilmiah.
  • 2008.10.27: The Sumbangan Politik GoodGuide aplikasi menggunakan suar untuk menggambarkan jumlah dan jenis sumbangan yang dibuat oleh syarikat kepada parti politik Amerika.
  • 2008.07.16: The Penjelajah Pekerjaan Minnesota (dibina dengan Flare) membolehkan orang meneroka trend pekerjaan dan berkongsi pandangan mereka. Ini adalah sebahagian karya Minnesota Public Radio mengenai perlambatan ekonomi A.S..
  • 2008.04.02: The Makmal Komunikasi Visual IBM menggunakan Flare untuk membina visualisasi untuk Many-Eyes. Lihat Cloud Tag Perbandingan mereka, dibuat dengan Flare.

Pengumuman

  • 2010.10.07: Pembangunan suar telah dibuka kepada masyarakat dan sumbernya telah berpindah dari SourceForge ke kediaman baru di GitHub. suar 2009.01.24 masih merupakan keluaran rasmi terakhir dan (sekurang-kurangnya buat masa ini) tutorial dan dokumentasi mencerminkannya. Versi pembangunan di GitHub kini mengandungi sokongan yang lebih baik untuk Flash Player 10 serta banyak perbaikan dan perubahan kecil yang lain.
  • 2009.01.24: suar 2009.01.24 telah dikeluarkan. Ini adalah keluaran penyelenggaraan dengan sejumlah pembaikan bug dan kemas kini. Lihat nota pelepasan untuk keterangan lebih lanjut. Ini adalah rencana terakhir yang dirilis untuk Flash Player 9 – versi masa depan akan berpindah ke versi 10.
  • 2008.07.30: suar 2008.07.29 telah dikeluarkan. Ini adalah siaran utama yang memperkenalkan banyak ciri baru dan penambahbaikan seni bina. Lihat nota pelepasan untuk keterangan lebih lanjut.
  • 2008.07.30: suar 2008.08.08 telah dikeluarkan. Siaran ini merangkumi sokongan legenda yang ditingkatkan, peralihan bernama, perbaikan bug, dan refactoring untuk mengurangkan gandingan dan menggabungkan kelas utiliti. Lihat nota pelepasan untuk keterangan lebih lanjut.

Tutorial

#Crypto ExchangeBenefits

1

Binance
Best exchange


VISIT SITE
  • ? The worlds biggest bitcoin exchange and altcoin crypto exchange in the world by volume.
  • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

2

Coinbase
Ideal for newbies


Visit SITE
  • Coinbase is the largest U.S.-based cryptocurrency exchange, trading more than 30 cryptocurrencies.
  • Very high liquidity
  • Extremely simple user interface

3

eToro
Crypto + Trading

VISIT SITE
  • Multi-Asset Platform. Stocks, crypto, indices
  • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

Tutorial langkah demi langkah untuk mempelajari ActionScript dan Flare.

Bermula

Langkah pertama adalah menyiapkan alat pengembangan anda.

  1. Sediakan persekitaran pengembangan kilat yang berfungsi. Terdapat dua pendekatan. Kami mengesyorkan yang pertama untuk kesederhanaan, tetapi pengguna yang lebih maju dialu-alukan untuk menggunakan pendekatan kedua.

    • Pilihan 1 (lebih mudah): Pasang Adobe Flex Builder.

      #CRYPTO BROKERSBenefits

      1

      eToro
      Best Crypto Broker

      VISIT SITE
      • Multi-Asset Platform. Stocks, crypto, indices
      • eToro is the world’s leading social trading platform, with thousands of options for traders and investors.

      2

      Binance
      Cryptocurrency Trading


      VISIT SITE
      • ? Your new Favorite App for Cryptocurrency Trading. Buy, sell and trade cryptocurrency on the go
      • Binance provides a crypto wallet for its traders, where they can store their electronic funds.

      #BITCOIN CASINOBenefits

      1

      Bitstarz
      Best Crypto Casino

      VISIT SITE
      • 2 BTC + 180 free spins First deposit bonus is 152% up to 2 BTC
      • Accepts both fiat currencies and cryptocurrencies

      2

      Bitcoincasino.io
      Fast money transfers


      VISIT SITE
      • Six supported cryptocurrencies.
      • 100% up to 0.1 BTC for the first
      • 50% up to 0.1 BTC for the second

      • Ini adalah lingkungan pengembangan penuh untuk aplikasi ActionScript / Flex. Ia tersedia untuk semua platform utama (Windows, Mac, Unix). Pengguna yang sudah menggunakan Eclipse IDE juga boleh memasang Flex Builder sebagai pemalam Eclipse.
      • Perhatian untuk menggunakan Flex Builder adalah perisian komersial dan hanya akan berfungsi untuk tempoh percubaan terhad. Walau bagaimanapun, Adobe memberikan lesen Flex Builder percuma kepada pelajar universiti, fakulti dan kakitangan.
      • Pilihan 2 (lebih rumit): Pasang Flex SDK percuma

        • Ini akan memasang pengkompil ActionScript / Flex asas: mxmlc dan compc. Anda kemudian boleh mengatur persekitaran binaan anda sendiri, misalnya, menggunakan sistem pembuatan atau semut. Flare dibungkus dengan fail build.xml untuk digunakan dengan Semut Apache membina sistem. Setelah semut dipasang, buka fail build.xml dalam penyunting teks, ubah baris pertama untuk menunjuk ke pemasangan Flex SDK anda, dan kemudian gunakan semut untuk menyusun perpustakaan. Kami memanfaatkan tugas semut Adobe Labs untuk pengembangan Flex.
        • Kelebihan pendekatan ini adalah bahawa semua perisian percuma, dan tidak akan luput untuk anda. Walau bagaimanapun, anda kehilangan ciri seperti penyusunan automatik, pengurusan projek, dan pelengkapan automatik yang disediakan oleh Flex Builder.
        • Muat turun perpustakaan suar prefuse.

          • Muat turun adalah fail zip yang mengandungi sekumpulan projek perpustakaan ActionScript. Buka zip fail ke dalam direktori ruang kerja utama anda jika anda menggunakan Flex Builder. Semasa tutorial kami akan mengimportnya ke Flex Builder dan menggunakannya untuk membina visualisasi!
          • Perisian ini pada masa ini adalah versi alfa, dan diharapkan terdapat beberapa bug dan batasan. Kami akan menyelesaikan masalah secepat yang mungkin, dan pautan di atas akan selalu menunjukkan versi terbaru.

          Pengenalan Flash dan ActionScript 3

          Flash adalah persekitaran yang bagus untuk grafik interaktif dan dengan penambahan bahasa pengaturcaraan ActionScript 3 baru-baru ini, ia menjadi lebih hebat dan cekap. Walaupun pengenalan lengkap untuk AS3 berada di luar ruang lingkup tutorial ini, berikut adalah beberapa sumber yang akan berguna bagi anda:

          • Adobe memberikan Gambaran Keseluruhan AS3, dengan pautan ke sumber tambahan.
          • ActionScript 3 yang penting oleh Colin Moock dari penerbitan O’Reilly adalah buku yang bagus untuk membantu anda memulakannya. Anda boleh mengaksesnya secara dalam talian di sini (beberapa institusi, seperti universiti, menyediakan akses secara percuma).
          • Rujukan API Adobe Flex sangat berharga untuk memahami pelbagai kelas dan kaedah yang ada. Kami hanya akan menumpukan perhatian pada kelas dalam pakej. *.

          Tutorial ini menggunakan keakraban asas dengan sintaks dan jenis ActionScript, serta konsep pengaturcaraan berorientasikan objek.

          Bahagian 1: Paparan Objektif

          Pengenalan

          Flash memodelkan pemandangan visual 2D menggunakan a gambar latar. Objek visual disusun dalam hierarki, dengan objek anak didefinisikan di ruang koordinat ibu bapa. Anda akan sering melihat pemandangan ini disebut sebagai senarai paparan dalam dokumentasi Adobe dan dalam buku mengenai pengaturcaraan Flash.

          Nod di bahagian atas senarai paparan selalu menjadi objek Panggung. Pentas selalu mempunyai satu dan satu anak. Ini dipanggil root, dan semua item visual berada di bawah root. Biasanya, akarnya adalah aplikasi Flash sebenar anda. Kami akan kembali kepada perkara ini tidak lama lagi.

          Semua item visual yang dapat ditambahkan ke senarai paparan adalah contoh kelas DisplayObject. Subkelas DisplayObject merangkumi Bitmap (untuk gambar), TextField (untuk kawasan teks interaktif), dan Video (fikir YouTube). Contoh yang paling biasa adalah kelas Sprite dan Shape. Sebagai rujukan, kebanyakan kelas ini terdapat di pakej flash.display (walaupun akhirnya anda mungkin akan menemui pakej penggunaan flash.text).

          Kelas Sprite adalah objek visual umum yang paling berguna yang digunakan oleh Flash Player. Sprite adalah objek visual yang mengandungi kedua-dua kandungan gambar dan dapat berfungsi sebagai wadah untuk sub-node dalam senarai paparan (kelas Sprite mengelas kelas flash.display.DisplayObjectContainer). Sebaliknya, kelas Shape boleh mengandungi kandungan gambar, tetapi tidak dapat menahan sub-nod. Hasilnya, Shapes menggunakan memori yang lebih sedikit, tetapi jauh lebih fleksibel. Untuk kesederhanaan, kami akan memberi tumpuan kepada Sprite dalam tutorial ini.

          Buat Aplikasi Baru

          Pertama, mari buat aplikasi Flash baru. Untuk melakukan ini, buka Flex Builder dan pastikan anda berada dalam perspektif “Flex Development” (sering dicapai dengan mengklik ikon “Fx” hitam dan putih di kanan atas).

          Di panel “Navigator” di sebelah kiri, klik kanan paparan dan pilih “Baru > Projek ActionScript ”. Dalam dialog yang dihasilkan, ketik “Tutorial” sebagai nama projek, kemudian klik “Selesai”. Ini akan mewujudkan projek baru untuk anda.

          Anda sekarang akan melihat folder “Tutorial” di panel “Navigator”. Di dalam folder ini, anda akan melihat fail bernama “Tutorial.as”. Ini adalah fail aplikasi utama anda. Buka, jika belum dibuka.

          Di dalam fail, anda akan melihat perancah asas untuk kelas ini:

          pakej {

          import flash.display.Sprite;

          Tutorial kelas awam memperluas Sprite

          {

          Tutorial fungsi awam ()

          {

          }

          }

          }

          Perhatikan bahawa kelas ini memanjangkan kelas Sprite. Kerana ini adalah kelas aplikasi utama kami, ketika kami menjalankan aplikasi, contoh kelas Tutorial secara automatik akan ditambahkan ke daftar paparan sebagai akarnya (satu-satunya anak Tahap).

          Perhatikan juga bahawa konstruktor telah dibuat secara automatik. Pembina ini akan dipanggil semasa aplikasi dilancarkan. Bagi mereka yang biasa dengan bahasa pengaturcaraan seperti C, C ++, atau Java, pembangun untuk kelas aplikasi berfungsi seperti fungsi utama dalam bahasa lain.

          Dengan perancah aplikasi baru ini, kita dapat mula bermain dengan objek visual. Namun, ada satu perkara yang ingin kita lakukan terlebih dahulu. Tambahkan baris baru tepat di atas baris deklarasi kelas (“Tutorial kelas awam …”) yang mengatakan:

          [SWF (lebar ="800", tinggi ="600", latar Warna ="#ffffff", frameRate ="30")]

          Baris ini menentukan tetapan lalai untuk aplikasi anda (yang dikompilasi dan disimpan sebagai fail .swf dalam direktori “bin” projek anda). Di atas, kami menetapkan ukuran, warna latar, dan laju bingkai sasaran (dalam bingkai sesaat) untuk aplikasi kami.

          Sprite

          Seperti semua DisplayObjects, Sprite menyokong sebilangan sifat visual langsung dari kotak. Ini merangkumi sifat x, y, skalaX, skalaY, putaran, dan alpha. Ini masing-masing mengubah kedudukan, ukuran, orientasi, dan ketelusan sprite (dan semua anak-anaknya! Ingat, kami menggunakan gambar latar di sini).

          Walau bagaimanapun, nilai-nilai ini belum banyak bermakna, kerana sprite tidak mengandungi apa-apa secara lalai. Kita akan mulakan dengan melukis kandungan kita sendiri.

          Setiap Sprite juga mempunyai harta grafik. Kita boleh menggunakan ini untuk melukis grafik untuk Sprite. Properti grafik adalah contoh kelas flash.display.Graphics, yang menyediakan sejumlah perintah melukis vektor.

          Dalam contoh di bawah, kami melakukan beberapa perkara.

          • Pertama, kami membuat Sprite baru.
          • Kedua, kami menggunakan grafik sprite untuk melukis bulatan dengan warna kelabu dan garis hitam.
          • beginFill menetapkan warna dan gaya pengisian semasa. Argumen pertama adalah warna, dalam notasi hex, dan argumen kedua adalah nilai alpha, yang berkisar antara 0 untuk sepenuhnya telus hingga 1 untuk sepenuhnya legap.
          • lineStyle menetapkan warna dan gaya coretan semasa. Argumen pertama adalah lebar garis, argumen kedua adalah warna.
          • drawCircle melukis bulatan jejari 10 pada titik 0,0 di ruang koordinat sprite kita.
        • Ketiga, kami menambah sprite sebagai anak aplikasi utama kami (Tutorial sprite).
        • Keempat, kami menetapkan kedudukan x dan y sprite kami.
        • Kelima, kami menambah beberapa output debugging. trace mencetak rentetan ke konsol. Output ini hanya muncul ketika menjalankan aplikasi dalam mod “debug”.
        • Inilah kodnya:

          pakej {

          import flash.display.Sprite;

          [SWF (lebar ="800", tinggi ="600", latar Warna ="#ffffff", frameRate ="30")]

          Tutorial kelas awam meluaskan Sprite

          {

          Tutorial fungsi awam ()

          {

          var sprite: Sprite = baru Sprite ();

          sprite.graphics.beginFill (0xcccccc, 0.5);

          sprite.graphics.lineStyle (1, 0x000000);

          sprite.graphics.drawCircle (0, 0, 10);

          ini.addChild (sprite);

          sprite.x = 50;

          sprite.y = 50;

          jejak ("sprite kami berada di: "+sprite.x+", "+sprite.y);

          }

          }

          }

          Jalankan aplikasi (klik kanan “Tutorial.as” dan pilih “Run As > Aplikasi Flex ”). Anda harus melihat bulatan kelabu dengan garis hitam di sudut kiri atas, berpusat pada titik 50, 50. Sekiranya anda menjalankan aplikasi dalam mod debug (pilih “Debug As > Aplikasi Flex “), anda juga harus melihat rentetan” sprite kami berada pada: 50, 50 “di konsol output.

          Sprite Bersarang

          Sekarang mari kita menjadikan pemandangan kita sedikit lebih menarik. Mari mulakan dengan memindahkan kod generasi Sprite kami ke kaedah baru. Kami akan menambahkan kaedah ini ke kelas kami:

          fungsi peribadi createCircle (x: Number, y: Number): Sprite

          {

          var sprite: Sprite = baru Sprite ();

          sprite.graphics.beginFill (0xcccccc, 0.5);

          sprite.graphics.lineStyle (1, 0x000000);

          sprite.graphics.drawCircle (0, 0, 10);

          sprite.x = x;

          sprite.y = y;

          kembali sprite;

          }

          Seterusnya, kami mengganti kod di konstruktor kami. Pertama, kami membuat sprite baru yang disebut wadah yang akan kami gunakan untuk menahan kumpulan bulatan. Kami meletakkannya di tengah pentas kami. Kedua, kita menggunakan gelung untuk membuat sekumpulan bulatan. Di sini, kami membariskan bulatan secara simetri di sekitar titik 0,0 bekas induk. Pembina baru kami kini kelihatan seperti ini:

          Tutorial fungsi awam ()

          {

          bekas var: Sprite = baru Sprite ();

          bekas.x = 400;

          bekas.y = 300;

          ini.addChild (bekas);

          untuk (var i: int = 0; i<10; ++ i) {

          var x: Nombor = (i / 5<1? 1: -1) * (13 + 26 * (i% 5));

          container.addChild (createCircle (x, 0));

          }

          }

          Jalankan aplikasi versi baru. Anda akan melihat garis sepuluh bulatan di tengah-tengah aplikasi.

          Kita sekarang dapat mengubahsuai wadah untuk mengemas kini semua lingkaran di dalamnya. Cuba bermain dengan menetapkan pemboleh ubah visual yang berbeza pada sprite kontena. Contohnya, ubah sifat x, y, scaleX, scaleY, rotation, dan alpha.

          Topik Lain

          Terdapat banyak lagi yang boleh anda lakukan dengan pilihan asas yang disediakan oleh Flash. Malangnya, mereka sedikit melebihi apa yang kita ada di sini. Beberapa perkara yang boleh diterokai termasuk penapis gambar (lihat pakej filter.filters), yang membolehkan anda menambahkan kesan visual untuk memaparkan objek menggunakan harta penapis mereka, dan pelbagai pilihan yang tersedia di flash.display. Kelas grafik, termasuk gaya pengisian dan garis , dan banyak lagi rutin menggambar 2D.

          Bahagian 2: Animasi

          Sekarang kita dapat membuat objek visual, inilah masanya untuk mula memberi mereka kehidupan. Flare merangkumi pakej flare.animate untuk membantu menjadikannya mudah. Pertama, kita perlu mengimport perpustakaan suar untuk digunakan di Flex Builder.

          Mengimport Perpustakaan

          Sebelum meneruskan, pastikan anda memuatkan perpustakaan suar sebagai projek dalam Flex Builder. Anda semestinya telah membuka zip fail suar ke direktori ruang kerja Flex Builder utama anda. Langkah seterusnya adalah mengimportnya ke persekitaran Flex Builder:

          • Pastikan anda berada dalam perspektif “Flex Development”.
          • Klik kanan panel navigator di sebelah kiri.
          • Pilih “Import …” di menu pop timbul.
          • Dalam dialog, pilih “Umum > Projek Sedia Ada ke Ruang Kerja “dan klik butang” Seterusnya “.
          • Gunakan widget “Pilih direktori root” untuk menavigasi ke direktori ruang kerja Flex Builder anda
          • Anda sekarang harus melihat projek suar yang disenaraikan dalam panel “Projek:”.
          • Pilih projek “flare” dan “flare.demos” dan kemudian klik butang “Selesai”.

          Anda sekarang harus melihat projek suar di panel Navigator. Anda kini boleh melihat kod sumber untuk setiap perpustakaan dan demo.

          Gambaran keseluruhan perpustakaan suar

          Berikut adalah gambaran keseluruhan ringkas mengenai alat alat suar. Di dalam projek suar, lihat di dalam folder “src / flare”. Anda akan menemui sebilangan pakej yang menyediakan pelbagai ciri:

          • analitik: pengendali untuk statistik pengkomputeran dan menganalisis data
          • bernyawa: alat untuk membuat animasi
          • data: kaedah untuk membaca dan menulis set data
          • display: Jenis DisplayObject yang memperluas yang disediakan oleh flash.display
          • flex: pembungkus untuk menyisipkan visualisasi Flare dalam aplikasi Flex
          • fizik: enjin fizik untuk kesan fizikal atau susun atur daya
          • query: pemproses pertanyaan untuk objek ActionScript
          • skala: kelas untuk menangani skala data, seperti skala linear, log, dan waktu
          • util: satu set kelas utiliti yang menyediakan fungsi yang biasanya diperlukan
          • vis: komponen dan pengendali visualisasi suar

          Terdapat juga projek flare.demos, yang memberikan sejumlah contoh bagaimana membuat komponen Flare.

          Mengimport perpustakaan dalam projek lain

          Untuk menggunakan suar dalam projek anda sendiri, anda perlu mengemas kini tetapan projek anda. Begini caranya:

          1. Di panel Navigator, klik kanan folder atas projek “Tutorial”
          2. Klik “Properties” dalam menu konteks
          3. Dalam dialog yang dihasilkan, klik “ActionScript Build Path” di panel kiri (semestinya item ke-3 dari atas)
          4. Klik tab “Jalur perpustakaan” di panel kanan
          5. Klik butang “Tambah Projek”
          6. Anda sekarang mesti melihat senarai projek, termasuk suar.
          7. Pilih “suar” dan kemudian klik “OK”

          Anda kini telah menambahkan perpustakaan suar ke projek anda dan boleh menggunakan mana-mana kelas yang disediakannya.

          Satu perkara yang perlu diperhatikan mengenai penyusun Flex – secara lalai, ia hanya merangkumi kelas yang sebenarnya anda gunakan dalam aplikasi anda. Oleh itu, walaupun anda mengimport perpustakaan yang sangat besar, ukuran fail .swf akhir anda masih boleh sangat kecil. Namun, berhati-hatilah bahawa ini boleh menyebabkan masalah jika anda menggunakan refleksi untuk melakukan pemuatan kelas dinamik dalam aplikasi anda (ciri yang lebih maju yang tidak diliputi dalam tutorial ini).

          Animasi Asas: Tween, Urutan, dan Selari

          Ok, sekarang mari kita bernyawa! Kelas flare.animate.Transition adalah kelas asas untuk semua animasi. Subkelas Transisi penting adalah peralihan Tween, Urutan, dan Selari. Tweens digunakan untuk menghidupkan sifat satu objek. Urutan digunakan untuk menjalankan rangkaian animasi mengikut urutan. Peralihan selari menjalankan sekumpulan peralihan secara serentak. Mari kita mulakan dengan Tween.

          Sifat Objek Tweening

          Dasar-dasar kelas Tween mudah: kami mengambil objek, memberikan satu set nilai harta yang kami ingin ubah dari masa ke masa, dan menentukan jangka masa untuk perubahan itu. Dengan menggunakan aplikasi Tutorial dari Bahagian 1, mari kita memutar objek bekas. Tambahkan baris berikut ke hujung pembina kelas Tutorial:

          var tween: Tween = Tween baru (bekas, 3, {putaran: 360});

          tween.play ();

          Juga, pastikan bahawa anda mempunyai pernyataan import baru di bahagian atas kelas anda, supaya penyusun tahu apa yang anda bicarakan. Tambahkan ini ke senarai import:

          import suar.animate.Tween;

          (CATATAN: kadang-kadang Flex Builder secara automatik akan menambahkan pernyataan import untuk anda semasa anda menaip nama kelas baru. Jika tidak, teknik lain adalah meletakkan kursor teks di akhir nama kelas baru dan ketik “Ctrl-Space” – ini harus membuat import baru untuk kelas anda.)

          Sekarang jalankan aplikasi anda – titik harus berputar dalam bulatan dalam jangka masa 3 saat.

          Inilah yang sedang dilakukan oleh konstruktor Tween:

          • Argumen pertama adalah objek yang nilainya harus di-tweet
          • Argumen kedua ialah panjang animasi, dalam beberapa saat
          • Argumen ketiga adalah contoh Objek yang menyenaraikan sifat untuk dianimasikan dan nilai sasarannya.
          • Nama-nama harta tanah mesti betul-betul sesuai dengan sifat objek input.
          • Properti bersarang dibenarkan, tetapi mesti disertakan dalam tanda petik. Sebagai contoh, {“data.profit”: 50} adalah input sah jika objek input mempunyai properti bernama data yang pada gilirannya memiliki harta bernama keuntungan.

          Kaedah bermain kemudian menjalankan animasi. Kaedah bermain juga boleh dipanggil dengan satu parameter Boolean yang menunjukkan sama ada menjalankan animasi secara terbalik atau tidak.

          Anda mungkin menyedari bahawa animasi putaran menunjukkan beberapa pecutan. Ini kerana tetapan lalai untuk kejadian Tween adalah menggunakan animasi “slow-in slow-out”. Anda boleh mengawal tingkah laku ini menggunakan fungsi Kemudahan. Fungsi-fungsi ini mengambil input kemajuan animasi semasa sebagai pecahan antara 0 dan 1. Mereka kemudian mengembalikan pecahan kemajuan yang dimanipulasi untuk mengubah rentak animasi, sering dengan cara yang tidak linear.

          Untuk menghilangkan pelonggaran (iaitu, gunakan fungsi pelonggaran linear) anda boleh menulis: tween.easing = Easing.none. Pastikan anda mengimport kelas flare.animate.Easing di bahagian atas fail.

          Jangan ragu untuk bereksperimen dengan fungsi pelonggaran yang lain. Sebagai contoh, fungsi pelonggaran mungkin melibatkan pelonggaran (memanipulasi permulaan animasi sahaja), pelonggaran (memanipulasi akhir animasi sahaja), atau keduanya. Contohnya, cuba ini: tween.easing = Easing.easeOutBounce. Ini akan menjadikan putaran melantun di hujungnya.

          Sebelum meneruskan, cuba animasikan sifat-sifat lain dari bekas, seperti kedudukan, skala atau nilai alpha.

          Animasi Komposit

          Kelas Urutan dan Selari membolehkan anda mengumpulkan animasi bersama. Urutan menjalankan satu set animasi satu demi satu. Contohnya, cuba ini:

          var t1: Tween = Tween baru (bekas, 1, {y: 100});

          var t2: Tween = Tween baru (bekas, 1, {skalaX: 2});

          var t3: Tween = Tween baru (bekas, 1, {y: 300});

          var t4: Tween = Tween baru (bekas, 1, {skalaX: 1});

          var seq: Urutan = Urutan baru (

          Selari baru (t1, t2),

          Selari baru (t3, t4)

          );

          seq.play ();

          Anda juga perlu menambahkan beberapa penyataan import baru di bahagian atas fail:

          import flare.animate.Parallel;

          import suar.animate.Sequence;

          Ini menghasilkan empat tweens: t1, t2, t3, dan t4. Ia kemudian mewujudkan dua peralihan selari yang menjalankan t1 dan t2 bersama-sama dan menjalankan t3 dan t4 bersama-sama. Peralihan selari kemudian dijalankan satu demi satu mengikut urutan. Dengan cara ini, mudah untuk membuat animasi yang lebih rumit.

          Untuk animasi komposit yang lebih maju, lihat FlareLogo dan flare.demos. Kelas animasi dalam projek flare.demos.

          Batch Animation dengan Transitioners

          Dengan menggunakan kelas Tween, Parallel, dan Sequence, anda boleh membuat sebilangan peralihan animasi. Walau bagaimanapun, ketika berhadapan dengan koleksi objek yang besar (biasa dalam visualisasi), adalah menyakitkan untuk menangani sekumpulan tweens yang sama besarnya secara manual. Selain itu, mudah untuk menjalankan rutin yang terpisah untuk mengekod sifat visual seperti susun atur, warna, ukuran, bentuk dan tidak perlu risau untuk mengendalikan animasi. Mungkin anda mahu menghidupkan perubahan atau mungkin anda mahukan kemas kini statik. Walau apa pun, anda seharusnya dapat menggunakan semula kod yang sama untuk menetapkan nilai.

          Untuk mengatasi masalah ini, Flare menyediakan kelas Transitioner. Peralihan mempermudah proses membuat animasi untuk koleksi objek. Anda hanya mengambil objek dan menetapkan sifat yang diingini satu demi satu. Di sebalik tabir, peralihan secara automatik akan menghasilkan dan menggunakan kembali tweens yang diperlukan untuk memodelkan animasi penuh. Selanjutnya, jika animasi tidak diinginkan, peralihan dapat dikonfigurasi untuk menetapkan nilai properti dengan segera. Ringkasnya, peralihan menyediakan lapisan tidak langsung untuk mengemas kini sifat objek – kemas kini ini dapat dikumpulkan dan kemudian dianimasikan, atau digunakan dengan segera.

          Berikut adalah contoh mudah menggunakan peralihan dalam aplikasi tutorial kami.

          var t: Transitioner = peralihan baru (2);

          untuk (var j: int = 0; j

          Contoh ini menghidupkan semua sprite dalam bekas ke kedudukan y rawak baru dan faktor skala menegak rawak. Kami mula-mula membuat Transitioner baru yang harus membuat animasi 2 saat. Kami kemudian melengkapkan setiap sprite anak dan menggunakan peralihan untuk menetapkan sifat ke Tween.

          Operator Transitioner $ menunjukkan bahawa kami ingin menetapkan nilai sasaran untuk objek input. Secara lalai, sama ada Tween baru dibuat, atau Tween yang ada dijumpai untuk item semasa. Operator $ kemudian mengembalikan objek untuk menetapkan harta sasaran tween.

          Tambahan pula, peralihan boleh digunakan untuk membuat peralihan statik (bukan animasi). Sekiranya harta segera peralihan ditetapkan menjadi benar, ia tidak akan menghasilkan Tweens baru. Sebaliknya, operator $ hanya akan mengembalikan nilai input. Ini bermaksud anda boleh membuat kaedah yang mengemas kini nilai menggunakan peralihan, dan kemudian mengawal sama ada mahu nilai tersebut dikemas kini atau tidak. Transitioner “segera-mod” standard diambil menggunakan harta Transitioner.DEFAULT statik. Dengan cara itu anda tidak perlu memperuntukkan Transitioner baru semasa melakukan kemas kini segera.

          Peralihan digunakan secara meluas di seluruh paket flare.vis, yang membolehkan pereka visualisasi untuk mengawal kemas kini yang harus dianimasikan dan bagaimana.

          Bahagian 3: Visualisasi

          Memuatkan Data

          Perwakilan data asas untuk Flare hanya menggunakan jenis data Flash terbina dalam: Objek dan Array. Sebagai contoh, tabel data hanya dapat direpresentasikan sebagai susunan objek, yang masing-masing objek berisi nama dan nilai setiap bidang data. Walaupun perwakilan yang lebih cekap dapat dilakukan, pendekatan ini memberikan kelonggaran paling banyak dan juga memanfaatkan konvensyen pengembangan Flash yang ada.

          Untuk memuatkan data ke dalam pemutar Flash, terdapat sejumlah pendekatan. Pendekatan mudah adalah memasukkan data anda ke dalam aplikasi itu sendiri. Dengan begitu, data akan dimuat turun bersama dengan aplikasi, yang baik untuk set data statik. Sebagai contoh, anda boleh menggunakan notasi objek ActionScript untuk menentukan set data secara langsung sebagai pemboleh ubah:

          data var: Array = [

          {ID:"S1", jualan: 10000, keuntungan: 2400},

          {ID:"S2", jualan: 12000, keuntungan: 2900},

          {ID:"S3", jualan: 15000, keuntungan: 3800},

          {ID:"S4", jualan: 15500, keuntungan: 3900}

          ];

          Namun, dalam banyak kes, anda ingin memuat data anda secara dinamis, baik dari dalam laman web (anda boleh menggunakan JavaScript di penyemak imbas untuk menyampaikan nilai ke Flash), atau dari pelayan di internet. Terdapat banyak pendekatan untuk melakukan ini dan anda harus memilih yang terbaik untuk aplikasi tertentu anda. Sebagai contoh, ActionScript menyediakan jenis data tambahan dan sintaks untuk bekerja dengan data XML menggunakan standard ECMAScript untuk XML (E4X).

          Flare juga menyediakan beberapa utiliti untuk memuatkan set data luaran. Ia menyokong memuatkan data dari mana-mana pelayan di internet dan menukar data tersebut menjadi objek ActionScript dalaman. Format fail yang kini disokong adalah teks yang dibatasi tab (“tab”, format fail standard untuk mengeksport data dari alat seperti Excel), Notasi Objek JavaScript (“Json”, format data umum untuk aplikasi web), dan GrafikML (“Graphml”, format XML untuk mewakili rangkaian dengan nod dan tepi).

          Data jarak jauh dimuatkan dengan suar menggunakan kelas flare.data.DataSource. Berikut adalah contoh menggunakannya untuk memuat fail data yang dibatasi tab:

          var ds: DataSource = Sumber Data baru (

          "http://flare.prefuse.org/data/test.tab.txt", "tab"

          );

          var loader: URLLoader = ds.load ();

          loader.addEventListener (Event.COMPLETE, function (evt: Event): batal {

          // berfungsi untuk mengendalikan data setelah pemuatan selesai

          var ds: DataSet = loader.data sebagai DataSet;

          // sekarang lakukan sesuatu dengan data…

          });

          Pembuat DataSource mempunyai dua argumen yang diperlukan: url set data, dan rentetan yang menunjukkan format fail. Sekarang format yang disokong adalah “tab” (tab-delimited), “json” (Notasi Objek JavaScript), dan “graphml” (GraphML).

          Untuk kumpulan data yang skema (nama dan jenis data bidang) mungkin tidak jelas, terdapat juga argumen konstruktor pilihan ketiga yang mengambil jenis DataSchema. Lihat kelas flare.data.DataSchema dan flare.data.DataField untuk lebih banyak lagi. Skema dapat membantu untuk memastikan bahawa nilai data diberi nama dengan tepat (mis., Untuk fail yang dibatasi tab tanpa baris tajuk) dan ditukar menjadi jenis data yang betul (mis., Untuk data JSON di mana nilai angka dibungkus dalam tanda kutip).

          Untuk memuatkan data, kaedah pemuatan DataSource dipanggil, mengembalikan contoh flash.net.URLLoader. Pemuat boleh digunakan untuk mengesan kemajuan muat turun (mis., Jika anda ingin memberikan bar kemajuan) dan memberikan peristiwa pemberitahuan apabila muat turun selesai. Dalam contoh di atas, kami menambahkan pendengar acara untuk diberitahu apabila muat turun selesai. DataSource secara automatik akan menguraikan data input, memetakannya ke objek ActionScript, dan menyimpan hasilnya dalam objek flare.data.DataSet. Kelas DataSet dapat mewakili data jadual dan rangkaian (node ​​/ edge).

          Membuat dan Menguruskan Objek Visual

          Sekarang kami ingin memvisualisasikan set data. Untuk melakukan ini, kami memetakan catatan data individu ke dalam item visual. Flare menyediakan sekumpulan objek visual untuk mewakili data. Berikut adalah gambaran keseluruhan kelas asas yang disediakan oleh pakej flare.vis.data.

          • DataSprite: Kelas asas untuk sprite yang mewakili data secara visual. DataSprite adalah subkelas kelas Sprite Flash Player. DataSprite merangkumi properti data di mana tupel data (Objek ActionScript) disimpan dan juga menyediakan pemboleh ubah visual tambahan di luar yang didukung oleh sprite asas, termasuk bidang warna, bentuk, dan ukuran, dan sokongan untuk menetapkan posisi dalam koordinat kutub.
          • NodeSprite: Contoh DataSprite mewakili nod. Ini adalah jenis lalai yang digunakan untuk memvisualisasikan data. Instance NodeSprite boleh dihubungkan dalam struktur rangkaian atau struktur pokok dengan keadaan EdgeSprite.
          • EdgeSprite: Contoh DataSprite mewakili kelebihan. EdgeSprite menghubungkan dua NodeSprites. Node dapat diakses melalui sumber dan sifat sasaran. EdgeSprites digunakan untuk membuat grafik dan pokok, serta mewakili garis, seperti dalam grafik siri masa.

          Biasanya, NodeSprites dan EdgeSprites dibuat dan disimpan di kelas flare.vis.data.Data, yang menguruskan semua item visual untuk satu visualisasi. Kelas Data menyediakan kaedah untuk membuat objek visual baru untuk tupel data dan untuk mewakili struktur grafik.

          Kelas Data juga menyediakan kaedah untuk melintasi dan mengemas kini item data yang terkandung. Sifat nod dan tepi mengembalikan senarai nod dan tepi yang terdapat dalam data. Setiap senarai ini merangkumi kaedah lawatan yang membolehkan anda meneruskan fungsi yang kemudian akan dipanggil dengan setiap simpul atau tepi. Kaedah setProperty dan setProperties juga membolehkan anda menetapkan nilai harta tanah untuk semua nod atau pinggir sekaligus. Kaedah ini secara opsional menjadikan Transitioner sebagai argumen, jadi anda dapat menghidupkan kemas kini harta.

          Sebagai contoh, kod berikut menghasilkan animasi satu saat di mana warna garis untuk semua nod ditetapkan menjadi biru. (Perhatikan bahawa notasi hex untuk nilai warna DataSprite merangkumi saluran alpha dan juga merah, hijau, biru).

          data.nodes.setProperty ("garis warna", 0xff0000bb, Transitioner baru (1)). Mainkan ();

          Node dan senarai tepi juga menyokong nilai harta lalai, menggunakan kaedah setDefault, setDefaults, removeDefault, dan clearDefaults. Nilai lalai akan ditetapkan pada nod atau tepi yang baru dibuat menggunakan kaedah addNode atau addEdgeFor kelas Data.

          Kelas Pohon adalah subkelas Data, khusus untuk mewakili pokok dan bukannya grafik umum. Kelas Data menyokong pembuatan automatik contoh Pokok dengan mengira pokok yang merangkumi graf umum. Sejumlah kaedah penciptaan pokok merangkumi – termasuk algoritma pohon luas pertama, kedalaman pertama, dan minimum pohon spesis – dapat diteruskan sebagai parameter. Pengiraan ini dilakukan menggunakan kelas flare.analytics.graph.SpanningTree.

          Untuk benar-benar membuat objek simpul dan tepi, kami menggunakan kaedah addNode dan addEdgeFor.

          • addNode mengambil tupel data input (Objek) dan membuat NodeSprite baru untuk memvisualisasikan data tersebut.
          • addEdgeFor mengambil dua NodeSprites yang ada dan menambahkan EdgeSprite yang menghubungkannya. Kaedah ini juga secara pilihan kecuali tupel data (sekali lagi, Objek yang mewakili bidang data apa pun) untuk tepi.

          Berikut adalah contoh mudah untuk membuat NodeSprites untuk set data tabular, dengan asumsi kita mempunyai pelbagai objek data:

          senarai var: Array; // pelbagai objek data yang telah kami muatkan

          data var: Data = Data baru (); // bekas data baru

          untuk setiap (var o: Objek dalam senarai) {

          data.addNode (o);

          }

          Hasilnya adalah objek Data yang diisi dengan contoh DataSprite visual (nod atau tepi).

          Dalam praktiknya, anda tidak selalu perlu mengisi data visual secara manual. Untuk membuat objek Data untuk memvisualisasikan set data yang dimuat, anda sering dapat menggunakan kaedah kemudahan sebagai gantinya. Fungsi Data.fromArray () membuat instance Data untuk data tabular yang disimpan sebagai array objek ActionScript, sementara metode Data.fromDataSet () juga membuat instance Data dari objek DataSet yang dimuat.

          Membina Visualisasi

          Sekarang mari kita satukan semuanya untuk mula membuat visualisasi. Kelas Visualisasi mewakili visualisasi tunggal, termasuk tanda visual (disimpan dalam contoh Data) dan paksi. Untuk membuat visualisasi, kami memuat satu set data, menambahkan data ke visualisasi, dan mengatur operator yang menentukan cara memvisualisasikan data. Inilah contohnya. Lihat dahulu kodnya, kemudian baca untuk memahami apa yang dilakukan oleh setiap bahagian.

          pakej {

          import flare.data.DataSet;

          import flare.data.DataSource;

          import flare.scale.ScaleType;

          import suar.vis.Visualisasi;

          import flare.vis.data.Data;

          import flare.vis.operator.encoder.ColorEncoder;

          import flare.vis.operator.encoder.ShapeEncoder;

          import flare.vis.operator.layout.AxisLayout;

          import flash.display.Sprite;

          import flash.events.Event;

          import flash.geom.Rectangle;

          import flash.net.URLLoader;

          [SWF (lebar ="800", tinggi ="600", latar Warna ="#ffffff", frameRate ="30")]

          Tutorial kelas awam memperluas Sprite

          {

          vis peribadi: Visualisasi;

          Tutorial fungsi awam ()

          {

          loadData ();

          }

          beban fungsi peribadiData (): tidak sah

          {

          var ds: DataSource = Sumber Data baru (

          "http://flare.prefuse.org/data/homicides.tab.txt", "tab");

          var loader: URLLoader = ds.load ();

          loader.addEventListener (Event.COMPLETE, function (evt: Event): batal {

          var ds: DataSet = loader.data sebagai DataSet;

          visualisasikan (Data.fromDataSet (ds));

          });

          }

          fungsi peribadi memvisualisasikan (data: Data): tidak sah

          {

          vis = Visualisasi baru (data);

          vis.bounds = Segi Empat baru (0, 0, 600, 500);

          vis.x = 100;

          vis.y = 50;

          addChild (vis);

          vis.operators.add (AxisLayout baru ("data.date", "data.age"));

          vis.operators.add (ColorEncoder baru ("data.sebab", Data.NODES,

          "garis warna", Jenis Skala.KATEGORI));

          vis.operators.add (ShapeEncoder baru ("data.race"));

          vis.data.nodes.setProperties ({fillColor: 0, lineWidth: 2});

          vis.update ();

          }

          }

          }

          Mari lihat setiap kaedah.

          Pembina itu mudah: ia hanya memanggil kaedah loadData.

          Kaedah loadData membuat sumber data baru dan memuatkannya menggunakan kaedah yang dijelaskan sebelumnya. Dalam kes ini, kumpulan data dilaporkan melakukan pembunuhan di daerah Los Angeles pada tahun 2007, disimpan dalam format yang dibatasi tab. Apabila beban selesai, tupel data yang dimuat akan ditambahkan ke instance Data menggunakan kaedah kemudahan dariDataSet. Di bawah ini, ini menghasilkan penciptaan NodeSprites untuk memvisualisasikan setiap item data. Akhirnya, kaedah visualisasi dipanggil.

          Kaedah visualisasi mengatur visualisasi. Inilah yang berlaku dalam setiap langkah:

          • Bahagian 1: Permulaan
          • Visualisasi baru dibuat untuk data
          • Kami menetapkan had visualisasi. Ini menentukan kawasan susun atur.
          • Kami menetapkan kedudukan x dan y visualisasi kami dan menambahkan visualisasi ke senarai paparan.
        • Bahagian 2: Menentukan Pengekodan Visual

          • Kami menggunakan susun atur paksi, meletakkan “tarikh” pada paksi-x dan “usia” pada paksi-y. Pengendali AxisLayout juga secara automatik mengkonfigurasi paksi untuk visualisasi. Kami menggunakan sintaks “data.date” untuk menunjukkan pemboleh ubah data, kerana ia terletak di dalam properti data NodeSprite.
          • Kami menambahkan pengekodan warna, sehingga warna garis simpul mewakili pemboleh ubah “sebab” (penyebab kematian). Kami juga memberitahu pengekod warna bahawa nilai pemboleh ubah “penyebab” mewakili kategori (ScaleType.CATEGORIES). Pengekod warna akan menggunakan maklumat ini untuk memilih palet warna yang sesuai secara automatik. Seperti yang akan kita lihat sebentar lagi, anda juga boleh menyediakan palet warna anda sendiri.
          • Kami menambahkan pengekodan bentuk, sehingga bentuk objek mewakili “ras” korban.
          • Kami menetapkan sifat lalai – kami menetapkan warna isian nod menjadi telus sepenuhnya, dan menetapkan lebar garis kepada 2 piksel.
          • Akhirnya, kami memanggil kaedah kemas kini. Ini menjalankan semua pengendali dengan teratur.
          • Mengemas kini Visualisasi

            Setelah visualisasi dibuat, kami mungkin ingin memperbaruinya. Sebagai contoh, mungkin kita ingin menukar pengekodan warna untuk menggambarkan visual jantina orang.

            Pertama, mari tambahkan kaedah baru ke kelas:

            warna fungsi peribadiByGender (): tidak sah

            {

            var color: ColorEncoder = ColorEncoder (vis.operators [1]);

            warna.sumber = "data.sex";

            color.palette = ColorPalette baru ([0xffff5555, 0xff8888ff]);

            vis.update (Transitioner baru (2)). main ();

            }

            Kaedah ini:

            1. Mengambil operator kedua (pengendali pada indeks 1) dan menghantarnya ke ColorEncoder
            2. Mengubah harta sumber untuk pengekod warna untuk menggunakan pemboleh ubah “data.sex”
            3. Menetapkan palet warna baru (dalam kes ini, merah untuk wanita, biru untuk lelaki – urutan warna sepadan dengan susunan abjad label)
            4. Animasikan perubahan dengan memanggil kemas kini dengan set Transitioner untuk animasi dua saat. Kaedah vis.update mengembalikan Transitioner, jadi kita boleh memanggil play pada nilai kembali kemas kini. (Catatan: anda juga boleh menghilangkan Transitioner dan hanya memberikan nombor 2 sebagai argumen untuk dikemas kini. Transitioner baru akan dibuat secara automatik dan dikembalikan.)

            Sekarang kita perlu menyusun aplikasi supaya kita dapat mencetuskan kemas kini secara interaktif. Untuk melakukannya, tambahkan kod berikut ke pembina:

            // tambahkan label yang boleh diklik

            butang var: TextSprite = TextSprite baru ("Warna mengikut Jantina");

            addChild (butang);

            butang.x = 710;

            butang.y = 50;

            button.buttonMode = benar;

            button.addEventListener (MouseEvent.CLICK,

            fungsi (evt: MouseEvent): batal {colorByGender (); }

            );

            Kod ini:

            1. Membuat label teks baru (TextSprite adalah kelas pembantu dari pakej flare.display)
            2. Menambah label pada aplikasi dan menetapkan kedudukannya
            3. Butang setMode to true (ini menjadikan kursor tangan muncul semasa anda mengarahkan mouse ke label)
            4. Menambah pendengar peristiwa yang dipicu ketika label diklik. Kami menambah fungsi panggilan balik yang memanggil kaedah colorByGender.

            Agar kod di atas berfungsi, kami perlu memasukkan pernyataan import tambahan ini di bahagian atas fail:

            import flash.events.MouseEvent;

            import flare.animate.Transitioner;

            import flare.display.TextSprite;

            import flare.util.palette.ColorPalette;

            Sekarang anda seharusnya dapat menyusun dan menjalankan aplikasi. Mengklik label “Color by Gender” harus menghidupkan perubahan pengekodan warna.

            Langkah seterusnya

            Contoh di atas menunjukkan asas-asas Flash dan perpustakaan Flare, tetapi masih banyak lagi ciri yang masih belum diliputi. Untuk ke depan, kami mengesyorkan (a) memeriksa dokumentasi Flash dan Flare API untuk mengetahui semua kelas yang ada, dan (b) menggali melalui demo Flare untuk melihat bagaimana prinsip yang sama yang ditunjukkan di sini dapat digunakan untuk membina nombor visualisasi lain. Atau, lebih baik lagi, cari kod sumber Flare untuk mengetahui apa yang sedang berlaku.

            Untuk membantu proses ini, berikut adalah gambaran umum umum mengenai sub-pakej di flare.vis:

            • flare.vis.axis: menyediakan paksi, label dan garis grid
            • flare.vis.controls: pengendali interaksi untuk pemilihan, zoom, dan banyak lagi
            • flare.vis.data: objek visual yang mewakili elemen data
            • flare.vis.data.render: penyaji pluggable yang menarik DataSprites
            • flare.vis.events: jenis acara yang digunakan dalam kerangka suar
            • flare.vis.legend: mewakili legenda untuk menerangkan pengekodan visual
            • flare.vis.operator: blok bangunan untuk menentukan visualisasi
            • flare.vis.palette: palet untuk nilai warna, bentuk, dan ukuran
            • flare.vis.util: kelas utiliti am

            Anda sekarang harus cukup tahu untuk memahami demo dalam pakej flare.demos. Jangan ragu untuk bermain dengan, mengubah suai, menyalin, menampal, dan membina demo untuk mendapatkan pemahaman yang lebih baik tentang bagaimana Flash dan Flare berfungsi.

            Pautan

            Muat turun

            Alat

            Panduan Teknikal Lain

            • Panduan Privasi
            • Permainan Bitcoin
            • Pertukaran Ulasan

            Sokongan

            Mike Owergreen Administrator
            Sorry! The Author has not filled his profile.
            follow me
            Like this post? Please share to your friends:
            Adblock
            detector
            map