Etiket arşivi nedir

TextMeshPro Ayrıntılı Anlatımı

TextMeshPro Ayrıntılı Anlatımı

TextMeshPro (TMP), Unity’deki metin bileşenlerinin daha keskin, detaylı ve etkileyici görünmesini sağlar. Standart Unity Text bileşenine kıyasla çok daha geniş özelliklere sahiptir. TextMeshPro, özellikle yüksek çözünürlüklü ve özelleştirilebilir metinlerle çalışmak için geliştirilmiş bir sistemdir ve metinleri grafiksel olarak çok daha etkileyici hale getirir.

TextMeshPro, hem UI (2D) hem de 3D metin olarak kullanılabilir. 2D UI metinleri için kullanıcı arayüzünde (menüler, butonlar gibi) yüksek kaliteli metin oluşturmak için idealdir. 3D metinlerde ise sahne içindeki 3D nesnelerin üzerinde metin göstermek için kullanılır.

1. TextMeshPro Menüsüne Nasıl Ulaşılır?

TextMeshPro bileşenine Unity’de şu şekilde ulaşabilirsiniz:

  1. UI Panelinde TextMeshPro UI Ekleme:
    • Hierarchy panelinde sağ tıklayın, UI > Text – TextMeshPro seçeneğini seçin. Bu seçenek, sahneye bir TextMeshPro UI bileşeni ekler. Bu metin, Unity’nin UI sistemine dahildir ve 2D kullanıcı arayüzleri için kullanılır.
  2. 3D Nesne Olarak TextMeshPro Ekleme:
    • Hierarchy panelinde sağ tıklayın, 3D Object > Text – TextMeshPro seçeneğini seçin. Bu seçenek, sahneye 3D nesne olarak bir TextMeshPro bileşeni ekler. Bu tür metinler, sahnede 3D nesne gibi davranır ve kamera perspektifine göre boyutları değişir.
  3. Inspector Panelinde TextMeshPro Özelliklerini Düzenleme:
    • TextMeshPro bileşenini seçtiğinizde, sağ tarafta yer alan Inspector panelinde TextMeshPro’nun tüm özelliklerini görebilir ve ayarlayabilirsiniz.

2. TextMeshPro Çeşitleri

TextMeshPro, kullanım alanına göre iki farklı türde bulunur:

  • TextMeshPro – UI: UI (kullanıcı arayüzü) elemanları için geliştirilmiş bir metin bileşenidir. 2D UI elemanlarıyla çalışırken yüksek çözünürlüklü ve ayrıntılı metinler oluşturur. Button, Panel gibi arayüz bileşenleri ile uyumludur.
  • TextMeshPro – 3D: 3D ortamda kullanılan bir metin bileşenidir. 3D sahnede metinleri nesneler gibi ekranda konumlandırabilir ve döndürebilirsiniz. Özellikle sahnede sabit olmayan metinler için tercih edilir.

3. TextMeshPro Özellikleri ve Ayrıntılı Açıklamaları

TextMeshPro’nun pek çok özelliği vardır ve metinlerin görünümünü, renklerini, gölgelendirmesini, hizalamasını ve daha birçok detayı ayarlamanıza olanak tanır. Aşağıdaki tabloda TextMeshPro bileşeninin önemli özelliklerini, ne işe yaradıklarını ve nasıl kullanıldıklarını ayrıntılı olarak bulabilirsiniz.

ÖzellikAçıklamaKullanım DurumlarıProgramatik Erişim
TextGörüntülenmesini istediğiniz metni belirler. Bu alan, metnin temel içeriğini içerir.Tüm metin elemanlarında kullanılır.textMeshPro.text = "Merhaba";
Font AssetMetin için kullanılan fontu belirler. TextMeshPro fontları özel bir format kullanır ve TMP_FontAsset olarak eklenir.Metin stilini değiştirmek istediğinizde kullanılır.textMeshPro.font = myFontAsset;
Font StyleMetin stilini belirler; Normal, Bold, Italic, Underline gibi seçenekler içerir.Farklı metin stilleri ile vurgulama yapmak için.textMeshPro.fontStyle = FontStyles.Bold;
Font SizeMetnin boyutunu ayarlar. Genellikle UI ve 3D metinler için kullanılır.Küçük veya büyük yazı boyutları gerektiğinde.textMeshPro.fontSize = 24;
AlignmentMetnin hizalamasını belirler; Left, Center, Right gibi seçenekler bulunur.Metnin sola, sağa veya ortaya hizalanması gerektiğinde.textMeshPro.alignment = TextAlignmentOptions.Center;
ColorMetnin rengini ayarlar.Öne çıkması gereken veya belirli bir tema rengine uyacak metinler için.textMeshPro.color = Color.red;
Gradient ColorMetne renk geçişi (gradient) ekler. TextMeshPro’nun yalnızca belirli versiyonlarında mevcuttur.Renk geçişleri ile daha ilgi çekici metinler için.textMeshPro.colorGradient = myGradient;
OutlineMetin etrafında bir kenarlık ekler.Metni daha belirgin hale getirmek için kenarlık eklemek gerektiğinde.textMeshPro.outlineWidth = 0.1f;
Outline ColorKenarlık rengini belirler.Kenarlığın görünümünü özelleştirmek için.textMeshPro.outlineColor = Color.black;
Character SpacingKarakterler arasındaki boşluğu ayarlar.Daha sıkı veya daha geniş metinler için karakter aralığını ayarlamak için.textMeshPro.characterSpacing = 1.0f;
Line SpacingSatırlar arasındaki boşluğu ayarlar.Metin paragrafları için satır boşluğunu özelleştirmek gerektiğinde.textMeshPro.lineSpacing = 1.2f;
Word SpacingKelimeler arasındaki boşluğu ayarlar.Geniş boşluklu veya daha sıkışık metinler için.textMeshPro.wordSpacing = 1.5f;
Enable Auto-SizingFont boyutunun otomatik olarak ayarlanmasını sağlar.Metnin boyutunu otomatik olarak kutuya sığdırmak gerektiğinde.textMeshPro.enableAutoSizing = true;
Max Visible CharactersGörüntülenebilecek maksimum karakter sayısını belirler.Belirli bir karakter sayısı sınırlaması yapmak istediğinizde.textMeshPro.maxVisibleCharacters = 50;
Rich TextZengin metin (bold, italic gibi) formatlarını destekler.Metinde stil değişiklikleri yapmak gerektiğinde.textMeshPro.richText = true;
Raycast TargetMetnin raycast hedefi olup olmadığını belirler. UI etkileşimleri için önemlidir.Metin üzerinde tıklama veya etkileşim yapılacaksa aktif edilir.textMeshPro.raycastTarget = true;

TextMeshPro Özelliklerine Programatik Erişim

TextMeshPro bileşenine C# kodu ile erişip özelliklerini değiştirebilirsiniz. Aşağıda her bir TextMeshPro özelliğine nasıl erişileceğini gösteren bir tablo hazırladım:

ÖzellikKod ile Erişim ÖrneğiAçıklama
TexttextMeshPro.text = "Merhaba";Metni ayarlar.
Font AssettextMeshPro.font = myFontAsset;Fontu değiştirir.
Font StyletextMeshPro.fontStyle = FontStyles.Bold;Yazı stilini ayarlar.
Font SizetextMeshPro.fontSize = 24;Yazı boyutunu ayarlar.
AlignmenttextMeshPro.alignment = TextAlignmentOptions.Center;Metni ortalar.
ColortextMeshPro.color = Color.red;Metin rengini kırmızı yapar.
Gradient ColortextMeshPro.colorGradient = myGradient;Metne renk geçişi ekler.
OutlinetextMeshPro.outlineWidth = 0.1f;Kenarlık ekler.
Outline ColortextMeshPro.outlineColor = Color.black;Kenarlık rengini siyah yapar.
Character SpacingtextMeshPro.characterSpacing = 1.0f;Karakterler arasındaki boşluğu ayarlar.
Line SpacingtextMeshPro.lineSpacing = 1.2f;Satır aralığını ayarlar.
Word SpacingtextMeshPro.wordSpacing = 1.5f;Kelimeler arasındaki boşluğu ayarlar.
Enable Auto-SizingtextMeshPro.enableAutoSizing = true;Yazı boyutunu otomatik ayarlama.
Max Visible CharacterstextMeshPro.maxVisibleCharacters = 50;Görüntülenebilecek maksimum karakter sayısını belirler.
Rich TexttextMeshPro.richText = true;Zengin metin formatlarını aktif eder.
Raycast TargettextMeshPro.raycastTarget = true;Metnin raycast hedefi olup olmadığını belirler.

4. TextMeshPro Özelliklerinin Değer Aralıkları ve Kullanım Durumları

Aşağıdaki tabloda TextMeshPro özelliklerinin değer aralıklarını ve hangi durumlarda hangi değerlerin kullanılabileceğini detaylandırdım:

ÖzellikDeğer Aralığı / SeçeneklerÖnerilen DeğerlerKullanım Durumları
Font Size1 – 500+ (Projeye göre değişir)12-24 (UI için), 36+ (Başlıklar için)Küçük metinler için küçük, başlıklar için büyük boyutlar tercih edilir.
AlignmentLeft, Center, Right, JustifiedLeft (Genel), Center (Başlıklar)Paragraf veya uzun metinlerde sol, başlıklar için merkez hizalama.
Outline Width0 – 10.1 – 0.5Hafif kenarlık için düşük, belirgin kenarlık için yüksek değer.
Character Spacing0 – ∞0.5 – 1.5Geniş boşluklu veya sıkışık metinler için.
Line Spacing0 – ∞1.0 – 1.5Metin paragrafları veya başlıklar için.
Word Spacing0 – ∞1.0 – 1.5Geniş veya sık kelime boşlukları için.
Max Visible Characters0 – ∞İhtiyaca göreSınırlı metin gösterimi yapmak gerektiğinde.

5. TextMeshPro Kullanım Alanları ve Dikkat Edilecekler

Kullanım Alanları

  1. UI Metinleri: TextMeshPro – UI, kullanıcı arayüzlerinde (menüler, butonlar) yüksek kaliteli metinler oluşturmak için kullanılır.
  2. 3D Metinler: TextMeshPro – 3D, sahne içinde 3D nesneler üzerinde metin göstermek için idealdir, örneğin karakterlerin isimleri veya bilgi etiketleri gibi.
  3. Etiketler ve Bilgilendirme Panelleri: Oyun içinde bilgi panelleri veya uyarı mesajları için kullanılabilir.

Dikkat Edilmesi Gerekenler

  • Font ve Boyut Seçimi: Çok küçük fontlar okunması zor olabilir, çok büyük fontlar ise UI tasarımını bozabilir.
  • Auto-Sizing Kullanımı: Otomatik boyutlandırma özelliği dikkatli kullanılmalıdır. Metinler çok küçük veya çok büyük olabilir.
  • Kenarlık ve Gölge Ayarları: Kenarlık ve gölge özellikleri abartılı kullanılırsa metinlerin okunabilirliğini düşürebilir.
  • Raycast Target: Gereksiz raycast hedefleri performansı düşürebilir, raycast sadece tıklanabilir metinlerde kullanılmalıdır.

Uygulanmaması Gereken Nesneler

  • Statik Arka Planlar veya Grafikler: Arka planda sabit görsellerde kullanılmaz.
  • Performans Kısıtlı Projeler: Çok fazla TextMeshPro bileşeni, mobil cihazlarda performansı etkileyebilir.

Özet

Dikkat Edilecek Noktalar: Auto-Sizing, kenarlık ayarları, raycast kullanımı performans açısından önemlidir.

TextMeshPro Ekleme: UI > Text – TextMeshPro veya 3D Object > Text – TextMeshPro yoluyla eklenir.

Çeşitleri: TextMeshPro – UI (2D arayüz) ve TextMeshPro – 3D (sahne içi 3D metin).

Özellikler ve Kullanımı: Text, Font Size, Color, Outline, Gradient gibi birçok özelliği bulunur.

Kullanım Alanları: UI metinleri, 3D etiketler, bilgi panelleri.

1

Physic Material Ayrıntılı

Physic Material Ayrıntılı Anlatımı

Physic Material, nesnelerin fiziksel etkileşimlerini kontrol eden bir materyal türüdür ve özellikle çarpışma, sürtünme, sıçrama gibi etkileri ayarlamak için kullanılır. Physic Material, 3D projelerde Collider bileşenlerine eklenerek nesnelerin yüzey özelliklerini tanımlar. Bu özellik, nesnelerin nasıl hareket edeceğini, birbiriyle çarpışma anında nasıl tepki vereceğini belirlemek için kullanılır.

1. Physic Material Menüsüne Nasıl Ulaşılır?

Unity’de Physic Material bileşenine şu adımlarla ulaşabilirsiniz:

  1. Project Panelinde Physic Material Oluşturma:
    • Assets panelinde sağ tıklayın, Create > Physic Material seçeneğini seçin. Yeni bir Physic Material oluşturulacaktır.
  2. Inspector Panelinde Physic Material’i Düzenleme:
    • Oluşturduğunuz Physic Material nesnesini seçtiğinizde, sağ taraftaki Inspector panelinde Physic Material özelliklerini görebilir ve ayarlayabilirsiniz.
  3. Collider’a Physic Material Ekleme:
    • Bir Collider bileşenine Physic Material eklemek için oluşturduğunuz Physic Material nesnesini Collider bileşeninin Material alanına sürükleyip bırakabilirsiniz.

2. Physic Material Çeşitleri

Physic Material bileşeni aslında tek bir türdür; ancak 3D projelerdeki farklı nesnelere atanarak çeşitli fiziksel etkileşimler oluşturulabilir. Örneğin, bir nesnenin kaygan, sert veya esnek bir yüzeye sahip olması gerektiğinde farklı Physic Material ayarları yapılabilir.

Physic Material, 2D projelerde Physics Material 2D olarak benzer işlevlere sahiptir, ancak 3D ile 2D arasındaki fark, 2D versiyonunun yalnızca 2D fizik motoruyla uyumlu olmasıdır.

Physic Material Türleri

  • Physic Material (3D): 3D projelerde nesnelerin çarpışma, sürtünme ve sıçrama etkilerini ayarlar.
  • Physics Material 2D: 2D projelerde nesnelerin fiziksel özelliklerini ayarlamak için kullanılır.

3. Physic Material Özellikleri ve Ayrıntılı Açıklamaları

Physic Material bileşeninin temel özellikleri Dynamic Friction, Static Friction, Bounciness ve Friction Combine/ Bounce Combine gibi parametrelerdir. Bu özellikler nesnelerin yüzeyle nasıl etkileşime gireceğini belirler. Aşağıdaki tabloda Physic Material bileşeninin özelliklerini, ne işe yaradıklarını ve nasıl kullanıldıklarını ayrıntılı bir şekilde bulabilirsiniz.

ÖzellikAçıklamaKullanım DurumlarıProgramatik Erişim
Dynamic FrictionNesne hareket halindeyken uygulanan sürtünme katsayısını belirler. 0 ile 1 arasında değer alır; 0 kaygan, 1 ise yüksek sürtünmelidir.Kaygan veya sürtünmeli yüzeyler için.physicMaterial.dynamicFriction = 0.5f;
Static FrictionNesne dururken uygulanan sürtünme katsayısını belirler. 0 ile 1 arasında değer alır.Sabit duran nesnelerin yüzeyle etkileşimini ayarlamak için.physicMaterial.staticFriction = 0.5f;
BouncinessNesnenin sıçrama miktarını belirler. 0 ile 1 arasında değer alır; 0 sıçramaz, 1 ise maksimum sıçrama sağlar.Toplar veya sıçrama gerektiren yüzeyler için.physicMaterial.bounciness = 0.8f;
Friction CombineSürtünmenin nasıl birleşeceğini belirler. Average, Minimum, Maximum, Multiply seçenekleri vardır.Farklı yüzeyler arasındaki sürtünmeyi birleştirmek için.physicMaterial.frictionCombine = PhysicMaterialCombine.Average;
Bounce CombineSıçrama etkisinin nasıl birleşeceğini belirler. Average, Minimum, Maximum, Multiply seçenekleri vardır.Farklı yüzeylerin sıçrama etkilerini birleştirmek için.physicMaterial.bounceCombine = PhysicMaterialCombine.Maximum;

Physic Material Özelliklerine Programatik Erişim

Physic Material bileşenine C# kodu ile erişip özelliklerini değiştirebilirsiniz. Aşağıda her bir özelliğe nasıl erişileceğini gösteren bir tablo hazırladım:

ÖzellikKod ile Erişim ÖrneğiAçıklama
Dynamic FrictionphysicMaterial.dynamicFriction = 0.5f;Nesne hareket halindeyken uygulanan sürtünme katsayısını ayarlar.
Static FrictionphysicMaterial.staticFriction = 0.5f;Nesne dururken uygulanan sürtünme katsayısını ayarlar.
BouncinessphysicMaterial.bounciness = 0.8f;Nesnenin sıçrama miktarını belirler.
Friction CombinephysicMaterial.frictionCombine = PhysicMaterialCombine.Average;Sürtünme etkisinin nasıl birleştirileceğini belirler.
Bounce CombinephysicMaterial.bounceCombine = PhysicMaterialCombine.Maximum;Sıçrama etkisinin nasıl birleştirileceğini belirler.

4. Physic Material Özelliklerinin Değer Aralıkları ve Kullanım Durumları

Aşağıdaki tabloda Physic Material bileşeninin özelliklerine ait değer aralıklarını ve hangi durumlarda hangi değerlerin kullanılabileceğini detaylandırdım:

ÖzellikDeğer Aralığı / SeçeneklerÖnerilen DeğerlerKullanım Durumları
Dynamic Friction0 – 10.2 (Kaygan yüzey), 0.8 (Yüksek sürtünmeli yüzey)Yüksek sürtünmeli yüzeylerde 0.8, kaygan yüzeylerde 0.2 veya altı.
Static Friction0 – 10.2 – 0.8Sabit duran nesnelerin kolay hareket etmesi için düşük, zor hareket etmesi için yüksek değerler.
Bounciness0 – 10 (Hiç sıçramayan), 1 (Yüksek sıçrama)Top gibi sıçraması gereken nesneler için yüksek, düz yüzeyler için düşük.
Friction CombineAverage, Minimum, Maximum, MultiplyAverageFarklı yüzeylerde ortalama sürtünme etkisi isteniyorsa Average seçilir.
Bounce CombineAverage, Minimum, Maximum, MultiplyMaximumFarklı yüzeylerde maksimum sıçrama etkisi isteniyorsa Maximum seçilir.

5. Physic Material Kullanım Alanları ve Dikkat Edilecekler

Kullanım Alanları

  1. Sürtünme ve Kayganlık Efektleri: Physic Material, nesnelerin yüzeylerinin sürtünme seviyesini ayarlayarak kaygan veya yüksek sürtünmeli yüzeyler oluşturur.
  2. Sıçrama Efektleri: Bounciness özelliği sayesinde toplar veya zıplaması gereken nesneler için sıçrama etkisi yaratır.
  3. Özel Yüzey Etkileri: Farklı yüzeylerin etkileşimini kontrol etmek ve özelleştirmek için Physic Material kullanılır.

Dikkat Edilmesi Gerekenler

  • Sürtünme Değerleri: Sürtünme değerlerinin aşırı yüksek veya düşük olmaması önemlidir. Çok yüksek sürtünme değerleri nesnelerin hareket etmesini engelleyebilir.
  • Bounciness (Sıçrama) Değerleri: Yüksek Bounciness değeri, nesnelerin sürekli sıçramasına ve beklenmedik hareketlere neden olabilir. Sadece gerektiği kadar sıçrama verilmelidir.
  • Friction ve Bounce Combine Ayarları: Farklı yüzeylerin etkileşimini birleştirirken doğru ayarlar yapılmalıdır. Örneğin, çok kaygan bir yüzeyle çok sürtünmeli bir yüzeyi birleştirirken dikkatli olunmalıdır.

Uygulanmaması Gereken Nesneler

  • Statik ve Sabit Nesneler: Sadece hareketli nesnelere uygulayın. Statik ve sabit nesneler için Physic Material gereksizdir.
  • UI Elemanları: Physic Material, yalnızca fiziksel çarpışma veya sürtünme etkisi gerektiren nesnelerde kullanılır. UI elemanları veya 2D sprite’lar için uygun değildir.

Özet

Dikkat Edilecek Noktalar: Sürtünme ve sıçrama değerlerinin doğru ayarlanması, yanlış materyal ayarlarından kaçınılması önemlidir.

Physic Material Ekleme: Assets panelinden Create > Physic Material ile oluşturulabilir ve Collider bileşenine eklenir.

Çeşitleri: Tek bir Physic Material türü vardır, ancak 3D projelerde Collider bileşenlerinde uygulanabilir.

Özellikler ve Kullanımı: Dynamic Friction, Static Friction, Bounciness gibi özellikler ile yüzeyin fiziksel özellikleri ayarlanır.

Kullanım Alanları: Sürtünme, kayganlık, sıçrama ve yüzey etkileşimlerini kontrol etmek için kullanılır.

1

Zoom Programını Türkçeleştirme

Zoom Programını Türkçeleştirme ve Menü Tanıtımları

ZOOM’daki İngilizce kelimelerin Türkçe anlamları

ZOOM, Canlı dersler için artık vazgeçilmez programlardan biri olup kullanımını az yada çok her öğretmenin bilmesi gerekiyor.Ancak programın ingilizce olması,ingilizce bilmeyen öğretmenlerin işini biraz daha zorlaştıyor.

Zoomla ilgili sorun yaşamamak, daha pratik ve sorunsuz kullanmak için yazdırıp masanızın üstünde bulunmasında yarar olduğunu düşünüyoruz.

Zoom Programını Türkçeleştirme
Zoom Programını Türkçeleştirme ve Menü Tanıtımları 13

New Meeting: Yeni bir toplantı, görüşme, online ders oluşturacağınız alan kısımdır. New meeting kısmına tıklayıp Zoom uygulaması üzerinden derslerinizi veya toplantılarınızı yapabilirsiniz.

Join: Mevcut olan bir toplantıya ve derse katılabileceğiniz butondur. Bu kısma tıklayıp görüşmeyi oluşturan kişinin ID’sini ve şifresini girip sınıfa dahil olabilirsiniz. Mevcut olan bir toplantıya ve derse katılabileceğiniz butondur. Bu kısma tıklayıp görüşmeyi oluşturan kişinin ID’sini girip sınıfa dahil olabilirsiniz.

Schedule: İleri Tarihli Sohbet Programla, İleri tarihli bir meeting, online ders, sınıf ortamı oluşturabileceğiniz alandır. Derslerinizi şuan değilde 3 gün sonra planlamak istiyorsanız bu kısmı kullanabilirsiniz.

Share Screen: Ekran paylaşımı yapabileceğiniz alandır.

Meetings: Toplantı Bilgileri

Zoom Programını Türkçeleştirme
Zoom Programını Türkçeleştirme ve Menü Tanıtımları 14

Security: Güvenlik

Participants: Katılımcılar

Chat: (Sohbet) Sohbet penceresini görüntülemesine imkân sağlar.

Share Screen: Yine zoom uygulamamızı kullanmamızın en önemli faktörlerinden birisidir. “Share Screen” kısmından ekran paylaşımı yapıp, öğrencilerinizle derslerinizi beyaz bir tahta üzerinden veya bir doküman üzerinden yapabilirsiniz. Mesela konunuzla ilgili bir soru çözümü yapacağınız zaman, bu kısımdan sorunun pdf veya görüntüsünü öğrencileriniz ile paylaşıp, dokunmatik ekranlar sayesinde bir kalemle sorunuzu kağıda çözer gibi çözebilirsiniz. Buradaki önemli olan nokta telefon, tablet gibi cihazlarda dokunmatik özellik olduğu için dokunmatik kalemler sayesinde soru çözümleriniz oldukça kolaydır. Bilgisayarlar içinde “Grafik Tablet” kullanmanızı tavsiye ederiz. (özellikle işlem yapılan sayısal ağırlıklı dersler için)

Zoom Programını Türkçeleştirme
Zoom Programını Türkçeleştirme ve Menü Tanıtımları 15

Share Screen butonuna tıkladıktan sonra üst kısımdaki gibi bir ekran gelir karşınıza. Öğrencileriniz ile derslerinizi bir beyaz tahta üzerinden yapmak istiyorsanız “Whiteboard” kısmına tıklayıp öğrencileriniz ile beyaz tahta paylaşımı yapabilirsiniz. Uygulamanın orta kısmı beyaz tahta haline gelir, üst kısımda ise öğrencilerinizin ve sizin görüntüleri gelir. Beyaz tahta üzerinden ister uygulamanın size sunmuş olduğu yazı, kalem vb. gibi araçlarla derslerinizi yapabilir isterseniz kendi kaleminize işlem yapabilirsiniz. Burada önemli olan nokta telefon, tablet gibi dokunmatik ekranlarda, dokunmatik bir kalemle tipki deftere yazı yazıyor gibi uygulama üzerine yazabilirsiniz. Bilgisayarlar içinde ek olarak grafik tablet kullanabilirsiniz. 

Derslerinizi bir doküman üzerinden işlemek istiyorsanız dokümanı bilgisayarında yada telefonunuzda açtığınızda yukarıdaki ekranın alt kısmında olduğu gibi açık sekmeleri gösterir. Hangi doküman üzerinden ders yapmak istiyorsanız ona tıklayıp öğrencilerinizle sadece o dokümanın ekran paylaşımını yapabilirsiniz. 

Record: Kayıt

Breakout Rooms: Bekleme Odası

Reactions: Uygulamanın emojileridir. 

Zoom Programını Türkçeleştirme
Zoom Programını Türkçeleştirme ve Menü Tanıtımları 16

Join Audio: Ses – Mikrofon/Hoparlör Ayarları

Start/Stop Video: Video Başlat/Durdur. Toplantı, konferans içi videonuzu durdurmaya yada başlatmanıza olanak sağlar.

Zoom Programını Türkçeleştirme
Zoom Programını Türkçeleştirme ve Menü Tanıtımları 17

Mute: Mikrofonun sesini açar ya da kapatır.

New Share: (Yeni Paylaşım) Yeni bir ekran paylaşımı başlatmanızı sağlar.

Pause Share (Paylaşımı Duraklat): Geçerli paylaşılan ekranınızı duraklatabilirsiniz ve daha sonra tekrar paylaşımı devam
ettirebilirsiniz.

End Meeting (Toplantıyı Sonlandır): Bu kısma tıklayarak canlı dersi ya da toplantıyı bitirebilirsiniz.

Manage Participant -Participants (Katılımcılar – Katılımcıları Yönetme): Katılımcıları görüntüleyip katılımcıları yönetebilirsiniz. Bu kısımdan katılımcılarınızı görebilir, direkt olarak kişinin görüntüsünün üstüne tıklayıp ona odaklanabilirsiniz.

Start – Stop Video ”Videoyu Başlat – Durdur”: Toplantı, konferans içi videonuzu durdurmaya yada başlatmanıza olanak sağlar. Buna tıklayarak online görüşmeyi / toplantıyı başlatabilirsiniz.

Chat (Sohbet): Sohbet penceresini görüntülemesine imkân sağlar. Katılımlarınıza notlarınızı paylaşmak için chat kısmından hangi katılımcıyla konuşmak istiyorsanız üstüne tıklayıp özel olarak konuşabilirsiniz. Veya tüm katılımcıların göreceği şekilde genele yazabilirsiniz. Öğrencileriniz size bir soru sormak istediğiniz eğer sesi kapalıysa chat kısmından sormak istediklerini size sorabilir.

Record (Kayıt): Dersinize, toplantınıza ya da konferansınıza ait video kaydını başlatmanızı sağlar. Sadece masaüstü zoom uygulamasında ve bazı mobil cihazlarda bu özellik vardır. Tüm görüşmelerinizi, meetinginize, derslerinizi kayıt etmenizi ve depolamanızı sağlayan kısım burasıdır. Bu buton sayesinde tüm derslerinizi kayıt edebilirsiniz. Record kısmına tıklayıp kaydı başlattıktan sonra, derslerinizi tamamlayıp görüşmeyi tamamladıktan sonra zoom otomatik olarak kaydınızın size sunacaktır.

Invate (Davet et): En önemli kısım burasıdır. Aslında zoom uygulamasını kullanmamızın nedeni olan birebir veya grup halinde derslerimizi yapacağımız öğrencilerimizi, kişileri oluşturmuş olduğumuz bu sınıfa davet etmemize sağlayan butondur. İster e-posta adresine davet linkinizi gönderebilirsiniz, isterseniz uygulamanız size verdiği linki kopyalayıp görüşme sağlamak istediğiniz kişilere iletebilirsiniz. Veya toplantı ID ve şifresini toplantıya katılacak kişilere yollayabilirsiniz. Bu arada güvenlik amacıyla getirilen son güncellemeyle birlikte artık toplantıya katılan herkesi toplantı sahibinin onaylaması gerekiyor. Bu linke tıklayan kişiler sizin sanal sınıfınıza katılmış olurlar. 

Zoom Programını Türkçeleştirme
Zoom Programını Türkçeleştirme ve Menü Tanıtımları 18

Test Speakers and Microphone (Hoparlör ve mikrofonu test et) : Sesi ve mikrofonu test edebilirsiniz. 

Audio Settings: Ses ayarları, Sesinizi açıp kapatabileceğiniz butondur. Masaüstü kullanımda ekranın sol altında yer alır.

Zoom Uygulama Ayarları Nasıl Yapılır?

Zoom uygulaması üzerinden görüşmeye başladıktan sonra kullanmak isteyeceğiniz başlıca ayarlara bir bakalım;

  • Görüşmeye başladıktan sonra sesinizin karşı tarafa gitmesini istemediğiniz durumlar için mikrofon işaretine yani “Mute” seçeneğine tıklayabilirsiniz. Sesi tekrar açmak istediğinizde de yine aynı yere tıklamanız gerekiyor. Birçok kullanıcı Zoom’da ses gelmiyor yönünde şikayette bulunuyor. Eğer ses ile ilgili sorun yaşıyorsanız mikrofon ikonu yanındaki ok işaretine tıkladığınızda açılacak olan pencereden “audio settings”i seçerek mikrofon ve hoparlör ayarlarınızı kontrol edebilirsiniz.
  • Zoom uygulaması kamera kapatma seçeneği de sunuyor. Ses gibi görüntünüzü de “Stop Video” seçeneği ile kapatıp sonrasında yeniden açabilirsiniz. Dilerseniz görüşme boyunca kameranızı kapalı tutabilirsiniz.
Zoom Programını Türkçeleştirme
Zoom Programını Türkçeleştirme ve Menü Tanıtımları 19
  • Bir toplantıya katılacaksınız ancak bulunduğunuz ortam dağınık ya da karşı taraftan görünmeye pek uygun değil. Bu durumda Zoom arka plan değişikliği seçeneğini kullanabilirsiniz. Sol alt köşede bulunan video ikonu yanındaki ok işaretine tıkladığınızda açılan pencereden “Choose Virtual Background” seçeneği ile arka plan için bir görsel seçebilirsiniz.
Zoom Programını Türkçeleştirme
Zoom Programını Türkçeleştirme ve Menü Tanıtımları 20
  • Zoom ekran paylaşımı yapmanıza da imkan tanıyor. “Share Screen” seçeneği ile toplantı sırasında kendi ekranınızda açacağınız dosyaları katılımcıların görmesini sağlayabilirsiniz.
  • Sesli dosyalarda sesin karşı tarafa ulaşması için “Share computer sound” ibaresini işaretlemeyi unutmayın.
  • Ekran paylaşımı yaparken beyaz tahta da kullanıp anlatmak istediklerinizi anlık yazılı olarak karşı tarafa iletebilirsiniz. Çeşitli işaretlerle özellikle belirtmek istediğiniz noktalara dikkat çekebilirsiniz. Zoom çoklu ekran deneyimi sayesinde ekranınızdaki bilgileri paylaşırken katılımcıları da karşınızda görmeye devam edersiniz.
Zoom Programını Türkçeleştirme
Zoom Programını Türkçeleştirme ve Menü Tanıtımları 21

Chat seçeneği ile tüm kullanıcılara ya da seçeceğiniz kullanıcıya yazılı mesajlarınızı anlık olarak iletebilirsiniz.


Zoom İlave Ayarlar

Zoom İlave Ayarlar

Kamera Arka Planına Resim Ekleme

Zoom da video arka planına resim eklemek için Start Video düğmesinin yanındaki yukarı ok tuşuna basınız ve Choose Virtual Background düğmesine tıklayınız. Açılan pencereden seçtiğiniz resim videonuzda arka plan olarak gösterilecektir.

Zoom İlave Ayarlar
Zoom İlave Ayarlar 30

Katılımcıları Yönetme

Manage Participants düğmesine ( Katılımcıları yönetme düğmesi ) tıkladığınızda sağ tarafta katılımcı listesini görebileceğiniz bir pencere
açılacaktır.

Alt kısımda katılımcıları seslerini kapatmak için “Mute All” konuşmalarını sağlamak için “Unmute All” düğmelerini kullanabilirsiniz. Hepsini kapatıp tek bir katılımcıya da konuşma hakkı verebilirsiniz bunu da katılımcının yanındaki düğmelerini kullanarak yapabilirsiniz.

Ekran Paylaşımı

Bilgisayarınızdan dosya veya ekranınız paylaşmak için “Share Screen” (ekran paylaş) düğmesine tıklayınız.

Zoom İlave Ayarlar
Zoom İlave Ayarlar 31

Tıkladığınızda yukarıdaki resimdeki gibi bir pencere açılacaktır. Açılan pencerede ekranınız ile birlikte açık olan programlar da listelenecektir. Bunlardan paylaşmak istediğiniz Screen (ekran), Whiteboard (Beyaz tahta) veya programı seçip sağ alttaki Share (Paylaş) butonuna tıkladığınızda paylaşım başlayacaktır. Paylaşımı durdurmak için stop share düğmesini tıklayınız.

Katılımcılarla Sohbet (Chat)

Chat (Sohbet) butonuna tıkladığınızda sağ tarafta katılımcılar ile yazışma penceresi açılacaktır. Herkese veya özel mesaj yazıp gönderebilirsiniz. Aynı zamanda onların yazdıklarını okuyabilirsiniz. To Everyone (Herkes)
seçili durumunda yazdığınız herkese iletilir. Everyone düğmesinin yanındaki düğmeye tıkladığınızda özel mesaj göndermek istediğiniz katılımcıyı seçip mesajınızı gönderebilirsiniz.

Oturmu Kayıt Altına Alma

Yapacağınız oturumun kayıt edilmesi gerekmektedir. Daha sonra öğrencilerin yapmış olduğunuz dersi dinleyebilmesi açısından son derece önemli bir husustur. Aksi taktirde kayıt etmediğiniz dersi yeniden yapma durumunda kalırsınız. Dersinize başlamadan önce mutlaka Record (Kayıt et) düğmesine tıklayınız ve dersinize öyle başlayınız. Record (Kayıt düğmesine tıkladığınızda) Ekranınızın sol üst köşesinde kayıt düğmesinin
aktif olduğunu gösteren Recording yazar ve yanında kırmızı bir nokta yanıp söner.

Zoom İlave Ayarlar
Zoom İlave Ayarlar 32

Oturumu Sonlandırma

Dersiniz sona erdiğinde End Meeting (Oturumu Sonlandır) düğmesine tıklayınız. Oturumu sonlandır düğmesine tıkladığınızda aşağıdaki gibi bir pencere açılacaktır.

Zoom İlave Ayarlar
Zoom İlave Ayarlar 33

End Meeting for All düğmesine tıkladığınızda yapmış olduğunuz oturum bilgisayarınıza video formatına çevrilip kayıt edilecektir. Daha sonra bu kaydınızı izleyebilir web de paylaşabilirsiniz. Böylelikle öğrencileriniz istedikleri zaman dersinizi dinleyebileceklerdir.

İleri Tarihli Ders Ayarlama

Eğer ileri tarihli bir canlı ders planı yapmak istiyorsanız. Onun için yapmanız gereken aşağıdaki resimdeki gibi Schudele (program) tıklayınız ve ders tarih ve saatini ayarlayınız. Password onay kutusundaki işareti kaldırırsanız Moodle içinde öğrencilerinizle paylaştığınız link ile öğrencileriniz daha kolay erişim sağlayacaktır.

Zoom İlave Ayarlar
Zoom İlave Ayarlar 34

Bağlantı adresini kopyalayın ve katılımcılara iletin.

Zoom İlave Ayarlar
Zoom İlave Ayarlar 35
Zoom İlave Ayarlar
Zoom İlave Ayarlar 36

Zoom uygulaması nedir

Zoom uygulaması nedir ve ne işe yarar ve tarihçesi?

Zoom Tarihçesi

Zoom, 2011 yılında Cisco Systems ve WebEx ortaklığıyla kuruldu. Kurucuları arasında şirketin Ceo’su konumunda olan Çin Kökenli Amerikan iş insanı Eric Yuan da yer almaktadır. Yuan, şirketi kurmadan önce Amerikan teknoloji devi Cisco Systems’in mühendislik biriminin başkan yardımcılığı görevindeydi.

Şimdilerde yeni tip Koronavirüs nedeniyle tüm dünyada kullanılan popüler uygulama, ancak kurulduktan 2 yıl sonra, 2013 yılında, gerçek anlamda hizmet vermeye başlamıştır. Aynı yılın Mayıs ayında ise kullanıcı sayısının 1 milyon çıkarmıştır.

2015 yılında ise Zoom’un kullanıcı sayısı 40 milyona ulaşmıştır. Şirket 2019 yılında halka arz edildi ve piyasa değeri 16 milyar dolara yükseldi.  Şirket ilk zamanlar B2B alanında ortak çalışma konusunda yazılım sağlayıcı kuruluşlarla ortaklıklar kurmuştur. Mesela şirket o dönemde Teambox olarak bilinen Redbooth ile kurduğu ortaklık sonucu Redbooth’un video özelliği kazanmasını sağlamıştır.

Bu ortaklıktan kısa bir süre sonra Zoom; Logitech, Vaddio, ve InFocus gibi birden fazla donanım ve yazılım satıcısı ile ortaklık kurmuş ve akabinde “Zoom ile Uyumlu” adı altında bir program başlatmıştır. Şirket, altyapısını 2019 yılında işverenlere uzaktan video görüşme sağlayan Interview Stream ile uyumlu hale getirmeyi başarmıştır. Böylece Interview Stream, Zoom’un video hizmetlerini kullanarak video görüşme konusunda sunduğu imkanları genişletme imkanı bulmuştur. Fakat Zoom’u asıl popüler hale getiren; Çin’de başlayan yeni tip Koronavirüs salgınının tüm dünyaya yayılması olmuştur. Hatta Kovid-19’un tüm dünyayı sarmasıyla Zoom’un piyasa değeri arasında doğru bir orantı vardır demek yanlış olmaz.

Zoom Nedir?

Dünyayı ve Türkiye’yi saran Corona virüsü salgını sebebiyle evinden ya da uzaktan çalışan iş insanları ve öğretmenler için Zoom uygulamasını gündeme geldi. İnsanların evden çalışmaya başlaması ile birlikte ise online toplantılar yapabileceğiniz Zoom gibi uygulamalar kısa süre içinde oldukça popüler uygulamalara dönüştü. Peki Zoom uygulaması nedir?

Zoom, web tabanlı bir video konferans aracıdır. Kullanıcıların video ile veya video olmadan çevrimiçi bir araya gelmelerini sağlar ve ayrıca bir masaüstü istemcisi ve bir mobil uygulaması vardır. Kullanıcılar toplantıları kaydedebilir, ekranları paylaşabilir ve projelerde işbirliği yapabilir. Kısacası Zoom, özellikle oda konferans sistemleri ile modern kurumsal video iletişimi alanında dünya çapında liderdir. Zoom.us, işletmelere video ve sesli konferans, işbirliği ve web semineri barındırma için kolay ve güvenilir bir bulut platformu sağlar.

Zoom; mobil cihazlar (akıllı telefon, tablet vs.), masaüstü cihazlar (laptop, pc vs.), telefonlar ve oda sistemleri arasında video ve sesli konferans, telefon sistemi, sohbet ve web seminerleri hizmeti sunan bir iletişim uygulamasıdır.

Zoom online olarak görüşmeler, toplantılar, eğitimler, online dersler yapabileceğiniz bir platformdur. İster uygulamasını indirip, isterse tarayıcı üzerinden hem mobil ve tablet cihazlarında hem bilgisayarlarda çalışma yapabilirsiniz. Zoom uygulaması dünya üzerine yapılan araştırmalar sonucu en iyi 200 eğitim-öğretim aracı listesine girmiştir. Zoom hem mobil cihazlarınızdan hem de bilgisayarlardan sesli veya görüntülü görüşme, online ders verme, online ders alma aracıdır. 

Son zamanlarda artan online ders platformları araştırmaları sonucunda, hem eğitimciler için hemde öğrenciler için fayda sağlamak için bu içeriği hazırladık. Ders veren öğretmenlerin derslerine online bir şekilde devam edebilmesi ve ders alan öğrencilerin online eğitimle derslerine devam edebilmesi için yaptığımız araştırmalar sonucunda en verimli uygulamanın zoom olduğunu tespit ettik. Zoom uygulaması ile evinde online olarak ders verebilir veya online olarak ders alabilirsiniz. Üstelik ister birebir – ister grup halinde dersler yapabilirsiniz. 

Kullanması oldukça kolay olan zoom, uzaktan eğitim süreçlerinde ve evden çalışanların video konferans yapabilmesi için yararlı bir uygulamadır.

Zoom programı kullanılarak yapılan video konferanslarına Zoom Cloud Meeting denir. Katılımcılar zoom hesabı olmadan da görüşmelere katılabilmektedir. Zoom uygulaması yalnızca şirketler için değil aynı zamanda çalışanlar, müşteriler, öğrenciler arasında da yapılacak görüşmeler için de pratik kullanıma sahiptir. Zoom uygulamasını kullanmak için illa kullanacağınız cihaza indirmenize gerek yoktur. Görüşmenin olacağı linke sahip olmanız, sizin görüşmeye rahatlıkla katılabilmenize olanak tanıyacaktır.

Zoom Özellikleri / Ürünleri

Zoom’un sağladığı imkanlar daha doğrusu Zoom’un başlıca ürünleri / özellikleri şunlardır;

  • Meeting (Toplantı)
  • Video Webinar
  • Conference Rooms (Konferans Odası)
  • Phone System (Telefon İletişimi)
  • Chat (Mesajlaşma)

Zoom Meetings (Toplantı)

Birden fazla katılımcıyla gerçek zamanlı sesli ve görüntülü iletişim gerçekleştirmek, içerik paylaşımı yapmak, kurumsal video konferans gerçekleştirmek, eğitim vermek, ders anlatmak, sunum yapmak vs. için Zoom Meetings adlı özellik / ürün kullanılmaktadır. Zoom’un, Meetings özelliği sayesinde toplantı sırasında katılımcılarla ekranınızı paylaşabilirsiniz. Hatta beyaz tahta üzerinde ders anlatabilir veya sunum yapabilirsiniz.

Zoom Video Webinar

Video Webinar özelliği sayesinde canlı sanal etkinlikler ve orta seviye bir kalabalığa yayın gerçekleştirmek mümkün. Zoom’un bu özelliğini kullanarak çok farklı lokasyonlardaki birden fazla katılımcıya online seminer verebilirsiniz.

Zoom Conference Rooms (Konferans Odası)

Zoom Conference Rooms, en iyi görüntülü konferans odası deneyimini sunar. Bu özellik sayesinde bir tık ile görüntülü toplantılara katılabilir veya konferans salonlarına dâhil olabilirsiniz. Aynı zamanda birden fazla masaüstünü aynı odada kolayca açmanıza olanak tanır. Kısacası Konferans Odası özelliği konuklarınız ve/veya ağınızdaki kişiler için çeşitli basit ve kablosuz paylaşım seçenekleri sunar.

Zoom Phone System (Telefon İletişimi)

Telefonunuzla yapacağınız; sohbeti, toplantıları ve videolu görüşmeleri bu platform sayesinde gerçekleştirebilirsiniz. Zira Zoom, yeni nesil ve çoklu seçenek sunan bir telefon sistemi deneyimi sunar.

Zoom Chat (Mesajlaşma)

İster kişisel ister kurumsal fark etmez, Zoom Chat sayesinde genel veya özel kanallar oluşturup ekibinizle iletişim kurabilirsiniz. Bu özellik aynı zamanda ekibinizle dosya, emoji, ekran görüntüsü gibi bilgi paylaşımını gerçek zamanlı yapmanızı sağlar.

ZOOM PROGRAMI GÜVENLİ Mİ?

BBC’de yayınlanan bir haberde, Zoom’un zayıf görülen noktaları şöyle sıralanıyor:

Zoom toplantısını başlatan kişi, katılımcıların aktivitelerini izleyebiliyor, Zoom pencereleri nerede aktif nerede değil görebiliyor

Uygulama ayrıca, yöneticilere kullanıcıların aktiviteleriyle ilgili ayrıntılı performans
değerlendirmesi yapabiliyor, toplantı süreleri ve sayısı temelinde sıralama görebiliyor

Bir kullanıcı Zoom aracılıyla herhangi bir konuşmayı kaydediyorsa, yöneticiler bu içeriğe erişebilir

Bir toplantı devam ederken veya bittiğinde yöneticiler her bir katılımcının işletim sistemi, IP adresi ve konum verisi, chat bilgisini görebiliyor.

Elbette Zoom’un ispatlanabilmiş bir güvenlik zaafiyeti bulunmuyor; ancak ortada önemsenecek derecede birçok güvenlik riskinin bulunduğu da açık.

Zoom Uygulaması Ücretli mi?

  • Zoom uygulamasının hem ücretli hem ücretsiz paketleri bulunmaktadır. Programı ücretsiz bir şekilde kullanabilirsiniz ancak bazı özellikle ücretsiz pakette kısıtlamaya tabi tutulmuştur.
  • Zoom uygulamasının ücretsiz paketi ile sınırsız görüşme yapabilirsiniz. Ama bu görüşmelere en fazla 100 kişi katılabilmektedir ve bu görüşmeleri kayıt alma imkânı yoktur.

Not: Zoom uygulaması ile birebir yapılan görüşmelerde zaman kısıtlaması yoktur ama görüşmeler ikiden fazla ise ücretsiz pakette bağlantı süresi 40 dakika ile sınırlandırılmıştır ve 40 dakika sonunda bağlantıyı tekrar kurmanız gerekmektedir.


Zoom Bigisayar Tablet

Zoom, Bigisayar, Tablet ve Cep Telefonlarına Nasıl İndirilir ve Kurulur?

Zoom uygulaması ücretsiz indirme, programı yükleme, kayıt ve giriş işlemleri için aşağıdaki adımları takip etmeniz gerekmektedir;

Zoom Meeting bilgisayara nasıl indirilir?

  • Zoom uygulamasını kullanmak için Zoom Meetings’in zoom.us internet sitesine tıklıyoruz.
Zoom Bigisayar Tablet
Zoom, Bigisayar, Tablet ve Cep Telefonlarına Nasıl İndirilir ve Kurulur? 46
  • Karşımıza çıkan sayfada Sing Up Free seçeneğine tıklayıp, çıkan ekrana doğum tarihimizi yazıp continue butonuna tıklıyoruz.
Zoom Bigisayar Tablet
Zoom, Bigisayar, Tablet ve Cep Telefonlarına Nasıl İndirilir ve Kurulur? 47
  • Karşımıza çıkan sayfada Sing Up Free seçeneğine tıklayıp, çıkan ekrana e-posta adresimizi yazıyoruz.
Zoom Bigisayar Tablet
Zoom, Bigisayar, Tablet ve Cep Telefonlarına Nasıl İndirilir ve Kurulur? 48
  • Mail adresimize bir Email gelece bu emaili açıyoruz
Zoom Bigisayar Tablet
Zoom, Bigisayar, Tablet ve Cep Telefonlarına Nasıl İndirilir ve Kurulur? 49
  • Mail adresine gelen doğrulama linkine (Activite Account) tıklıyoruz.
Zoom Bigisayar Tablet
Zoom, Bigisayar, Tablet ve Cep Telefonlarına Nasıl İndirilir ve Kurulur? 50
  • sonra Zoom’un web sayfasına yönlendiriliyoruz. Çıkan sayfada üye bilgilerini doldurduktan sonra Continue butonu ile üyeliğimizi tamamlıyoruz.
Zoom Bigisayar Tablet
Zoom, Bigisayar, Tablet ve Cep Telefonlarına Nasıl İndirilir ve Kurulur? 51
  • Hesabınıza eğer @edu.tr uzantılı bir eposta adresiyle kayıt yaptırdıysanız, bir okul adına kullanım açabilirsiniz. Bu noktada Zoom @k12 formatında bir alan adı ya da eposta adresi bekleyebilir. Kişisel hesap açmayı tercih ettiyseniz bu alanı tercihinize göre seçip geçebilirsiniz.
  • Açılan “Invite Your Colleagues” sayfasında arkadaşlarınızı davet edebilir veya altta yer alan “Skip This Step” (Bu aşamayı atla) butonuna tıklayarak bu aşamayı atlayabilirsiniz.
  • Bu arada mail adresinizi doğrulamanız akabinde “download & run zoom” ifadesiyle karşılaşacaksınız. Bu ifade Zoom’u masaüstü cihazınıza (PC, Laptop vs.) indirmeniz anlamına geliyor. Eğer hali hazırda Zoom üyeliğiniz varsa ama uygulama cihazınızda yüklü değilse buraya tıklayarak Download Center sayfasına direkt ulaşabilirsiniz.

Evet, Zoom’a üye olduğunuza ve Zoom’u masaüstü/mobil cihazınıza indirdiğinize göre artık Zoom kullanmak için hazırsınız!

Zoom Meeting Cep Telefonu veya Tabletlere nasıl indirilir?

Zoom uygulamasını Google Play ve Apple Store’dan indirilebiliyor. Program ücretsiz ancak daha büyük toplantılar başlatmak gibi ek seçeneklere ücret ödemesi gerekebiliyor.
PLAY STORE İNDİRME LİNKİ İÇİN TIKLAYINIZ

APP STORE İNDİRME LİNKİ İÇİN TIKLAYINIZ

Kayıt işlemlerini tamamladıktan soran ekranın sağ üst köşesinde bulunan kişi sembolüne tıklayarak profilinizi görüntüleyip, istediğiniz gibi düzenleyebilirsiniz.

Zoom Bigisayar Tablet
Zoom, Bigisayar, Tablet ve Cep Telefonlarına Nasıl İndirilir ve Kurulur? 52

Profil bilginize sınırsız şekilde maksimum 100 kişi katılımlı
ve 40 dakika uzunluğuna sahip toplantılar düzenleyebileceğiniz bilgisini görebilmektesiniz


Android SharedPreferences Kullanımı

Android SharedPreferences Kullanımı

SharedPreferences Kullanımı

Android’te 5 farklı veri saklama yolu vardır. Bunlardan biri Shared Preferences’tir.

Öncelikle buna neden ihtiyaç duyduğumuzu açıklayalım.

Biliyorsunuz ki bazen uygulamalarımızda verileri saklamak isteriz fakat bu verileri değişkenlerde saklayamayız çünkü uygulamayı kapattığımız anda o verilerde silinmekte. Tabii ki akıllara hemen ikinci seçenek olan veritabanı oluşturup verileri orada tutmak geliyor.

Sqlite ile bir veri tabanı oluşturmak. Ancak bu yöntem küçük verilerin saklanması için oldukça zahmetlidir.

Küçük verilerin saklanması için bir veri tabanı ne kadar uygun değilse büyük verilerin saklanması için de SharedPreferences kullanmak o kadar uygun değildir.Shared preferences ile önemli verileri saklamamalısınız. Bunun yerine önemi fazla olmayan verileri saklamanız uygulamanın sağlığı açısından çok daha iyi olacaktır.

İşte böyle durumlarda Key-value mantığı ile çalışan Shared Preferences imdadımıza yetişir ve bize pratiklik kazandırır. Genelde programların ayarlar bölümündeki veriler ve seçenekler bu yol ile kaydedilmektedir.

Nedir bu SharedPreferences?

Sharedpreferences üstte anlattığım durumundan bizi kurtarmak için tasarlanmış bir Sınıf. Bu sınıf bize çeşitli kullanıcı ayarlarını veya en yüksek skor vb  değerleri saklama, kullanma ya da gerektiğinde değiştirebilme gibi imkanlar sağlıyor. Üstelik programı kapatsak bile sakladığımız veriler kaybolmuyor.

SharedPreferences HashMap yani key-value ( anahtar-değer) şeklinde çalışan bir yapısı vardır. Çalışma şekli verileri bir xml dosyası içine kaydeder ve biz bir değer istediğimiz zaman bu xml dosyasından okuyarak bize getirir.

Peki Bu Veriler Nerede ve Nasıl Saklanıyor?

SharedPreferences ile oluşturduğumuz veriler kullandığımız android cihazımızda xml dosyası olarak depolanmakta. Uzantısı tam olarak şöyle, bu yazıda biz Ayarlar olarak tanımladığımız için Ayarlar olarak saklanıyor.:

/data/data/PAKET_ADI/shared_prefs/Ayarlar.xml

SharedPreferences’in içinde String, Int, Boolean, Float, Long tipinde değerler depolanabilir. Uygulama kapansa dahi kaydedilen bu değerler silinmez veya kaybolmaz.

SharedPreference uygulamaya özeldir. Yani izin verilmediği sürece diğer uygulamalar bu içeriğe ulaşamaz.

Kodlamaya geçmeden önce metotlarımızı tanıyalım

setSharedPreference metodu ile istediğimiz veriyi gönderdiğimiz parametreler ile saklayabiliriz.

getSharedPreference daha önce kaydedilen bir veriyi kullanmak istediğimiz zaman kullanırız.

clearSharedPreference metodu ile kaydedilen verilerin temizleme işlemi yapılır.

removeSharedPreference gönderdiğimiz key ile kaydedilen bir verinin kaldırılma işlemi yapılır.

putString String bir veri saklamak için kullanılır. Saklanacak verinin tipine göre değişir.

Yavaş yavaş başlayalım;

Projeye Dahil Etme

import android.content.SharedPreferences;

SharedPreferences Nesnesini Oluşturma

Kütüphanemizi import ettikten sonra bir adet nesne oluşturuyoruz:

SharedPreferences ayarSP= getSharedPreferences("Ayarlar", Context.MODE_PRIVATE);

ayarlar_1 isminde bir nesne oluşturduk. İlk parametrede  verilerin cihazımızda hangi isimle tutulacağını yazıyoruz. Mesela ben Ayarlar kullandık. İkinci değer’e ise Context.MODE_PRIVATE yazıyoruz, bunu yazmamızın sebebi dışarıdan erişilmesini engellemek ve güvenli hale getirmek.

Burada şuna karar vermemiz gerekiyor. Sakladığımız bilgilere sadece bulunduğumuz activity’den mi yoksa uygulamamızdaki herhangi bir aktivity’den mi ulaşağız.

Eğer sadece verilerin kaydedildiği activity’den ulaşacaksak;

SharedPreferences ayarSP= context.getPreferences(context.getPackageName(), Context.MODE_PRIVATE);
SharedPreferences ayarSP= this.getPrefer
ences(Context.MODE_PRIVATE);

Bilgilere uygulamamızdaki herhangi bir activity’den ulaşacaksak;

SharedPreferences ayarSP= context.getSharedPreferences(context.getPackageName(), Context.MODE_PRIVATE);
SharedPreferences ayarSP= getSharedPreferences(Ayarlar,MODE_PRIVATE);

kodlarını kullanarak izin alıyoruz.

Yani getPreferences yerine getSharedPreferences kullanıyoruz ve her bir tercihimize ad konulmuş olmalı.

Kayıt Okumak

SharedPreferences ayarSP= getSharedPreferences(Ayarlar,MODE_PRIVATE);
String adiString = sharedPref.getString("adi","Kayıt Yok");
int noInt = sharedPref.getInt("numara",0);
Boolean kabulBoolean= sharedPref.getBoolean("kabulmu",false);

En üstte oluşturduğumuz ayarlar nesnesini kullanarak ulaşmak istediğiniz değişkenin türünü seçip(getInt), birinci parametreye sakladığımız key’in adını, ikinci parametreye ise eğer öyle bir key yoksa geriye döndüreceği default değeri yazıyoruz.

Kayıt Eklemek

Oluşturduğumuz preference’e bir veri eklemek istiyoruz. Örnek vermek gerekirse numara isminde bir key oluşturup ona bir değer yazmak istiyoruz. Bunun için ilk önce SharedPreferences.Editor kullanmamız gerekiyor, editor’u oluşturalım:

  SharedPreferences.Editor editor = ayarSP.edit(); 

editor oluşturduktan sonra artık ayarSP isimli SharedPreference‘mize veri ekleyebilir/değişebilir/silebiliriz. Şimdi numara key’i oluşturup bir değer girelim 

int girilenNumara= 200;
editor.putInt("numara", girilenNumara);

Gördüğünüz üzere editor nesnesini kullanarak putInt ile birlikte numara key‘ine değerimizi eklemiş olduk. Tabi siz dilerseniz putInt yerine ihtiyacınız olan başka birşey de kullanabilirsiniz. Boolean değer tutacaksanız putBoolean, String tutacaksanız putString kullanabilirsiniz. Son olarak yaptığımız bu değeri kaydetmek kaldı. Bunun için de yazdığımız kodun altına şunu ekliyoruz:

editor.commit();

kodları toparlarsak, değer okuma işlemi;

SharedPreferences ayarSP= getSharedPreferences(Ayarlar,MODE_PRIVATE);
  SharedPreferences.Editor editor = ayarSP.edit(); 
  int girilenNumara= 200;
  String adi= "nurullah";
  Boolean onay= true;
  editor.putInt("numara",girilenNumara); //int değer ekleniyor
  editor.putString("adi",adi); //string değer ekleniyor
  editor.putBoolean("kabulmu",onay); //boolean değer ekleniyor
  editor.commit(); //Kayıt

veya

SharedPreferences sharedPreferences;
sharedPreferences=this.getSharedPreferences("Ayarlar", Context.MODE_PRIVATE);
String adiEkle= editText.getText().toString();
sharedPreferences.edit().putString("adi",adiEkle).apply();

Kayıt Silme (Tamamını Silme)

SharedPreferences ayarSP= getSharedPreferences(Ayarlar,MODE_PRIVATE);
//SharedPreferences ayarSP= context.getSharedPreferences(Ayarlar,Context.MODE_PRIVATE);
        SharedPreferences.Editor editor=settings.edit();
        editor.clear();
        editor.commit();

Kayıt Değiştirme

Diyelim numara kısmını değiştirmek istiyoruz. Bunun için üstte yazdığımız gibi SharedPreference.Editor kullanmamız gerekiyor, tabi editor nesnesin çalışabilmesi için SharedPreference nesnesini de oluşturmayı unutmayın:

SharedPreferences ayarSP= getSharedPreferences(Ayarlar,MODE_PRIVATE);
SharedPreferences.Editor editor=settings.edit();

editor isminde bir Editor nesnesi oluşturduk. Artık ayarlar Preferences’in deki değişkenleri istediğimiz gibi değiştirebiliriz.

int girilenNumara= 234;
editor.putInt("numara", girilenNumara);

Gördüğünüz üzere daha önce veri girdiğimiz numara key’ini putInt diyip key ismini ve değişecek değeri yazdık. Böylece önceki değeri güncellemiş olduk. Tabi güncellemenin kaydedilmesi için commit etmemiz gerekiyor.

editor.commit();

commit() fonksiyonu ile verilerimizi başarılı bir şekilde değiştirmiş oluyoruz.

Kayıt Silme (Seçilen Kayıtları Silme)

Diyelim artık oluşturduğumuz numara isimli key‘e ihtiyacımız yok ve silmek istiyoruz. Bunun için SharedPreference nesnesi ve editor nesnesi gerekiyor. Bu nesnelerin üstte nasıl oluşturulduğu yazıyor. Silmek için editor’ü kullanıp remove fonksiyonu’na hangi isimli key’i sileceğimizi yazıp commit‘liyoruz.

SharedPreferences ayarSP= getSharedPreferences(Ayarlar,MODE_PRIVATE);
SharedPreferences.Editor editor=settings.edit();
editor.remove("numara");
editor.commit();

veya

sharedPreferences.edit().remove("numara").apply();

Aşağıda SharedPreferences ile ilgili bi kaç tablo verdikten soran kodlamaya geçelim.

ParametreAçıklama
MODE_PRIVATEVerilerin tutulduğu dosyaya sadece uygulamamız erişebilir.
MODE_WORLD_READABLE Verilerin tutulduğu dosyayı cihazdaki tüm uygulamalar okuyabilir.
MODE_WORLD_WRITEABLE Verilerin tutulduğu dosyayı cihazdaki tüm uygulamalar okuyabilir ve yazabilir.
MODE_APPENDeni kaydedilen verileri mevcut verilen üzerine yazar.
MODE_ENABLE_WRITE_AHEAD_LOGGINGVeritabanı açık bayrağı. Veritabanına yazmayı, logine esnasında mümkün kılar.
MODE_MULTI_PROCESS SharedPreferences objesi yüklenmiş olmasına rağmen tercihlerdeki değişiklikleri kontrol eden metottur

MetotlarAçıklama
SharedPreferences.contains()Girilen isimde bir preference içerip içermediğini kontrol eder
SharedPreferences.edit()Editör’ü çağırarak preference üzerinde istediğimiz değişiklikleri gerçekleştiririz
SharedPreferences.getAll()Preference’daki tüm verilere (anahtar/değer) ulaşırız.
SharedPreferences.getBoolean()Tercih dosyasındaki boolean tipi değerleri getirir. İki parametre alır. İlk parametre Strink key değeri yani istediğimiz değerin anahtarını, ikinci parametrede ise döndürülecek değer.
SharedPreferences.getFloat()Tercih dosyasındaki float tipi değerleri getirir. İki parametre alır. İlk parametre Strink key değeri yani istediğimiz değerin anahtarını, ikinci parametrede ise döndürülecek değer.
SharedPreferences.getInt()Tercih dosyasındaki int tipi değerleri getirir. İki parametre alır. İlk parametre Strink key değeri yani istediğimiz değerin anahtarını, ikinci parametrede ise döndürülecek değer.
SharedPreferences.getLong()Tercih dosyasındaki long tipi değerleri getirir. İki parametre alır. İlk parametre Strink key değeri yani istediğimiz değerin anahtarını, ikinci parametrede ise döndürülecek değer.
SharedPreferences.getString()Tercih dosyasındaki string tipi değerleri getirir. İki parametre alır. İlk parametre Strink key değeri yani istediğimiz değerin anahtarını, ikinci parametrede ise döndürülecek değer.
SharedPreferences.getStringSet()Tercih dosyasındaki Set<string> tipi değerleri getirir. İki parametre alır. İlk parametre Strink key değeri yani istediğimiz değerin anahtarını, ikinci parametrede ise default olarak döndürülecek değer.

KomutAçıklama
SharedPreferences.Editor.clear()Tüm tercihleri kaldırır.
SharedPreferences.Editor.remove()Belirli tercihleri kaldırır.
SharedPreferences.Editor.putBoolean()Boolean veri tipli bir tercih oluşturur. İki parametre alır. İlk parametremiz adlandırılan String değerli tercihimiz, ikincisi default değerimiz.
SharedPreferences.Editor.putFloat()Float veri tipli bir tercih oluşturur. İki parametre alır. İlk parametremiz adlandırılan String değerli tercihimiz, ikincisi default değerimiz.
SharedPreferences.Editor.putInt()int veri tipli bir tercih oluşturur. İki parametre alır. İlk parametremiz adlandırılan String değerli tercihimiz, ikincisi default değerimiz.
SharedPreferences.Editor.putLong()Long veri tipli bir tercih oluşturur. İki parametre alır. İlk parametremiz adlandırılan String değerli tercihimiz, ikincisi default değerimiz.
SharedPreferences.Editor.putString()String veri tipli bir tercih oluşturur. İki parametre alır. İlk parametremiz adlandırılan String değerli tercihimiz, ikincisi default değerimiz.
SharedPreferences.Editor.putStringSet()Set<String> veri tipli bir tercih oluşturur. İki parametre alır. İlk parametremiz adlandırılan String değerli tercihimiz, ikincisi default değerimiz.
SharedPreferences.Editor.commit()Tüm değişikliklerimizi işler.
SharedPreferences.Editor.apply()Commit() metodu gibi işleve sahiptir ancak apply metodu yazma işlemi yapana kadar beklemez ve akış yoluna devam eder ve boolean değer döndürmez

Şimdi programlamaya geçersek;

Aşağıda anlatılanlara ilişkin örnek mevcuttur, bu örneğin kodlarını

BURADAN github bağlantısından indirebilirsiniz.

activity_sharedpreferences_deneme.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SharedPreferencesDeneme">

    <LinearLayout
        android:id="@+id/layoutA"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="50dp"
        android:gravity="center"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <EditText
            android:id="@+id/editTextad"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="isim gir" />

        <EditText
            android:id="@+id/editTextyas"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:hint="Yaş gir" />

        <CheckBox
            android:id="@+id/CheckBoxonay"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:checked="false"
            android:text="Onaylıyor musunuz?" />

        <Button
            android:id="@+id/button_Kaydet"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Kaydet" />

        <Button
            android:id="@+id/button_oku"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Oku" />

        <Button
            android:id="@+id/button_tamamini_sil"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Tamamını Sil" />

        <Button
            android:id="@+id/button_secileni_sil"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="Sadece İsimi SİL" />

    </LinearLayout>

</androidx.constraintlayout.widget.ConstraintLayout>
SharedPreferencesDeneme.class
package com.mobilprogramlar.sharedpreferenceskullanm;
import androidx.appcompat.app.AppCompatActivity;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.Toast;

/*
www.ossmatematik.com.tr
www.mobilprogramlar.com
https://github.com/netmatematiknet/SharedpreferencesKullanimi.git
*/

public class SharedPreferencesDeneme extends AppCompatActivity {
    int yas2;
    String ad2;
    Boolean onay2;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sharedpreferences_deneme);

        final SharedPreferences sharedPrefNT = getSharedPreferences("Ayarlar", MODE_PRIVATE);

        final EditText adEditText = findViewById(R.id.editTextad);
        final EditText yasEditText = findViewById(R.id.editTextyas);
        final CheckBox onayCheckBox = findViewById(R.id.CheckBoxonay);
        final Button kaydetBtn = findViewById(R.id.button_Kaydet);
        final Button okuBtn = findViewById(R.id.button_oku);
        final Button silTamaminiBtn = findViewById(R.id.button_tamamini_sil);
        final Button silSecileniBtn = findViewById(R.id.button_secileni_sil);

        kaydetBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String ad = adEditText.getText().toString();
                String yas = yasEditText.getText().toString();

                if (!ad.matches("")){
                    sharedPrefNT.edit().putString("isim", ad).apply();
                    //veya
                    //SharedPreferences.Editor editor = sharedPrefNT.edit();
                    //editor.putString("isim",ad);
                    //editor.apply();
                }
                if (!yas.matches("")){
                    int yas1 = Integer.parseInt(yas);
                    sharedPrefNT.edit().putInt("yas", yas1).apply();
                }
                if(onayCheckBox.isChecked()) {
                    boolean onay=true;
                    sharedPrefNT.edit().putBoolean("Onaylama", onay).apply();
                }else{
                    boolean onay=false;
                    sharedPrefNT.edit().putBoolean("Onaylama", onay).apply();
                }


            }
        });
        okuBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                ad2 = sharedPrefNT.getString("isim",null);
                yas2 = sharedPrefNT.getInt("yas",0);
                onay2 = sharedPrefNT.getBoolean("Onaylama",false);
                Toast.makeText(getApplicationContext(),"isim:"+ad2+" yas:"+yas2+" Onaylama:"+onay2,Toast.LENGTH_SHORT).show();
            }
        });
        silTamaminiBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sharedPrefNT.edit().clear().apply();
                //veya
                //SharedPreferences.Editor editor=sharedPrefNT.edit();
                //editor.clear().apply();
                Toast.makeText(getApplicationContext(),"Tüm Kayıtlar SİLİNDİ",Toast.LENGTH_SHORT).show();
            }
        });
        silSecileniBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                sharedPrefNT.edit().remove("isim").apply();
                //veya
                //SharedPreferences.Editor editor=sharedPrefNT.edit();
                //editor.remove("isim").apply();
                Toast.makeText(getApplicationContext(),"Sadece İsim SİLİNDİ",Toast.LENGTH_SHORT).show();
            }
        });

    }
}

SharedPreferences’i de global alanda tanımlıyoruz. Bunları global alanda tanımlamamızın nedeni, sadece onCreate metodu içerisinde değil, buton nesnesinin onClick olayında da kullanacak olmamızdan kaynaklanıyor.

Ve sharedPreferences ile “isim” anahtar kelimesine kaydettiğimiz veriyi ad adında oluşturmuş olduğumuz string değişken içerisine çekiyoruz. Aldığı paramatrelerden 1.si anahtar kelime, 2.si ise eğer “isim” anahtar kelimesinin içerisi boşsa, yerine yazılacak default ifade anlamına gelmektedir. Ben eğer “isim” anahtar kelimesinin içerisi boşsa, default değer almasını istemiyorum. Null(boş) olmasını istiyorum.

Floating Action Button

Floating Action Button (FAB) Nasıl Yapılır

Floating Action Button Nedir?

Malzeme Tasarımında tanıtılan yeni bir bileşen Floating Action Button (nedir).Sağ alt kısımdaki UI’nin üzerinde yüzen yüksek dairesel bir görünüştür. Genellikle, ekranın en önemli eylemini vurgulayan farklı görseliyle dikkat çeker.

Floating Action Button

 

Bu nispeten basit eğitimde Web de genelde Lolipop öncesi örnekler mevcut ama Google ın getirdiği Api 26 zorunluluğu ile artık bütün apk ların yenilenmesi gerekmekte.

Floating action buttons (Kayan eylem düğmeleri) FAB, tanıtılan bir eylem için kullanılır. UI’nin üzerinde yüzen daire içine alınmış bir simge ile ayırt edilirler ve değişim, başlatma ve aktarma çapa noktası içeren hareket davranışları vardır. – Materyal Tasarımı kaynağı

Gradle ayarlarını aşağıdaki altı çizili yerlerden belirtilen değerlere göre ayarlayalım.

Floating Action Button

 

Api leri ise yine aşağıdaki şekiilerdeki gibi …

Floating Action Button

 

Floating Action Button

 

Geldik dosyalara, önce activity_main

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_weight="1"
    tools:context=".MainActivity">

    <RelativeLayout
        android:background="@color/background"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent">

        <com.mobilprogramlar.floadnt.FloatingActionButton
            android:id="@+id/pink_icon"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:fab_colorNormal="@color/pink"
            app:fab_icon="@drawable/ic_fab_star" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/pink_icon"
            android:text="Text below button"
            android:layout_centerHorizontal="true"
            style="@style/menu_labels_style"
            android:layout_marginBottom="48dp"/>

        <com.mobilprogramlar.floadnt.AddFloatingActionButton
            android:id="@+id/semi_transparent"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="16dp"
            app:fab_colorNormal="@color/blue_semi_transparent"
            app:fab_colorPressed="@color/blue_semi_transparent_pressed"
            app:fab_plusIconColor="@color/white"
            />
        <com.mobilprogramlar.floadnt.FloatingActionButton
            android:id="@+id/setter"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_above="@id/semi_transparent"
            android:layout_centerHorizontal="true"
            android:layout_marginBottom="16dp" />

        <com.mobilprogramlar.floadnt.AddFloatingActionButton
            android:id="@+id/normal_plus"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            app:fab_colorNormal="@color/white"
            app:fab_colorPressed="@color/white_pressed"
            app:fab_plusIconColor="@color/half_black"
            android:layout_alignParentBottom="true"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_marginBottom="16dp"
            android:layout_marginLeft="16dp"
            android:layout_marginStart="16dp"/>

        <com.mobilprogramlar.floadnt.FloatingActionsMenu
            android:id="@+id/right_labels"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginStart="16dp"
            android:layout_weight="1"
            app:fab_addButtonColorNormal="@color/white"
            app:fab_addButtonColorPressed="@color/white_pressed"
            app:fab_addButtonPlusIconColor="@color/half_black"
            app:fab_addButtonSize="mini"
            app:fab_labelStyle="@style/menu_labels_style"
            app:fab_labelsPosition="right"
            android:layout_alignParentLeft="true"
            android:layout_alignParentStart="true"
            android:layout_above="@id/normal_plus"
            android:layout_marginLeft="16dp">

            <com.mobilprogramlar.floadnt.FloatingActionButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:fab_colorNormal="@color/white"
                app:fab_colorPressed="@color/white_pressed"
                app:fab_title="Label on the right" />

            <com.mobilprogramlar.floadnt.FloatingActionButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:fab_colorNormal="@color/white"
                app:fab_colorPressed="@color/white_pressed"
                app:fab_size="mini"
                app:fab_title="Another one on the right" />

        </com.mobilprogramlar.floadnt.FloatingActionsMenu>

        <!-- -->

        <com.mobilprogramlar.floadnt.FloatingActionsMenu
            android:id="@+id/multiple_actions"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            app:fab_addButtonColorNormal="@color/white"
            app:fab_addButtonColorPressed="@color/white_pressed"
            app:fab_addButtonPlusIconColor="@color/half_black"
            app:fab_labelStyle="@style/menu_labels_style"
            android:layout_marginBottom="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginEnd="16dp">

            <com.mobilprogramlar.floadnt.FloatingActionButton
                android:id="@+id/action_a"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:fab_colorNormal="@color/white"
                app:fab_colorPressed="@color/white_pressed"
                app:fab_title="Action Aaaaa" />

            <com.mobilprogramlar.floadnt.FloatingActionButton
                android:id="@+id/action_b"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:fab_colorNormal="@color/white"
                app:fab_colorPressed="@color/white_pressed"
                app:fab_title="Action with a very long name that won't fit on the screen" />
        </com.mobilprogramlar.floadnt.FloatingActionsMenu>

        <!-- -->

        <com.mobilprogramlar.floadnt.FloatingActionsMenu
            android:id="@+id/multiple_actions_down"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentEnd="true"
            android:layout_alignParentTop="true"
            android:layout_marginTop="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginEnd="16dp"
            app:fab_addButtonColorNormal="@color/white"
            app:fab_addButtonColorPressed="@color/white_pressed"
            app:fab_addButtonPlusIconColor="@color/half_black"
            app:fab_addButtonSize="mini"
            app:fab_expandDirection="down"
            app:fab_labelStyle="@style/menu_labels_style">

            <com.mobilprogramlar.floadnt.FloatingActionButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:fab_colorNormal="@color/white"
                app:fab_colorPressed="@color/white_pressed"
                app:fab_size="mini" />

            <com.mobilprogramlar.floadnt.FloatingActionButton
                android:id="@+id/button_remove"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:fab_colorNormal="@color/white"
                app:fab_colorPressed="@color/white_pressed"
                app:fab_title="Click to remove" />

            <com.mobilprogramlar.floadnt.FloatingActionButton
                android:id="@+id/button_gone"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:fab_colorNormal="@color/white"
                app:fab_colorPressed="@color/white_pressed" />

            <com.mobilprogramlar.floadnt.FloatingActionButton
                android:id="@+id/action_enable"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:fab_colorNormal="@color/white"
                app:fab_colorPressed="@color/white_pressed"
                app:fab_title="Set bottom menu enabled/disabled" />
        </com.mobilprogramlar.floadnt.FloatingActionsMenu>

        <com.mobilprogramlar.floadnt.FloatingActionsMenu
            android:id="@+id/multiple_actions_left"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_toLeftOf="@+id/multiple_actions_down"
            android:layout_toStartOf="@+id/multiple_actions_down"
            android:layout_alignParentTop="true"
            app:fab_addButtonColorNormal="@color/white"
            app:fab_addButtonColorPressed="@color/white_pressed"
            app:fab_addButtonPlusIconColor="@color/half_black"
            app:fab_addButtonSize="mini"
            app:fab_addButtonStrokeVisible="false"
            app:fab_expandDirection="left"
            android:layout_marginTop="16dp"
            android:layout_marginRight="16dp"
            android:layout_marginEnd="16dp">

            <com.mobilprogramlar.floadnt.FloatingActionButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:fab_colorNormal="@color/white"
                app:fab_colorPressed="@color/white_pressed" />

            <com.mobilprogramlar.floadnt.FloatingActionButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                app:fab_colorNormal="@color/white"
                app:fab_colorPressed="@color/white_pressed"
                app:fab_size="mini" />

            <com.mobilprogramlar.floadnt.FloatingActionButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:visibility="gone"
                app:fab_colorNormal="@color/white"
                app:fab_colorPressed="@color/white_pressed"
                app:fab_size="mini" />
        </com.mobilprogramlar.floadnt.FloatingActionsMenu>

        <com.mobilprogramlar.floadnt.FloatingActionButton
            android:id="@+id/setter_drawable"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_above="@id/setter"
            android:layout_centerHorizontal="true" />
    </RelativeLayout>

</androidx.constraintlayout.widget.ConstraintLayout>

 

Sıra java kodlarında bize yardımcı 4 adet java dosyamız var;

AddFloatingActionButton

package com.mobilprogramlar.floadnt;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.Shape;
import android.util.AttributeSet;
import androidx.annotation.ColorRes;
import androidx.annotation.DrawableRes;

public class AddFloatingActionButton extends FloatingActionButton {
  int mPlusColor;

  public AddFloatingActionButton(Context context) {
    this(context, null);
  }

  public AddFloatingActionButton(Context context, AttributeSet attrs) {
    super(context, attrs);
  }

  public AddFloatingActionButton(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
  }

  @Override
  void init(Context context, AttributeSet attributeSet) {
    TypedArray attr = context.obtainStyledAttributes(attributeSet, R.styleable.AddFloatingActionButton, 0, 0);
    mPlusColor = attr.getColor(R.styleable.AddFloatingActionButton_fab_plusIconColor, getColor(android.R.color.white));
    attr.recycle();
    super.init(context, attributeSet);
  }

  public int getPlusColor() {
    return mPlusColor;
  }

  public void setPlusColorResId(@ColorRes int plusColor) {
    setPlusColor(getColor(plusColor));
  }

  public void setPlusColor(int color) {
    if (mPlusColor != color) {
      mPlusColor = color;
      updateBackground();
    }
  }

  @Override
  public void setIcon(@DrawableRes int icon) {
    throw new UnsupportedOperationException("Use FloatingActionButton if you want to use custom icon");
  }

  @Override
  Drawable getIconDrawable() {
    final float iconSize = getDimension(R.dimen.fab_icon_size);
    final float iconHalfSize = iconSize / 2f;

    final float plusSize = getDimension(R.dimen.fab_plus_icon_size);
    final float plusHalfStroke = getDimension(R.dimen.fab_plus_icon_stroke) / 2f;
    final float plusOffset = (iconSize - plusSize) / 2f;

    final Shape shape = new Shape() {
      @Override
      public void draw(Canvas canvas, Paint paint) {
        canvas.drawRect(plusOffset, iconHalfSize - plusHalfStroke, iconSize - plusOffset, iconHalfSize + plusHalfStroke, paint);
        canvas.drawRect(iconHalfSize - plusHalfStroke, plusOffset, iconHalfSize + plusHalfStroke, iconSize - plusOffset, paint);
      }
    };
    ShapeDrawable drawable = new ShapeDrawable(shape);
    final Paint paint = drawable.getPaint();
    paint.setColor(mPlusColor);
    paint.setStyle(Style.FILL);
    paint.setAntiAlias(true);
    return drawable;
  }
}

 

FloatingActionButton dosyası

package com.mobilprogramlar.floadnt;

import android.annotation.SuppressLint;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.LinearGradient;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.graphics.Rect;
import android.graphics.Shader;
import android.graphics.Shader.TileMode;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.ShapeDrawable.ShaderFactory;
import android.graphics.drawable.StateListDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.os.Build;
import android.os.Build.VERSION_CODES;
import android.util.AttributeSet;
import android.widget.ImageButton;
import android.widget.TextView;
import androidx.annotation.ColorRes;
import androidx.annotation.DimenRes;
import androidx.annotation.DrawableRes;
import androidx.annotation.IntDef;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.AppCompatImageButton;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

public class FloatingActionButton extends AppCompatImageButton {

  public static final int SIZE_NORMAL = 0;
  public static final int SIZE_MINI = 1;

  @Retention(RetentionPolicy.SOURCE)
  @IntDef({ SIZE_NORMAL, SIZE_MINI })
  public @interface FAB_SIZE {
  }

  int mColorNormal;
  int mColorPressed;
  int mColorDisabled;
  String mTitle;
  @DrawableRes
  private int mIcon;
  private Drawable mIconDrawable;
  private int mSize;
  private float mCircleSize;
  private float mShadowRadius;
  private float mShadowOffset;
  private int mDrawableSize;
  boolean mStrokeVisible;

  public FloatingActionButton(Context context) {
    this(context, null);
  }

  public FloatingActionButton(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
  }

  public FloatingActionButton(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context, attrs);
  }

  void init(Context context, AttributeSet attributeSet) {
    TypedArray attr = context.obtainStyledAttributes(attributeSet, R.styleable.FloatingActionButton, 0, 0);
    mColorNormal = attr.getColor(R.styleable.FloatingActionButton_fab_colorNormal, getColor(android.R.color.holo_blue_dark));
    mColorPressed = attr.getColor(R.styleable.FloatingActionButton_fab_colorPressed, getColor(android.R.color.holo_blue_light));
    mColorDisabled = attr.getColor(R.styleable.FloatingActionButton_fab_colorDisabled, getColor(android.R.color.darker_gray));
    mSize = attr.getInt(R.styleable.FloatingActionButton_fab_size, SIZE_NORMAL);
    mIcon = attr.getResourceId(R.styleable.FloatingActionButton_fab_icon, 0);
    mTitle = attr.getString(R.styleable.FloatingActionButton_fab_title);
    mStrokeVisible = attr.getBoolean(R.styleable.FloatingActionButton_fab_stroke_visible, true);
    attr.recycle();

    updateCircleSize();
    mShadowRadius = getDimension(R.dimen.fab_shadow_radius);
    mShadowOffset = getDimension(R.dimen.fab_shadow_offset);
    updateDrawableSize();
    updateBackground();
  }

  private void updateDrawableSize() {
    mDrawableSize = (int) (mCircleSize + 2 * mShadowRadius);
  }

  private void updateCircleSize() {
    mCircleSize = getDimension(mSize == SIZE_NORMAL ? R.dimen.fab_size_normal : R.dimen.fab_size_mini);
  }

  public void setSize(@FAB_SIZE int size) {
    if (size != SIZE_MINI && size != SIZE_NORMAL) {
      throw new IllegalArgumentException("Use @FAB_SIZE constants only!");
    }

    if (mSize != size) {
      mSize = size;
      updateCircleSize();
      updateDrawableSize();
      updateBackground();
    }
  }

  @FAB_SIZE
  public int getSize() {
    return mSize;
  }

  public void setIcon(@DrawableRes int icon) {
    if (mIcon != icon) {
      mIcon = icon;
      mIconDrawable = null;
      updateBackground();
    }
  }

  public void setIconDrawable(@NonNull Drawable iconDrawable) {
    if (mIconDrawable != iconDrawable) {
      mIcon = 0;
      mIconDrawable = iconDrawable;
      updateBackground();
    }
  }

  public int getColorNormal() {
    return mColorNormal;
  }

  public void setColorNormalResId(@ColorRes int colorNormal) {
    setColorNormal(getColor(colorNormal));
  }

  public void setColorNormal(int color) {
    if (mColorNormal != color) {
      mColorNormal = color;
      updateBackground();
    }
  }

  public int getColorPressed() {
    return mColorPressed;
  }

  public void setColorPressedResId(@ColorRes int colorPressed) {
    setColorPressed(getColor(colorPressed));
  }

  public void setColorPressed(int color) {
    if (mColorPressed != color) {
      mColorPressed = color;
      updateBackground();
    }
  }

  public int getColorDisabled() {
    return mColorDisabled;
  }

  public void setColorDisabledResId(@ColorRes int colorDisabled) {
    setColorDisabled(getColor(colorDisabled));
  }

  public void setColorDisabled(int color) {
    if (mColorDisabled != color) {
        mColorDisabled = color;
        updateBackground();
    }
  }

  public void setStrokeVisible(boolean visible) {
    if (mStrokeVisible != visible) {
      mStrokeVisible = visible;
      updateBackground();
    }
  }

  public boolean isStrokeVisible() {
    return mStrokeVisible;
  }

  int getColor(@ColorRes int id) {
    return getResources().getColor(id);
  }

  float getDimension(@DimenRes int id) {
    return getResources().getDimension(id);
  }

  public void setTitle(String title) {
    mTitle = title;
    TextView label = getLabelView();
    if (label != null) {
      label.setText(title);
    }
  }

  TextView getLabelView() {
    return (TextView) getTag(R.id.fab_label);
  }

  public String getTitle() {
    return mTitle;
  }

  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    setMeasuredDimension(mDrawableSize, mDrawableSize);
  }

  void updateBackground() {
    final float strokeWidth = getDimension(R.dimen.fab_stroke_width);
    final float halfStrokeWidth = strokeWidth / 2f;

    LayerDrawable layerDrawable = new LayerDrawable(
        new Drawable[] {
            getResources().getDrawable(mSize == SIZE_NORMAL ? R.drawable.fab_bg_normal : R.drawable.fab_bg_mini),
            createFillDrawable(strokeWidth),
            createOuterStrokeDrawable(strokeWidth),
            getIconDrawable()
        });

    int iconOffset = (int) (mCircleSize - getDimension(R.dimen.fab_icon_size)) / 2;
    int circleInsetHorizontal = (int) (mShadowRadius);
    int circleInsetTop = (int) (mShadowRadius - mShadowOffset);
    int circleInsetBottom = (int) (mShadowRadius + mShadowOffset);

    layerDrawable.setLayerInset(1,
        circleInsetHorizontal,
        circleInsetTop,
        circleInsetHorizontal,
        circleInsetBottom);

    layerDrawable.setLayerInset(2,
        (int) (circleInsetHorizontal - halfStrokeWidth),
        (int) (circleInsetTop - halfStrokeWidth),
        (int) (circleInsetHorizontal - halfStrokeWidth),
        (int) (circleInsetBottom - halfStrokeWidth));

    layerDrawable.setLayerInset(3,
        circleInsetHorizontal + iconOffset,
        circleInsetTop + iconOffset,
        circleInsetHorizontal + iconOffset,
        circleInsetBottom + iconOffset);

    setBackgroundCompat(layerDrawable);
  }

  Drawable getIconDrawable() {
    if (mIconDrawable != null) {
      return mIconDrawable;
    } else if (mIcon != 0) {
      return getResources().getDrawable(mIcon);
    } else {
      return new ColorDrawable(Color.TRANSPARENT);
    }
  }

  private StateListDrawable createFillDrawable(float strokeWidth) {
    StateListDrawable drawable = new StateListDrawable();
    drawable.addState(new int[] { -android.R.attr.state_enabled }, createCircleDrawable(mColorDisabled, strokeWidth));
    drawable.addState(new int[] { android.R.attr.state_pressed }, createCircleDrawable(mColorPressed, strokeWidth));
    drawable.addState(new int[] { }, createCircleDrawable(mColorNormal, strokeWidth));
    return drawable;
  }

  private Drawable createCircleDrawable(int color, float strokeWidth) {
    int alpha = Color.alpha(color);
    int opaqueColor = opaque(color);
    ShapeDrawable fillDrawable = new ShapeDrawable(new OvalShape());

    final Paint paint = fillDrawable.getPaint();
    paint.setAntiAlias(true);
    paint.setColor(opaqueColor);

    Drawable[] layers = {
        fillDrawable,
        createInnerStrokesDrawable(opaqueColor, strokeWidth)
    };

    LayerDrawable drawable = alpha == 255 || !mStrokeVisible
        ? new LayerDrawable(layers)
        : new TranslucentLayerDrawable(alpha, layers);

    int halfStrokeWidth = (int) (strokeWidth / 2f);
    drawable.setLayerInset(1, halfStrokeWidth, halfStrokeWidth, halfStrokeWidth, halfStrokeWidth);

    return drawable;
  }

  private static class TranslucentLayerDrawable extends LayerDrawable {
    private final int mAlpha;

    public TranslucentLayerDrawable(int alpha, Drawable... layers) {
      super(layers);
      mAlpha = alpha;
    }

    @Override
    public void draw(Canvas canvas) {
      Rect bounds = getBounds();
      canvas.saveLayerAlpha(bounds.left, bounds.top, bounds.right, bounds.bottom, mAlpha, Canvas.ALL_SAVE_FLAG);
      super.draw(canvas);
      canvas.restore();
    }
  }

  private Drawable createOuterStrokeDrawable(float strokeWidth) {
    ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());

    final Paint paint = shapeDrawable.getPaint();
    paint.setAntiAlias(true);
    paint.setStrokeWidth(strokeWidth);
    paint.setStyle(Style.STROKE);
    paint.setColor(Color.BLACK);
    paint.setAlpha(opacityToAlpha(0.02f));
    return shapeDrawable;
  }

  private int opacityToAlpha(float opacity) {
    return (int) (255f * opacity);
  }

  private int darkenColor(int argb) {
    return adjustColorBrightness(argb, 0.9f);
  }

  private int lightenColor(int argb) {
    return adjustColorBrightness(argb, 1.1f);
  }

  private int adjustColorBrightness(int argb, float factor) {
    float[] hsv = new float[3];
    Color.colorToHSV(argb, hsv);

    hsv[2] = Math.min(hsv[2] * factor, 1f);

    return Color.HSVToColor(Color.alpha(argb), hsv);
  }

  private int halfTransparent(int argb) {
    return Color.argb(
        Color.alpha(argb) / 2,
        Color.red(argb),
        Color.green(argb),
        Color.blue(argb)
    );
  }

  private int opaque(int argb) {
    return Color.rgb(
        Color.red(argb),
        Color.green(argb),
        Color.blue(argb)
    );
  }

  private Drawable createInnerStrokesDrawable(final int color, float strokeWidth) {
    if (!mStrokeVisible) {
      return new ColorDrawable(Color.TRANSPARENT);
    }

    ShapeDrawable shapeDrawable = new ShapeDrawable(new OvalShape());

    final int bottomStrokeColor = darkenColor(color);
    final int bottomStrokeColorHalfTransparent = halfTransparent(bottomStrokeColor);
    final int topStrokeColor = lightenColor(color);
    final int topStrokeColorHalfTransparent = halfTransparent(topStrokeColor);

    final Paint paint = shapeDrawable.getPaint();
    paint.setAntiAlias(true);
    paint.setStrokeWidth(strokeWidth);
    paint.setStyle(Style.STROKE);
    shapeDrawable.setShaderFactory(new ShaderFactory() {
      @Override
      public Shader resize(int width, int height) {
        return new LinearGradient(width / 2, 0, width / 2, height,
            new int[] { topStrokeColor, topStrokeColorHalfTransparent, color, bottomStrokeColorHalfTransparent, bottomStrokeColor },
            new float[] { 0f, 0.2f, 0.5f, 0.8f, 1f },
            TileMode.CLAMP
        );
      }
    });

    return shapeDrawable;
  }

  @SuppressWarnings("deprecation")
  @SuppressLint("NewApi")
  private void setBackgroundCompat(Drawable drawable) {
    if (Build.VERSION.SDK_INT >= VERSION_CODES.JELLY_BEAN) {
      setBackground(drawable);
    } else {
      setBackgroundDrawable(drawable);
    }
  }

  @Override
  public void setVisibility(int visibility) {
    TextView label = getLabelView();
    if (label != null) {
      label.setVisibility(visibility);
    }

    super.setVisibility(visibility);
  }
}

 

FloatingActionsMenu

package com.mobilprogramlar.floadnt;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.Resources;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Build;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.AttributeSet;
import android.view.ContextThemeWrapper;
import android.view.TouchDelegate;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.view.animation.Interpolator;
import android.view.animation.OvershootInterpolator;
import android.widget.TextView;
import android.widget.Toast;
import androidx.annotation.ColorRes;
import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;

public class FloatingActionsMenu extends ViewGroup {
  public static final int EXPAND_UP = 0;
  public static final int EXPAND_DOWN = 1;
  public static final int EXPAND_LEFT = 2;
  public static final int EXPAND_RIGHT = 3;
  public static final int LABELS_ON_LEFT_SIDE = 0;
  public static final int LABELS_ON_RIGHT_SIDE = 1;

  private static final int ANIMATION_DURATION = 300;
  private static final float COLLAPSED_PLUS_ROTATION = 0f;
  private static final float EXPANDED_PLUS_ROTATION = 90f + 45f;

  private int mAddButtonPlusColor;
  private int mAddButtonColorNormal;
  private int mAddButtonColorPressed;
  private int mAddButtonSize;
  private boolean mAddButtonStrokeVisible;
  private int mExpandDirection;
  private int mButtonSpacing;
  private int mLabelsMargin;
  private int mLabelsVerticalOffset;
  private boolean mExpanded;
  private AnimatorSet mExpandAnimation = new AnimatorSet().setDuration(ANIMATION_DURATION);
  private AnimatorSet mCollapseAnimation = new AnimatorSet().setDuration(ANIMATION_DURATION);
  private AddFloatingActionButton mAddButton;
  private RotatingDrawable mRotatingDrawable;
  private int mMaxButtonWidth;
  private int mMaxButtonHeight;
  private int mLabelsStyle;
  private int mLabelsPosition;
  private int mButtonsCount;

  private TouchDelegateGroup mTouchDelegateGroup;
  private OnFloatingActionsMenuUpdateListener mListener;

  public interface OnFloatingActionsMenuUpdateListener {
    void onMenuExpanded();
    void onMenuCollapsed();
  }

  public FloatingActionsMenu(Context context) {
    this(context, null);
  }

  public FloatingActionsMenu(Context context, AttributeSet attrs) {
    super(context, attrs);
    init(context, attrs);
  }

  public FloatingActionsMenu(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    init(context, attrs);
  }

  private void init(Context context, AttributeSet attributeSet) {
    mButtonSpacing = (int) (getResources().getDimension(R.dimen.fab_actions_spacing) - getResources().getDimension(R.dimen.fab_shadow_radius) - getResources().getDimension(R.dimen.fab_shadow_offset));
    mLabelsMargin = getResources().getDimensionPixelSize(R.dimen.fab_labels_margin);
    mLabelsVerticalOffset = getResources().getDimensionPixelSize(R.dimen.fab_shadow_offset);

    mTouchDelegateGroup = new TouchDelegateGroup(this);
    setTouchDelegate(mTouchDelegateGroup);

    TypedArray attr = context.obtainStyledAttributes(attributeSet, R.styleable.FloatingActionsMenu, 0, 0);

    mAddButtonPlusColor = attr.getColor(R.styleable.FloatingActionsMenu_fab_addButtonPlusIconColor, getColorWrapper(context,android.R.color.white));
    mAddButtonColorNormal = attr.getColor(R.styleable.FloatingActionsMenu_fab_addButtonColorNormal, getColorWrapper(context,android.R.color.holo_blue_dark));
    mAddButtonColorPressed = attr.getColor(R.styleable.FloatingActionsMenu_fab_addButtonColorPressed, getColorWrapper(context,android.R.color.holo_blue_light));

    mAddButtonSize = attr.getInt(R.styleable.FloatingActionsMenu_fab_addButtonSize, FloatingActionButton.SIZE_NORMAL);
    mAddButtonStrokeVisible = attr.getBoolean(R.styleable.FloatingActionsMenu_fab_addButtonStrokeVisible, true);
    mExpandDirection = attr.getInt(R.styleable.FloatingActionsMenu_fab_expandDirection, EXPAND_UP);
    mLabelsStyle = attr.getResourceId(R.styleable.FloatingActionsMenu_fab_labelStyle, 0);
    mLabelsPosition = attr.getInt(R.styleable.FloatingActionsMenu_fab_labelsPosition, LABELS_ON_LEFT_SIDE);
    attr.recycle();

    if (mLabelsStyle != 0 && expandsHorizontally()) {
      throw new IllegalStateException("Action labels in horizontal expand orientation is not supported.");
    }
    createAddButton(context);
  }

  public void setOnFloatingActionsMenuUpdateListener(OnFloatingActionsMenuUpdateListener listener) {
    mListener = listener;
  }

  private boolean expandsHorizontally() {
    return mExpandDirection == EXPAND_LEFT || mExpandDirection == EXPAND_RIGHT;
  }

  private static class RotatingDrawable extends LayerDrawable {
    public RotatingDrawable(Drawable drawable) {
      super(new Drawable[] { drawable });
    }

    private float mRotation;

    @SuppressWarnings("UnusedDeclaration")
    public float getRotation() {
      return mRotation;
    }

    @SuppressWarnings("UnusedDeclaration")
    public void setRotation(float rotation) {
      mRotation = rotation;
      invalidateSelf();
    }

    @Override
    public void draw(Canvas canvas) {
      canvas.save();
      canvas.rotate(mRotation, getBounds().centerX(), getBounds().centerY());
      super.draw(canvas);
      canvas.restore();
    }
  }

  private void createAddButton(Context context) {
    mAddButton = new AddFloatingActionButton(context) {
      @Override
      void updateBackground() {
        mPlusColor = mAddButtonPlusColor;
        mColorNormal = mAddButtonColorNormal;
        mColorPressed = mAddButtonColorPressed;
        mStrokeVisible = mAddButtonStrokeVisible;
        super.updateBackground();
      }

      @Override
      Drawable getIconDrawable() {
        final RotatingDrawable rotatingDrawable = new RotatingDrawable(super.getIconDrawable());
        mRotatingDrawable = rotatingDrawable;
        final OvershootInterpolator interpolator = new OvershootInterpolator();
        final ObjectAnimator collapseAnimator = ObjectAnimator.ofFloat(rotatingDrawable, "rotation", EXPANDED_PLUS_ROTATION, COLLAPSED_PLUS_ROTATION);
        final ObjectAnimator expandAnimator = ObjectAnimator.ofFloat(rotatingDrawable, "rotation", COLLAPSED_PLUS_ROTATION, EXPANDED_PLUS_ROTATION);
        collapseAnimator.setInterpolator(interpolator);
        expandAnimator.setInterpolator(interpolator);

        mExpandAnimation.play(expandAnimator);
        mCollapseAnimation.play(collapseAnimator);
        return rotatingDrawable;
      }
    };

    mAddButton.setId(R.id.fab_expand_menu_button);
    mAddButton.setSize(mAddButtonSize);
    mAddButton.setOnClickListener(new OnClickListener() {
      @Override
      public void onClick(View v) {
        toggle();
      }
    });

    addView(mAddButton, super.generateDefaultLayoutParams());
    mButtonsCount++;
  }

  public void addButton(FloatingActionButton button) {
    addView(button, mButtonsCount - 1);
    mButtonsCount++;

    if (mLabelsStyle != 0) {
      createLabels();
    }
  }

  public void removeButton(FloatingActionButton button) {
    removeView(button.getLabelView());
    removeView(button);
    button.setTag(R.id.fab_label, null);
    mButtonsCount--;
  }

  private static int getColorWrapper(Context context, int id) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
      return context.getColor(id);
    } else {
      return context.getResources().getColor(id);
    }
  }



  @Override
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    measureChildren(widthMeasureSpec, heightMeasureSpec);
    int width = 0;
    int height = 0;
    mMaxButtonWidth = 0;
    mMaxButtonHeight = 0;
    int maxLabelWidth = 0;

    for (int i = 0; i < mButtonsCount; i++) {
      View child = getChildAt(i);
      if (child.getVisibility() == GONE) {
        continue;
      }
      switch (mExpandDirection) {
      case EXPAND_UP:
      case EXPAND_DOWN:
        mMaxButtonWidth = Math.max(mMaxButtonWidth, child.getMeasuredWidth());
        height += child.getMeasuredHeight();
        break;
      case EXPAND_LEFT:
      case EXPAND_RIGHT:
        width += child.getMeasuredWidth();
        mMaxButtonHeight = Math.max(mMaxButtonHeight, child.getMeasuredHeight());
        break;
      }

      if (!expandsHorizontally()) {
        TextView label = (TextView) child.getTag(R.id.fab_label);
        if (label != null) {
          maxLabelWidth = Math.max(maxLabelWidth, label.getMeasuredWidth());
        }
      }
    }

    if (!expandsHorizontally()) {
      width = mMaxButtonWidth + (maxLabelWidth > 0 ? maxLabelWidth + mLabelsMargin : 0);
    } else {
      height = mMaxButtonHeight;
    }

    switch (mExpandDirection) {
    case EXPAND_UP:
    case EXPAND_DOWN:
      height += mButtonSpacing * (mButtonsCount - 1);
      height = adjustForOvershoot(height);
      break;
    case EXPAND_LEFT:
    case EXPAND_RIGHT:
      width += mButtonSpacing * (mButtonsCount - 1);
      width = adjustForOvershoot(width);
      break;
    }

    setMeasuredDimension(width, height);
  }

  private int adjustForOvershoot(int dimension) {
    return dimension * 12 / 10;
  }

  @Override
  protected void onLayout(boolean changed, int l, int t, int r, int b) {
    switch (mExpandDirection) {
    case EXPAND_UP:
    case EXPAND_DOWN:
      boolean expandUp = mExpandDirection == EXPAND_UP;

      if (changed) {
        mTouchDelegateGroup.clearTouchDelegates();
      }

      int addButtonY = expandUp ? b - t - mAddButton.getMeasuredHeight() : 0;
      int buttonsHorizontalCenter = mLabelsPosition == LABELS_ON_LEFT_SIDE
          ? r - l - mMaxButtonWidth / 2
          : mMaxButtonWidth / 2;
      int addButtonLeft = buttonsHorizontalCenter - mAddButton.getMeasuredWidth() / 2;
      mAddButton.layout(addButtonLeft, addButtonY, addButtonLeft + mAddButton.getMeasuredWidth(), addButtonY + mAddButton.getMeasuredHeight());

      int labelsOffset = mMaxButtonWidth / 2 + mLabelsMargin;
      int labelsXNearButton = mLabelsPosition == LABELS_ON_LEFT_SIDE
          ? buttonsHorizontalCenter - labelsOffset
          : buttonsHorizontalCenter + labelsOffset;

      int nextY = expandUp ?
          addButtonY - mButtonSpacing :
          addButtonY + mAddButton.getMeasuredHeight() + mButtonSpacing;

      for (int i = mButtonsCount - 1; i >= 0; i--) {
        final View child = getChildAt(i);

        if (child == mAddButton || child.getVisibility() == GONE) continue;

        int childX = buttonsHorizontalCenter - child.getMeasuredWidth() / 2;
        int childY = expandUp ? nextY - child.getMeasuredHeight() : nextY;
        child.layout(childX, childY, childX + child.getMeasuredWidth(), childY + child.getMeasuredHeight());

        float collapsedTranslation = addButtonY - childY;
        float expandedTranslation = 0f;
        child.setTranslationY(mExpanded ? expandedTranslation : collapsedTranslation);
        child.setAlpha(mExpanded ? 1f : 0f);

        LayoutParams params = (LayoutParams) child.getLayoutParams();
        params.mCollapseDir.setFloatValues(expandedTranslation, collapsedTranslation);
        params.mExpandDir.setFloatValues(collapsedTranslation, expandedTranslation);
        params.setAnimationsTarget(child);

        View label = (View) child.getTag(R.id.fab_label);
        if (label != null) {
          int labelXAwayFromButton = mLabelsPosition == LABELS_ON_LEFT_SIDE
              ? labelsXNearButton - label.getMeasuredWidth()
              : labelsXNearButton + label.getMeasuredWidth();

          int labelLeft = mLabelsPosition == LABELS_ON_LEFT_SIDE
              ? labelXAwayFromButton
              : labelsXNearButton;

          int labelRight = mLabelsPosition == LABELS_ON_LEFT_SIDE
              ? labelsXNearButton
              : labelXAwayFromButton;

          int labelTop = childY - mLabelsVerticalOffset + (child.getMeasuredHeight() - label.getMeasuredHeight()) / 2;
          label.layout(labelLeft, labelTop, labelRight, labelTop + label.getMeasuredHeight());
          Rect touchArea = new Rect(
              Math.min(childX, labelLeft),
              childY - mButtonSpacing / 2,
              Math.max(childX + child.getMeasuredWidth(), labelRight),
              childY + child.getMeasuredHeight() + mButtonSpacing / 2);
          mTouchDelegateGroup.addTouchDelegate(new TouchDelegate(touchArea, child));

          label.setTranslationY(mExpanded ? expandedTranslation : collapsedTranslation);
          label.setAlpha(mExpanded ? 1f : 0f);

          LayoutParams labelParams = (LayoutParams) label.getLayoutParams();
          labelParams.mCollapseDir.setFloatValues(expandedTranslation, collapsedTranslation);
          labelParams.mExpandDir.setFloatValues(collapsedTranslation, expandedTranslation);
          labelParams.setAnimationsTarget(label);
        }

        nextY = expandUp ?
            childY - mButtonSpacing :
            childY + child.getMeasuredHeight() + mButtonSpacing;
      }
      break;

    case EXPAND_LEFT:
    case EXPAND_RIGHT:
      boolean expandLeft = mExpandDirection == EXPAND_LEFT;

      int addButtonX = expandLeft ? r - l - mAddButton.getMeasuredWidth() : 0;
      int addButtonTop = b - t - mMaxButtonHeight + (mMaxButtonHeight - mAddButton.getMeasuredHeight()) / 2;
      mAddButton.layout(addButtonX, addButtonTop, addButtonX + mAddButton.getMeasuredWidth(), addButtonTop + mAddButton.getMeasuredHeight());

      int nextX = expandLeft ?
          addButtonX - mButtonSpacing :
          addButtonX + mAddButton.getMeasuredWidth() + mButtonSpacing;

      for (int i = mButtonsCount - 1; i >= 0; i--) {
        final View child = getChildAt(i);
        if (child == mAddButton || child.getVisibility() == GONE) continue;
        int childX = expandLeft ? nextX - child.getMeasuredWidth() : nextX;
        int childY = addButtonTop + (mAddButton.getMeasuredHeight() - child.getMeasuredHeight()) / 2;
        child.layout(childX, childY, childX + child.getMeasuredWidth(), childY + child.getMeasuredHeight());

        float collapsedTranslation = addButtonX - childX;
        float expandedTranslation = 0f;
        child.setTranslationX(mExpanded ? expandedTranslation : collapsedTranslation);
        child.setAlpha(mExpanded ? 1f : 0f);

        LayoutParams params = (LayoutParams) child.getLayoutParams();
        params.mCollapseDir.setFloatValues(expandedTranslation, collapsedTranslation);
        params.mExpandDir.setFloatValues(collapsedTranslation, expandedTranslation);
        params.setAnimationsTarget(child);
        nextX = expandLeft ?
            childX - mButtonSpacing :
            childX + child.getMeasuredWidth() + mButtonSpacing;
      }
      break;
    }
  }

  @Override
  protected ViewGroup.LayoutParams generateDefaultLayoutParams() {
    return new LayoutParams(super.generateDefaultLayoutParams());
  }

  @Override
  public ViewGroup.LayoutParams generateLayoutParams(AttributeSet attrs) {
    return new LayoutParams(super.generateLayoutParams(attrs));
  }

  @Override
  protected ViewGroup.LayoutParams generateLayoutParams(ViewGroup.LayoutParams p) {
    return new LayoutParams(super.generateLayoutParams(p));
  }

  @Override
  protected boolean checkLayoutParams(ViewGroup.LayoutParams p) {
    return super.checkLayoutParams(p);
  }

  private static Interpolator sExpandInterpolator = new OvershootInterpolator();
  private static Interpolator sCollapseInterpolator = new DecelerateInterpolator(3f);
  private static Interpolator sAlphaExpandInterpolator = new DecelerateInterpolator();

  private class LayoutParams extends ViewGroup.LayoutParams {

    private ObjectAnimator mExpandDir = new ObjectAnimator();
    private ObjectAnimator mExpandAlpha = new ObjectAnimator();
    private ObjectAnimator mCollapseDir = new ObjectAnimator();
    private ObjectAnimator mCollapseAlpha = new ObjectAnimator();
    private boolean animationsSetToPlay;

    public LayoutParams(ViewGroup.LayoutParams source) {
      super(source);

      mExpandDir.setInterpolator(sExpandInterpolator);
      mExpandAlpha.setInterpolator(sAlphaExpandInterpolator);
      mCollapseDir.setInterpolator(sCollapseInterpolator);
      mCollapseAlpha.setInterpolator(sCollapseInterpolator);
      mCollapseAlpha.setProperty(View.ALPHA);
      mCollapseAlpha.setFloatValues(1f, 0f);
      mExpandAlpha.setProperty(View.ALPHA);
      mExpandAlpha.setFloatValues(0f, 1f);

      switch (mExpandDirection) {
      case EXPAND_UP:
      case EXPAND_DOWN:
        mCollapseDir.setProperty(View.TRANSLATION_Y);
        mExpandDir.setProperty(View.TRANSLATION_Y);
        break;
      case EXPAND_LEFT:
      case EXPAND_RIGHT:
        mCollapseDir.setProperty(View.TRANSLATION_X);
        mExpandDir.setProperty(View.TRANSLATION_X);
        break;
      }
    }

    public void setAnimationsTarget(View view) {
      mCollapseAlpha.setTarget(view);
      mCollapseDir.setTarget(view);
      mExpandAlpha.setTarget(view);
      mExpandDir.setTarget(view);

      // Now that the animations have targets, set them to be played
      if (!animationsSetToPlay) {
        addLayerTypeListener(mExpandDir, view);
        addLayerTypeListener(mCollapseDir, view);
        mCollapseAnimation.play(mCollapseAlpha);
        mCollapseAnimation.play(mCollapseDir);
        mExpandAnimation.play(mExpandAlpha);
        mExpandAnimation.play(mExpandDir);
        animationsSetToPlay = true;
      }
    }

    private void addLayerTypeListener(Animator animator, final View view) {
      animator.addListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
          view.setLayerType(LAYER_TYPE_NONE, null);
        }

        @Override
        public void onAnimationStart(Animator animation) {
          view.setLayerType(LAYER_TYPE_HARDWARE, null);
        }
      });
    }
  }

  @Override
  protected void onFinishInflate() {
    super.onFinishInflate();

    bringChildToFront(mAddButton);
    mButtonsCount = getChildCount();

    if (mLabelsStyle != 0) {
      createLabels();
    }
  }

  private void createLabels() {
    Context context = new ContextThemeWrapper(getContext(), mLabelsStyle);

    for (int i = 0; i < mButtonsCount; i++) {
      FloatingActionButton button = (FloatingActionButton) getChildAt(i);
      String title = button.getTitle();

      if (button == mAddButton || title == null ||
          button.getTag(R.id.fab_label) != null) continue;

      TextView label = new TextView(context);
      label.setTextAppearance(getContext(), mLabelsStyle);
      label.setText(button.getTitle());
      addView(label);
      button.setTag(R.id.fab_label, label);
    }
  }

  public void collapse() {
    collapse(false);
  }
  public void collapseImmediately() {
    collapse(true);
  }
  private void collapse(boolean immediately) {
    if (mExpanded) {
      mExpanded = false;
      mTouchDelegateGroup.setEnabled(false);
      mCollapseAnimation.setDuration(immediately ? 0 : ANIMATION_DURATION);
      mCollapseAnimation.start();
      mExpandAnimation.cancel();

      if (mListener != null) {
        mListener.onMenuCollapsed();
      }
    }
  }

  public void toggle() {
    if (mExpanded) {
      collapse();
    } else {
      expand();
    }
  }

  public void expand() {
    if (!mExpanded) {
      mExpanded = true;
      mTouchDelegateGroup.setEnabled(true);
      mCollapseAnimation.cancel();
      mExpandAnimation.start();

      if (mListener != null) {
        mListener.onMenuExpanded();
      }
    }
  }

  public boolean isExpanded() {
    return mExpanded;
  }

  @Override
  public void setEnabled(boolean enabled) {
    super.setEnabled(enabled);
    mAddButton.setEnabled(enabled);
  }

  @Override
  public Parcelable onSaveInstanceState() {
    Parcelable superState = super.onSaveInstanceState();
    SavedState savedState = new SavedState(superState);
    savedState.mExpanded = mExpanded;
    return savedState;
  }

  @Override
  public void onRestoreInstanceState(Parcelable state) {
    if (state instanceof SavedState) {
      SavedState savedState = (SavedState) state;
      mExpanded = savedState.mExpanded;
      mTouchDelegateGroup.setEnabled(mExpanded);

      if (mRotatingDrawable != null) {
        mRotatingDrawable.setRotation(mExpanded ? EXPANDED_PLUS_ROTATION : COLLAPSED_PLUS_ROTATION);
      }

      super.onRestoreInstanceState(savedState.getSuperState());
    } else {
      super.onRestoreInstanceState(state);
    }
  }

  public static class SavedState extends BaseSavedState {
    public boolean mExpanded;
    public SavedState(Parcelable parcel) {
      super(parcel);
    }

    private SavedState(Parcel in) {
      super(in);
      mExpanded = in.readInt() == 1;
    }

    @Override
    public void writeToParcel(@NonNull Parcel out, int flags) {
      super.writeToParcel(out, flags);
      out.writeInt(mExpanded ? 1 : 0);
    }

    public static final Creator<SavedState> CREATOR = new Creator<SavedState>() {
      @Override
      public SavedState createFromParcel(Parcel in) {
        return new SavedState(in);
      }

      @Override
      public SavedState[] newArray(int size) {
        return new SavedState[size];
      }
    };
  }
}

 

TouchDelegateGroup

package com.mobilprogramlar.floadnt;

import android.graphics.Rect;
import android.view.MotionEvent;
import android.view.TouchDelegate;
import android.view.View;
import androidx.annotation.NonNull;
import java.util.ArrayList;

public class TouchDelegateGroup extends TouchDelegate {
  private static final Rect USELESS_HACKY_RECT = new Rect();
  private final ArrayList<TouchDelegate> mTouchDelegates = new ArrayList<TouchDelegate>();
  private TouchDelegate mCurrentTouchDelegate;
  private boolean mEnabled;

  public TouchDelegateGroup(View uselessHackyView) {
    super(USELESS_HACKY_RECT, uselessHackyView);
  }

  public void addTouchDelegate(@NonNull TouchDelegate touchDelegate) {
    mTouchDelegates.add(touchDelegate);
  }

  public void removeTouchDelegate(TouchDelegate touchDelegate) {
    mTouchDelegates.remove(touchDelegate);
    if (mCurrentTouchDelegate == touchDelegate) {
      mCurrentTouchDelegate = null;
    }
  }

  public void clearTouchDelegates() {
    mTouchDelegates.clear();
    mCurrentTouchDelegate = null;
  }

  @Override
  public boolean onTouchEvent(@NonNull MotionEvent event) {
    if (!mEnabled) return false;

    TouchDelegate delegate = null;

    switch (event.getAction()) {
    case MotionEvent.ACTION_DOWN:
      for (int i = 0; i < mTouchDelegates.size(); i++) {
        TouchDelegate touchDelegate = mTouchDelegates.get(i);
        if (touchDelegate.onTouchEvent(event)) {
          mCurrentTouchDelegate = touchDelegate;
          return true;
        }
      }
      break;

    case MotionEvent.ACTION_MOVE:
      delegate = mCurrentTouchDelegate;
      break;

    case MotionEvent.ACTION_CANCEL:
    case MotionEvent.ACTION_UP:
      delegate = mCurrentTouchDelegate;
      mCurrentTouchDelegate = null;
      break;
    }

    return delegate != null && delegate.onTouchEvent(event);
  }

  public void setEnabled(boolean enabled) {
    mEnabled = enabled;
  }
}

 

MainActivity

package com.mobilprogramlar.floadnt;

import androidx.appcompat.app.AppCompatActivity;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.pink_icon).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(MainActivity.this, "Clicked pink Floating Action Button", Toast.LENGTH_SHORT).show();
            }
        });

        FloatingActionButton button = (FloatingActionButton) findViewById(R.id.setter);
        button.setSize(FloatingActionButton.SIZE_MINI);
        button.setColorNormalResId(R.color.pink);
        button.setColorPressedResId(R.color.pink_pressed);
        button.setIcon(R.drawable.ic_fab_star);
        button.setStrokeVisible(false);

        final View actionB = findViewById(R.id.action_b);

        FloatingActionButton actionC = new FloatingActionButton(getBaseContext());
        actionC.setTitle("Hide/Show Action above");
        actionC.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                actionB.setVisibility(actionB.getVisibility() == View.GONE ? View.VISIBLE : View.GONE);
            }
        });

        final FloatingActionsMenu menuMultipleActions = (FloatingActionsMenu) findViewById(R.id.multiple_actions);
        menuMultipleActions.addButton(actionC);

        final FloatingActionButton removeAction = (FloatingActionButton) findViewById(R.id.button_remove);
        removeAction.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((FloatingActionsMenu) findViewById(R.id.multiple_actions_down)).removeButton(removeAction);
            }
        });

        ShapeDrawable drawable = new ShapeDrawable(new OvalShape());
        drawable.getPaint().setColor(getResources().getColor(R.color.white));
        ((FloatingActionButton) findViewById(R.id.setter_drawable)).setIconDrawable(drawable);

        final FloatingActionButton actionA = (FloatingActionButton) findViewById(R.id.action_a);
        actionA.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                actionA.setTitle("Action A clicked");
            }
        });

        findViewById(R.id.button_gone).setVisibility(View.GONE);

        final FloatingActionButton actionEnable = (FloatingActionButton) findViewById(R.id.action_enable);
        actionEnable.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                menuMultipleActions.setEnabled(!menuMultipleActions.isEnabled());
            }
        });

        FloatingActionsMenu rightLabels = (FloatingActionsMenu) findViewById(R.id.right_labels);
        FloatingActionButton addedOnce = new FloatingActionButton(this);
        addedOnce.setTitle("Added once");
        rightLabels.addButton(addedOnce);

        FloatingActionButton addedTwice = new FloatingActionButton(this);
        addedTwice.setTitle("Added twice");
        rightLabels.addButton(addedTwice);
        rightLabels.removeButton(addedTwice);
        rightLabels.addButton(addedTwice);
    }
}

 

 

Value dizininin altına attrss.xml, colors.xml, dimens.xml, ids.xml, string.xml ve styles.xml dosyalarını ekliyoruz.

attrs.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="FloatingActionButton">
        <attr name="fab_colorPressed" format="color"/>
        <attr name="fab_colorDisabled" format="color"/>
        <attr name="fab_colorNormal" format="color"/>
        <attr name="fab_icon" format="reference"/>
        <attr name="fab_size" format="enum">
            <enum name="normal" value="0"/>
            <enum name="mini" value="1"/>
        </attr>
        <attr name="fab_title" format="string"/>
        <attr name="fab_stroke_visible" format="boolean"/>
    </declare-styleable>
    <declare-styleable name="AddFloatingActionButton">
        <attr name="fab_plusIconColor" format="color"/>
    </declare-styleable>
    <declare-styleable name="FloatingActionsMenu">
        <attr name="fab_addButtonColorPressed" format="color"/>
        <attr name="fab_addButtonColorNormal" format="color"/>
        <attr name="fab_addButtonSize" format="enum">
            <enum name="normal" value="0"/>
            <enum name="mini" value="1"/>
        </attr>
        <attr name="fab_addButtonPlusIconColor" format="color"/>
        <attr name="fab_addButtonStrokeVisible" format="boolean"/>
        <attr name="fab_labelStyle" format="reference"/>
        <attr name="fab_labelsPosition" format="enum">
            <enum name="left" value="0"/>
            <enum name="right" value="1"/>
        </attr>
        <attr name="fab_expandDirection" format="enum">
            <enum name="up" value="0"/>
            <enum name="down" value="1"/>
            <enum name="left" value="2"/>
            <enum name="right" value="3"/>
        </attr>
    </declare-styleable>
</resources>

 

colors.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <color name="colorPrimary">#008577</color>
    <color name="colorPrimaryDark">#00574B</color>
    <color name="colorAccent">#D81B60</color>

    <color name="black_semi_transparent">#B2000000</color>
    <color name="background">#e5e5e5</color>
    <color name="half_black">#808080</color>
    <color name="white">#fafafa</color>
    <color name="white_pressed">#f1f1f1</color>
    <color name="pink">#e91e63</color>
    <color name="pink_pressed">#ec407a</color>
    <color name="blue_semi_transparent">#805677fc</color>
    <color name="blue_semi_transparent_pressed">#80738ffe</color>
</resources>

 

dimans.xml

<resources>
    <dimen name="fab_size_normal">56dp</dimen>
    <dimen name="fab_size_mini">40dp</dimen>

    <dimen name="fab_icon_size">24dp</dimen>

    <dimen name="fab_plus_icon_size">14dp</dimen>
    <dimen name="fab_plus_icon_stroke">2dp</dimen>

    <dimen name="fab_shadow_offset">3dp</dimen>
    <dimen name="fab_shadow_radius">9dp</dimen>

    <dimen name="fab_stroke_width">1dp</dimen>

    <dimen name="fab_actions_spacing">16dp</dimen>
    <dimen name="fab_labels_margin">8dp</dimen>
</resources>

 

ids.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <item name="fab_expand_menu_button" type="id"/>
    <item name="fab_label" type="id"/>
</resources>

String.xml

<resources>
    <string name="app_name">Fload NT</string>
    <string name="text_below_button">Text below button</string>
</resources>

Styles.xml

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="menu_labels_style">
        <item name="android:background">@drawable/fab_label_background</item>
        <item name="android:textColor">@color/white</item>
    </style>

</resources>

 

drawable klasörünün altına ise

fab_label_background.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/black_semi_transparent"/>
    <padding
        android:left="16dp"
        android:top="4dp"
        android:right="16dp"
        android:bottom="4dp"/>
    <corners
        android:radius="2dp"/>
</shape>

Ayrıca alttaki 3 resim dosyasını da drawable klasörü altına ekliyoruz.

farklı telefon boyutları için bu resimlerin faklı ebatlarını yazının sonunda ki dosyanın tamamını indirebileceğiniz linki verdiğimde oradan indirebilirsiniz.

Floating Action Button

Floating Action Button

Floating Action Button

Sonuç;

Floating Action Button

Anlatılanların tamamının Android Studio daki kaynak kod ve reimleri aşağıdaki linkten indirebilirsiniz.

İndir

 

Android Studio'ya Genel

Android Studio’ya Genel Bakış

Android Studio, IntelliJ IDEA’ya dayanan Android uygulama geliştirme resmi IDE’sidir . IntelliJ’den beklediğiniz özelliklerin yanı sıra, Android Studio şunları sunar:

  • Esnek Gradle tabanlı yapı sistemi
  • Değişkenler ve çoklu apkdosya oluşturma
  • Ortak uygulama özellikleri oluşturmanıza yardımcı olacak kod şablonları
  • Sürükle ve bırak tema düzenleme desteği ile zengin düzen düzenleyici
  • Performansı, kullanılabilirliği, sürüm uyumluluğunu ve diğer sorunları yakalamak için Lint araçları
  • ProGuard ve uygulama imzalama yetenekleri
  • Google Cloud Platform için yerleşik destek , Google Cloud Messaging ve App Engine’i entegre etmeyi kolaylaştırır
  • Ve daha fazlası

Şimdi Android Studio’yu indirin .

Android Studio veya IntelliJ IDEA arayüzünde yeniyseniz, bu sayfa bazı temel Android Studio özelliklerine giriş sağlar.

Proje ve Dosya Yapısı


Android Proje Görünümü

Varsayılan olarak, Android Studio profil dosyalarınızı Android proje görünümünde görüntüler. Bu görünüm, Android projelerinin temel kaynak dosyalarına hızlı erişim sağlayan ve yeni Gradle tabanlı yapı sistemiyle çalışmanıza yardımcı olan, projenizin yapısının düzleştirilmiş halini gösterir . Android proje görünümü:

  • Tüm modüllerin derleme dosyalarını proje hiyerarşisinin en üst düzeyinde gruplandırır.
  • Modül hiyerarşisinin en üst düzeyindeki en önemli kaynak dizinlerini gösterir.
  • Her modül için tüm manifest dosyalarını gruplandırır.
  • Tüm Gradle kaynak kümelerindeki kaynak dosyalarını gösterir.
  • Farklı yerel, oryantasyon ve ekran türleri için kaynak dosyalarını kaynak türü başına tek bir grupta gruplandırır.
  • Android Studio&apos;ya Genel

    Şekil 1. Android proje görünümünü göster.

    Android Studio&apos;ya Genel

    Şekil 2. Proje Oluşturma Dosyaları.

 

Android proje görünümü altında proje hiyerarşisinin en üst düzeyinde tüm yapı dosyaları gösterir Gradle Script . Her proje modülü, proje hiyerarşisinin en üst düzeyinde bir klasör olarak görünür ve bu üç öğeyi en üst düzeyde içerir:

  • java/ – Modül için kaynak dosyalar.
  • manifests/ – Modül için dosya listesi.
  • res/ – Modül için kaynak dosyaları.

Örneğin, Android proje görünümü ic_launcher.png aynı öğenin altındaki farklı ekran yoğunlukları için kaynağın tüm örneklerini gruplandırır .

Not: Diskteki proje yapısı bu düzleştirilmiş gösterimden farklıdır.  Ayrılmış proje görünümünü geri seçmek geçmek için Project dan Projenizi seçin.

Yeni Proje ve Dizin Yapısı

Android Studio’da yeni bir projenin Proje görünümünü kullandığınızda, proje yapısının Eclipse’de kullandığınızdan farklı göründüğünü fark etmelisiniz.

Android Studio’nun her örneği bir veya daha fazla uygulama modülüne sahip bir proje içerir. Her uygulama modülü klasörü, söz konusu modül için eksiksiz kaynak kümelerini içerir.

Her uygulama modülü klasör dahil olmak üzere bu modül için komple kaynak setleri içeren src / main ve src / androidTest dizinleri, kaynakları, derleme dosyası ve Android bildirimi dahil.

Çoğunlukla, src/main kaynak kod güncellemeleri için her bir modülün dizinindeki dosyaları, derleme belirtimi için gradle.build dosyasını ve src/androidTesttest senaryosu oluşturma için dizindeki dosyaları değiştirmeniz gerekecektir .

 

Android Studio&apos;ya Genel

Şekil 3. Android Studio proje yapısı

 

Yeni dosyalar oluşturma

Proje bölmesinde uygun dizini tıklatarak ve ALT + INSERTWindows ve Linux ya COMMAND + Nda Mac’te tuşuna basarak hızlıca yeni kod ve kaynak dosyaları ekleyebilirsiniz . Seçilen dizinin türüne bağlı olarak, Android Studio uygun dosya türünü oluşturmayı teklif eder.

Örneğin, bir layout (düzen) dizini seçtiyseniz ALT + INSERT, Windows’a basın ve Layout resource file (Mizanpaj kaynak dosyası)’nı seçtiğinizde , dosyayı adlandırabilmeniz ( .xmlson eki hariç tutabilirsiniz ) ve bir kök görünümü öğesi seçebilmeniz için bir iletişim kutusu açılır . Sonra editör, düzen tasarım editörüne geçer, böylece düzeninizi tasarlamaya başlayabilirsiniz.

Android Yapı Sistemi


Android Yapı Sistemi

Android yapı sistemi, uygulamalarınızı oluşturmak, test etmek, çalıştırmak ve paketlemek için kullandığınız araç takımıdır. Bu derleme sistemi, Eclipse ADT ile kullanılan Ant sisteminin yerini almaktadır. Android Studio menüsünden entegre bir araç olarak ve komut satırından bağımsız olarak çalışabilir. Yapı sisteminin özelliklerini aşağıdakiler için kullanabilirsiniz:

  • Derleme işlemini özelleştirin, yapılandırın ve genişletin.
  • Uygulamanız için aynı projeyi ve modülleri kullanarak farklı özelliklere sahip birden fazla APK oluşturun.
  • Kaynak kümeler arasında kodu ve kaynakları yeniden kullanın.

Android derleme sisteminin esnekliği, uygulamanızın çekirdek kaynak dosyalarını değiştirmeden tüm bunları başarmanıza olanak sağlar. Bir Android Studio projesi oluşturmak için, bkz . Android Studio’dan İnşa Etme ve Çalıştırma .

Package (Paket) Tanımlama için Application ID (Uygulama Kimliği)

Android derleme sistemiyle, applicationId niteliği, yayınlanacak uygulama paketlerini benzersiz şekilde tanımlamak için kullanılır. Uygulama kimliği, dosyanın android bölümünde ayarlanmıştır build.gradle.

apply plugin: 'com.android.application'

    android {
        compileSdkVersion 19
        buildToolsVersion "19.1"

    defaultConfig {
        applicationId "com.example.my.app"
        minSdkVersion 15
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    ...

Not: applicationID, AndroidManifest.xml dosyasında değil, yalnızca build.gradle dosyasında belirtilir.

Yapı değişkenlerini kullanırken yapı sistemi, her ürün çeşidi ve yapı türü için farklı paketler tanımlamanızı sağlar. Yapı türündeki uygulama kimliği, ürün çeşitleri için belirtilenlere ek olarak eklenir.

productFlavors {
        pro {
            applicationId = "com.example.my.pkg.pro"
        }
        free {
            applicationId = "com.example.my.pkg.free"
        }
    }
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
    ....

Paket adı hala bildirim dosyasında belirtilmelidir. Kaynak kodunuzda R sınıfınıza atıfta bulunmak ve göreceli etkinlik / hizmet kayıtlarını çözmek için kullanılır.

package="com.example.app">

Not: Birden fazla bildiriminiz varsa (örneğin, ürün lezzetine özgü bir bildirim ve yapı türü bildirimi), bu bildirimlerde paket adı isteğe bağlıdır. Bu bildirimlerde belirtilmişse, paket adının, src/main/klasördeki bildirimlerde belirtilen paket adıyla aynı olması gerekir .

Hata Ayıklama ve Performans


Android Sanal Aygıt (AVD) Yöneticisi

AVD Manager, uygulama önizlemeniz için en popüler cihaz yapılandırmalarını, ekran boyutlarını ve çözünürlüklerini seçmenize yardımcı olacak bağlantıları içeren ekranları güncelledi.

Açmak ve uygulamanızı emülatörde çalıştırmak için yeni sanal cihazlar oluşturmak için araç çubuğundaki Android Sanal Aygıt Yöneticisi’ni tıklayın.  Android Studio&apos;ya Genel.

AVD Manager, Nexus 6 ve Nexus 9 cihazları için emülatörlerle gelir ve ayrıca belirli emülatör özelliklerine göre özel Android cihaz kaplamaları oluşturmayı ve bu kaplamaları donanım profillerine atamayı destekler. Android Studio, Intel® x86 Donanım Hızlandırılmış Uygulama Yöneticisi (HAXM) emülatör hızlandırıcısını kurar ve hızlı uygulama prototiplemesi için varsayılan bir emülatör oluşturur.

Hafıza Monitörü

Android Studio, bir bellek izleme görünümü sağlar; böylece serbest bırakılmış nesneleri bulmak, bellek sızıntılarını bulmak ve bağlı cihazın kullandığı bellek miktarını izlemek için uygulamanızın bellek kullanımını daha kolay izleyebilirsiniz. Uygulamanız bir cihazda veya taklitçide çalışırken , bellek monitörünü başlatmak için sağ alt köşedeki Bellek Monitörü sekmesine tıklayın.

Android Studio&apos;ya Genel

Yeni Lint denetimleri

Lint, aşağıdakileri sağlamak için birkaç yeni kontrole sahip:

  • Cipher.getInstance() güvenli değerlerle kullanılır
  • Özel Görünümler’de, özel görünüm için ilişkilendirilmiş bildirimle stillenebilir, sınıf adıyla aynı temel adı kullanır.
  • fragment(parça) injection. için güvenlik kontrolü.
  • Artık mülk ataması artık beklendiği gibi çalışmıyor.
  • Gradle eklentisi sürümü, SDK ile uyumludur.
  • Soldan sağa doğrulama
  • Gerekli API sürümü
  • diğerleri

Lint hatasının üzerine gelmek, kolay hata çözümü için tam açıklama açıklama satırını görüntüler. Ayrıca ek hata bilgisi için hata mesajının sonunda yararlı bir köprü vardır.

Android Studio ile Lint’i belirli bir yapı değişkeni veya tüm yapı biçimleri için çalıştırabilirsiniz. LintOptions özelliğini, build.gradle dosyasındaki Android ayarlarına ekleyerek Lint’i yapılandırabilirsiniz .

android {
        lintOptions {
           // set to true to turn off analysis progress reporting by lint
           quiet true
           // if true, stop the gradle build if errors are found
           abortOnError false
           // if true, only report errors
           ignoreWarnings true

Dinamik düzen önizlemesi

Android Studio, hem Tasarım Görünümünde düzenlerle çalışmanıza olanak sağlar

Android Studio&apos;ya Genel

Şekil 5. Tasarım Görünümü ile Hello World Uygulaması

ve bir Metin Görünümü .

Android Studio&apos;ya Genel

Şekil 6. Metin Görünümü ile Hello World Uygulaması

Farklı cihaz görüntüleri, ekran yoğunlukları, kullanıcı arayüzü modları, yerel ayarlar ve Android sürümleri (çoklu API sürüm oluşturma) için mizanpaj değişikliklerini kolayca seçin ve önizleyin.

Android Studio&apos;ya Genel

Şekil 7. API Sürümü Oluşturma

Tasarım Görünümünde, öğeleri Paletten Önizleme veya Bileşen Ağacı’na sürükleyip bırakabilirsiniz. Metin Görünümü, cihazın görüntüsünü önizlerken doğrudan XML ayarlarını düzenlemenizi sağlar.

Mesajları günlüğe kaydet

Uygulamanızı Android Studio ile oluşturup çalıştırdığınızda , pencerenin altındaki Android’i tıklatarak adb ve cihaz günlüğü iletilerini (logcat) DDMS bölmesinde görüntüleyebilirsiniz .

Eğer uygulamanızı hata ayıklamak istiyorsanız Android Debug Monitor , sen tıklayarak başlatabilirsiniz Monitor Android Studio&apos;ya Genel araç çubuğunda. Hata Ayıklama Monitörü, uygulamanızı profillendirmek, cihaz davranışlarını kontrol etmek ve daha pek çok şey için tüm DDMS araç setini bulabileceğiniz yerdir . Ayrıca mizanpajlarınızı optimize etmenize yardımcı olacak Hiyerarşi Görüntüleyici araçlarını da içerir .

Kurulum, Kurulum ve Güncelleme Yönetimi


Android Studio kurulum ve kurulum sihirbazları

Güncelleştirilmiş bir kurulum ve kurulum sihirbazları, adım adım kurulum ve kurulum işlemlerinde size yardımcı olur; sihirbaz, Java Development Kit (JDK) ve kullanılabilir RAM gibi sistem gereksinimlerini denetler ve ardından isteğe bağlı yükleme seçenekleri ister; Intel® HAXM emülatörü hızlandırıcısı.

Güncelleştirilmiş bir kurulum sihirbazı, kurulum işleminde size yardımcı olur; çünkü sihirbaz sistem imajınızı ve öykünme gereksinimlerinizi (GPU) günceller ve ardından hızlı ve güvenilir emülasyon için Android 5’e (Lollipop) dayalı optimize edilmiş bir varsayılan Android Sanal Cihazı (AVD) oluşturur.

Genişletilmiş şablon ve form faktörü desteği

Android Studio, Google Hizmetleri için yeni şablonları desteklemektedir ve mevcut cihaz türlerini genişletmektedir.

Android Wear ve TV desteği

Kolay platformlar arası geliştirme için, Proje Sihirbazı, Android Wear ve TV için uygulamalarınızı oluşturmak için yeni şablonlar sunar.

Android Studio&apos;ya Genel

Şekil 9. Yeni Form Faktörleri

Uygulama oluşturma sırasında, Proje Sihirbazı projeniz için en iyi minSdkVersion’u seçmenize yardımcı olacak bir API Seviyesi iletişim kutusu görüntüler .

Google App Engine entegrasyonu (Google Cloud Platform / Mesajlaşma)

Hızlı bulut entegrasyonu. Google bulutuna bağlanmak ve bir bulut bitiş noktası oluşturmak için Google App Engine’i kullanmak,

[su_box title=”Kod” box_color=”#e15e26″ radius=”7″]

File > New Module > App Engine Java Servlet Module

[/su_box]

Dosya> Yeni Modül> App Engine Java Servlet Modülü’nü seçmek ve modül, paket ve müşteri adlarını belirlemek kadar kolaydır .

Android Studio&apos;ya Genel

Şekil 10. Kurulum Sihirbazı

Kanalları güncelle

Android Studio, Android Studio’yu kod seviyesi tercihinize göre güncel tutmak için dört güncelleme kanalı sunar:

  • Kanarya kanalı : Kanarya yapıları, haftalık olarak güncellenen, kanama kenarı salmalarını sağlar. Bu yapılar test edilmekle birlikte, insanların mümkün olan en kısa sürede yeni olanları görmelerini istediğimiz için hala hatalara maruz kalıyorlar. Bu üretim için önerilmez.
  • Dev Kanalı : Dev yapımı, zaman testinden kurtulan eski kanarya yapısı elle toplanır. Yaklaşık iki haftada bir veya aylık olarak güncellenirler.
  • Beta kanalı : Beta sürümleri, üretim sürümünden önce beta kalitesinde sürümler için kullanılır.
  • Kararlı kanal : Kararlı, üretime hazır sürümler için kullanılır.

Varsayılan olarak, Android Studio Kararlı kanalı kullanır . Kullanım  File > Settings > Updates

Dosya> Ayarlar> Güncellemeler kanal ayarını değiştirmek için.

Diğer Önemli Noktalar


Çeviri editörü

Çoklu dil desteği, Çeviri Düzenleyicisi eklentisi ile geliştirilmiştir; böylece uygulamanın çeviri dosyasına kolayca yerel ayar ekleyebilirsiniz. Renk kodları, bir yerel ayarın eksiksiz olup olmadığını veya hala dize çevirileri olmadığını gösterir. Ayrıca, eklentinizi çeviri için Google Play Developer Console (Google Play Geliştirici Konsolu)’na dışa aktarmak için kullanabilirsiniz, ardından çevirilerinizi projenize geri yükleyip içeri aktarın.

Çeviri Düzenleyicisine erişmek için bir strings.xmldosya açın ve Düzenleyiciyi Aç bağlantısını tıklayın.

Android Studio&apos;ya Genel

Şekil 11. Çeviri Editörü

En yeni Android API’leri için editör desteği

Android Studio, yeni Materyal Tasarımı temalarını, widget’larını ve gölge katmanları ve API sürüm oluşturma gibi grafikleri destekler (düzeni farklı UI sürümlerinde gösterir).

Ayrıca, <ripple> ve <animated-selector> gibi yeni çizilebilir XML etiketleri ve özellikleri desteklenir.

GitHub’da Android kod örneklerine kolay erişim

Tıklanması İthalat Örnekleri gelen Dosya menüsünden veya Hoş Geldiniz sayfasında GitHub’dan Google kod örneklerine kesintisiz erişim sağlar.

Android Studio&apos;ya Genel

Şekil 12. Kod Örnek Erişimi

Android Studio&apos;ya Genel

Şekil 13. Alınan Kod Örneği

 

https://code.tutsplus.com/tutorials/integrating-google-play-services-on-android–cms-19828

 

 

nedir Zeka nedir

IQ nedir? Zeka nedir?

Bilimde, Zeka terimi genellikle akademik veya bilişsel zeka olarak adlandırdığımız şeye refere eder. Zeka konusundaki kitaplarında profesörler Resing ve Drenth (2007) * ‘Zeka nedir?’ Aşağıdaki tanımı kullanarak: “Bilgi edinmek için gerekli olan bilişsel veya entelektüel yeteneklerin tümü ve bu bilgiyi iyi tanımlanmış bir amacı ve yapısına sahip sorunları çözmek için iyi kullanmak.”

Sıradan bir dilde, zekanın ne kadar akıllı ya da zeki olduğunuzu ifade ettiği söylenebilir.

 IQ puanı, bu kabiliyeti sizin gibi aynı yaştaki kişilerin çoğunluğu ile karşılaştırmanın standart bir yoludur. 100 puan, genel yaş grubunuzdaki bu insanlarla karşılaştırıldığında, temelde ortalama bir zekanız olduğu anlamına gelir. Psikologların çoğu 95 ila 105 arasında puan alanların normal bir istihbarat olduğunu veya ortalama bir IQ’su olduğunu söyler. Gerçek IQ puanı, artı veya eksi beş puan değişebilir çünkü tam bir IQ puanı almak çok zordur. Unutmayın, puanınızı olumsuz yönde etkileyebilecek birçok dış faktör vardır. Örneğin, sınava girerken kendinizi iyi hissetmiyorsanız. Ya da belki o gün bir şeyden rahatsız olursunuz. Bu şeyler puanınızı etkileyebilir. Bunlara ek olarak, IQ, bir insanın yaşamdaki tüm yeteneklerinin sonu değil. IQ puanı, el becerisi (açıkçası), müzikal yetenek ve yaşamda bir çok farklı başarıya yol açabilecek bir takım yetenekler gibi şeyleri ölçmede başarısız olur. Bununla birlikte, bir IQ sınavındaki puanınız, yaşamınızın birçok aşamasında kritik olabilecek problemleri düşünme, sebep etme ve çözme yeteneğinin oldukça doğru bir göstergesidir.

Psikoloji alanında kullanılan ilk zeka testleri

Binet ve Simon tarafından tasarlanan ölçekler, 20. yüzyılın başında yaygın olarak kabul edilen ilk akıllı testlerdi. I. Dünya Savaşı’nda askeri personeli değerlendirmek için kullanılan Alfa ve Beta ordusu testleri çok popüler oldu.

Son yıllarda, Wechsler ölçekleri, zeka ölçmek için psikoloji alanında en yaygın kullanılan araçlardır. Bu testlerin tasarımcısı Wechsler, ilk ölçeğini 1930’larda yayınladı. Testini yapmak için Binet Alpha ve Beta testlerinden materyaller kullandı. Testinin önemli bir özelliği, IQ hesaplanırken bu testin dikkate alınmasıydı. Diğer bir deyişle, IQ hesaplamasında yaş düzeltmesi yapılır. Bu özellik nedeniyle, IQ ömrü boyunca sabit kalır.

Zeka Bölümü (IQ)

IQ, Intelligence Quotient’in kısaltmasıdır. Peki IQ nedir? IQ, zekanızın bir ölçüsüdür ve bir sayıyla ifade edilir.

Bir kişinin IQ’si, kişinin bir zeka testi yaptırmasıyla hesaplanabilir. Ortalama IQ 100’dür. 100’den yüksek bir puan alırsanız, ortalama bir kişiden daha zekisin ve daha düşük bir puan (biraz) daha az akıllı olduğunuz anlamına gelir.

Bir IQ, yaş grubunuzla karşılaştırıldığında, belirli bir zeka testinde puanınızın ne olduğunu size söyler. Test ortalama 100 puan ve 15 puan standart sapmaya sahiptir. Bu standart sapma ne anlama geliyor? Bu, nüfusun yüzde 68’inin 85-115 aralığında bir IQ aldığı anlamına gelir. Nüfusun yüzde 95’i 70-130 aralığında puan alıyor.

Bazı örnekler

IQ’nuz 100 olduğunda bunun anlamı nedir? Bu, nüfusun yarısının sizden daha yüksek puan aldığı anlamına gelir. Diğer yarı puanlar senden daha düşük. 130 IQ’nuzun anlamı nedir? Bu, yaş grubunuzun yüzde 97,5’inin sizden düşük olduğu anlamına gelir. Sadece yüzde 2,5 puan daha yüksek.

IQ puanı anlamında daha fazla puan açıklayan hoş bir grafiğe bakınız .

IQ testinin tarihçesi

Paul Broca (1824-1880) ve Sir Francis Galton (1822-1911) istihbarat ölçmeyi düşünen ilk bilim insanları arasındaydı. İnsan kafatasının boyutunu ölçerek zekayı belirleyebileceklerini düşünüyorlardı. Kafatasının büyüdükçe, kişinin daha zeki olduğunu varsaydılar.

Aynı zamanda, bilim adamı Wilhelm Wundt (1932-1920) istihbarat ölçüsü olarak iç gözlem – insanın kendi düşüncelerini yansıtma yeteneği – kullandı. Bugünlerde metotları ve fikirlerinin modası geçmiş olduğu düşünülmekte ve artık IQ testleri için kullanılmamaktadır, ancak IQ testi tarihinin temel bir bölümünü oluşturmaktadır .

İlk ‘gerçek’ IQ testi

IQ tarihindeki ilk modern zeka testi, 1904’te Alfred Binet (1857-1911) ve Theodore Simon (1873-1961) tarafından geliştirilmiştir. Fransız Eğitim Bakanlığı bu araştırmacılardan zihinsel engelli çocukların normal zeki fakat tembel çocuklardan ayırt edilmesini sağlayacak bir test geliştirmelerini istedi. Sonuç, Simon-Binet IQ testi oldu. Bu IQ testi, mantıksal akıl yürütme, kafiyeli sözcükleri bulma ve nesneleri adlandırma gibi çeşitli bileşenlerden oluşur.

IQ testinin skoru, çocuğun yaşı ile birlikte, çocuğun entelektüel gelişimi hakkında bilgi sağlar: Çocuk diğer çocuklardan önce mi, yoksa onu mı geciktiriyor? IQ (zihinsel yaş / kronolojik yaş) X 100 olarak hesaplandı. Test, hem Avrupa hem de Amerika’da büyük bir başarıya ulaştı.