کانال بله, جهت پشتیبانی و اطلاع رسانی کانال بله, جهت پشتیبانی و اطلاع رسانی
عضویت

آموزش Xamarin-فونت ها- قسمت 7

آموزش Xamarin-فونت ها- قسمت 7

بررسی اجمالی

با استفاده از API سطح 26، Android SDK اجازه می دهد تا فونت ها به عنوان منابع، مانند یک layouts و یا drawables مورد استفاده قرار گیرد. "Android Support Library 26 NuGet" API جدید فونت را به آن برنامه هایی که سطح API 14 یا بالاتر را هدف قرار می دهند، پشتیبانی می کند.
پس از هدفگیری API 26 یا نصب "Android Support Library v26" دو راه برای استفاده از فونت ها در یک برنامه Android وجود دارد:

  1. فونت را به عنوان یک منبع اندروید Package کنید - این تضمین می کند که فونت همیشه در دسترس برنامه است، اما حجم APK را افزایش می دهد.
  2. فونت ها را دانلود کنید - Android همچنین از دانلود یک فونت از " font provider"پشتیبانی می کند. " font provider" بررسی می کند که آیا فونت در حال حاضر در دستگاه وجود دارد یا خیر. در صورت لزوم، فونت در دستگاه دانلود و ذخیره می شود. این فونت را می توان بین برنامه های متعدد به اشتراک گذاشت.

فونت های مشابه (یا فونت هایی که ممکن است دارای چند سبک مختلف باشند) ممکن است به " font families" گروه بندی شوند. این به توسعه دهندگان اجازه می دهد ویژگی های مشخصی از فونت را مشخص کند مانند وزن آن، و آندروید به طور خودکار فونت مناسب را از " font family" انتخاب می کند.
"Android Support Library v26" پشتیبانی از فونت ها را به " API level 26" پشتیبانی می کند. هنگامی که سطح API های قدیمی را هدف قرار می دهید، لازم است فضای نامی برای " app" XML تعریف کنیم و نام ویژگی های مختلف فونت را با استفاده از android: namespace و app: namespace تعیین کنیم. اگر فقط از "android: namespace" استفاده شود،پس از آن فونت ها در دستگاه هایی که از API level 25 یا کمتر استفاده می کنند ،نمایش داده نمی شود. مثلا، این قطعه کد XML یک منبع جدید « font family» را که در « API level 14 » و بالاتر کار می کند، اعلام می کند:

< ?xml version="1.0" encoding="utf-8"? >
< font-family 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto" >
     < font  android:font="@font/sourcesanspro_regular" 
            android:fontStyle="normal" 
            android:fontWeight="400"
            app:font="@font/sourcesanspro_regular" 
            app:fontStyle="normal" 
            app:fontWeight="400" / >
< /font-family >

تا زمانیکه فونتها به شیوه ای مناسب به یک برنامه Android ارائه شده باشند، آنها می توانند به ویجت UI با تنظیم ویژگی fontFamily اعمال شوند. برای مثال، قطعه کد زیر نشان می دهد که چگونه یک فونت را در TextView نمایش دهید:

< TextView
    android:text="The quick brown fox jumped over the lazy dog."
    android:fontFamily="@font/caveat_bold"
    app:fontFamily="@font/caveat_bold"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" / >

این راهنما ابتدا در مورد چگونگی استفاده از فونت ها به عنوان یک "منبع آندروید" بحث می کندو سپس به بحث در مورد چگونگی دانلود فونت در زمان اجرا حرکت می کند.

فونت ها به عنوان یک منبع

Package کردن یک فونت به یک APK Android، تضمین می کند که همیشه برای برنامه در دسترس است. یک فایل فونت (یا یک TTF یا یک فایل TOF) به یک برنامه Xamarin.Android مانند هر منبع دیگر اضافه می شود، با کپی کردن فایل ها به زیر پوشه در پوشه Resources یک پروژه Xamarin.Android. منابع فونت در زیر پوشه فونت پوشه منابع پروژه نگهداری می شوند.

توجه :

فونت ها باید " Build Action " از "AndroidResource" داشته باشند یا در APK نهایی package نشوند. build action باید به طور خودکار توسط IDE تنظیم شود.

هنگامی که بسیاری از فونت های مشابه فونت وجود دارد (به عنوان مثال، فونت مشابه با وزن و سبک های مختلف)، ممکن است آنها را به یک خانواده فونت(font family) دسته بندی کنید.

خانواده فونت(Font Families)

یک خانواده فونت مجموعه ای از فونت هایی است که دارای وزن و سبک متفاوت هستند. مثلا، ممکن است فونت های جداگانه ای برای فونت های bold یا italic وجود داشته باشد. خانواده فونت توسط عناصر فونت در یک فایل XML تعریف می شوند که در دایرکتوری «Resources / font» نگهداری می شود. هر خانواده فونت باید فایل XML خود را داشته باشد.
برای ایجاد یک خانواده فونت، ابتدا تمام فونتها را به پوشه « Resources/font » اضافه کنید. سپس یک فایل XML جدید در پوشه فونت برای خانواده فونت ایجاد کنید. این فایل XML یک عنصر اصلی "font-family" دارد که حاوی یک یا چند عنصر "font" است. هر عنصر " font " ویژگی های فونت را اعلام می کند.
XML زیر یک نمونه از یک خانواده فونت برای فونت Sources Sans Pro است که بسیاری از وزنهای مختلف فونت را تعریف می کند. این به عنوان فایل در پوشه "Resources / font" به نام "sourcesanspro.xml" ذخیره شده است:

< ?xml version="1.0" encoding="utf-8"? >
< font-family xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:app="http://schemas.android.com/apk/res-auto" >
    < font android:font="@font/sourcesanspro_regular" 
          android:fontStyle="normal" 
          android:fontWeight="400"
          app:font="@font/sourcesanspro_" 
          app:fontStyle="normal" 
          app:fontWeight="400" / >
    < font android:font="@font/sourcesanspro_bold" 
          android:fontStyle="normal" 
          android:fontWeight="800" 
          app:font="@font/sourcesanspro_bold" 
          app:fontStyle="normal" 
          app:fontWeight="800" / >
    < font android:font="@font/sourcesanspro_italic" 
          android:fontStyle="italic" 
          android:fontWeight="400"
          app:font="@font/sourcesanspro_italic" 
          app:fontStyle="italic" 
          app:fontWeight="400" / >
< /font-family >

ویژگی fontStyle دارای سه مقدار ممکن است:

  • normal - یک فونت normal است.
  • Italic - یک فونت Italic است.
  • bold - یک فونت bold است.

ویژگی fontWeight مربوط به ویژگی CSS font-weight است و به ضخامت فونت اشاره دارد.

  • Thin – 100
  • Extra Light – 200
  • Light – 300
  • Normal – 400
  • Medium – 500
  • Semi Bold – 600
  • Bold – 700
  • Extra Bold – 800
  • Black – 900

هنگامی که یک خانواده فونت تعریف شده است، می توان آن را با استفاده از ویژگی های fontFamily، textStyle و fontWeight در فایل layout ، تنظیم و تعریف کرد. به عنوان مثال قطعه کد XML زیر یک weight font 400 (معمولی) و سبک متن Italic را تنظیم می کند:

< TextView
    android:text="Sans Source Pro semi-bold italic, 600 weight, italic"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:fontFamily="@font/sourcesanspro"
    android:textAppearance="?android:attr/textAppearanceLarge"
    android:gravity="center_horizontal"
    android:fontWeight="600"
    android:textStyle="italic"
    / >

برنامه نویسی اختصاصی فونت

فونت ها با استفاده از روش "Resources.GetFont" برای بازیابی یک شی "Typeface" می توانند از نظر برنامه نویسی تنظیم شوند. بسیاری از views ها یک ویژگی TypeFace دارند که می تواند برای اختصاص فونت به ویجت استفاده شود. این قطعه کد نشان می دهد که چگونه فونت را به صورت برنامه نویسی روی TextView تنظیم کنید:

Android.Graphics.Typeface typeface = this.Resources.GetFont(Resource.Font.caveat_regular);
textView1.Typeface = typeface;
textView1.Text = "Changed the font";

روش GetFont به صورت خودکار اولین فونت درون یک خانواده فونت را بارگذاری می کند. برای بارگذاری یک فونت که با یک سبک خاص مطابقت دارد، از روش Typeface.Create استفاده کنید. این روش سعی خواهد کرد یک فونت را که مطابق با سبک مشخص شده است بارگیری کند. به عنوان مثال، این قطعه سعی خواهد کرد یک شیء "Typeface" bold را از یک خانواده فونت که در " Resources/fonts " تعریف شده است بارگذاری کند:

var typeface = Typeface.Create("< FONT FAMILY NAME >", Android.Graphics.TypefaceStyle.Bold);
textView1.Typeface = typeface;

دانلود فونت

به جای package کردن فونت به عنوان یک منبع برنامه، آندروید می تواند فونت ها را از یک منبع از راه دور دانلود کند.این کار اثر مطلوبی برای کاهش اندازه APK دارد.
فونت ها با کمک یک « font provider » دانلود می شوند. این یک ارائه دهنده محتوای تخصصی است که دانلود و ذخیره فونت در تمام برنامه های موجود در دستگاه را مدیریت می کند. آندروید 8.0 شامل " font provider " برای دانلود فونت از " Google Font Repository " است. این ارائه دهنده فونت پیش فرض به"API Level 14" با " Android Support Library v26 " پشتیبانی می شود.
هنگامی که برنامه یک درخواست برای یک فونت ایجاد می کند، " font provider " برای اولین بار بررسی خواهد کرد که آیا فونت در حال حاضر در دستگاه وجود دارد یا نه. اگر نه، پس از آن تلاش خواهد کرد که فونت را دانلود کند.اگر فونت را نتواند دانلود کند سپس آندروید از فونت پیش فرض سیستم استفاده خواهد کرد. هنگامی که فونت دانلود شده است، نه تنها برنامه ای که درخواست اولیه را انجام داده بلکه همه برنامه های موجود در دستگاه این فونت در دسترس می توانند داشته باشند.
هنگامی که یک درخواست برای دانلود یک فونت ساخته شده است، برنامه به طور مستقیم از font provider درخواست نمی کند. در عوض، برنامه ها از یک نمونه از API FontsContract استفاده خواهند کرد (و یا از "FontsContractCompat"، اگر از Support Library 26 استفاده شود).
آندروید 8.0 از دانلود فونت ها به دو صورت پشتیبانی می کند:

  1. اعلام فونت های قابل دانلود به عنوان یک منبع - برنامه ممکن است فونت های قابل دانلود را به آندروید از طریق فایل های XML resource اعلام کند. این فایل ها شامل meta-data هایی است که آندروید نیاز به فونت ها را به صورت یکپارچه پس از بارگیری برنامه و ذخیره آن بر روی دستگاه ذخیره می کند.
  2. برنامه نویسی - APIs ها در " Android API level 26 " به یک برنامه برای دانلود فونت به صورت برنامه نویسی، در حالی که برنامه در حال اجرا است اجازه می دهد. برنامه ها یک شی FontRequest برای یک فونت مشخص ایجاد می کنند و این شی را به کلاس FontsContract منتقل می کنند. FontsContract درواقع FontRequest را می گیرد و فونت را از " font provider " بازیابی می کند. آندروید همزمان فونت را دانلود خواهد کرد. یک نمونه از ایجاد FontRequest بعدا در این راهنما نشان داده می شود.
  3. صرف نظر از اینکه کدام رویکرد استفاده شده است، " resources files " باید قبل از اینکه فونت ها بتوانند "دانلود" شوند به برنامه Xamarin.Android اضافه شود. اول، فونت (ها) باید در یک "فایل XML" در پوشه " Resources/font " به عنوان بخشی از یک خانواده فونت اعلام شود. این قطعه کد نمونه ای از نحوه بارگیری فونت ها از " Google Fonts Open Source collection " با استفاده " font provider " از پیش فرض است که همراه با "Android 8.0 (یا پشتیبانی از کتابخانه v26)" است:
    < ?xml version="1.0" encoding="utf-8"? >
    < font-family xmlns:android="http://schemas.android.com/apk/res/android"
                 xmlns:app="http://schemas.android.com/apk/res-auto"
                 android:fontProviderAuthority="com.google.android.gms.fonts" 
                 android:fontProviderPackage="com.google.android.gms" 
                 android:fontProviderQuery="VT323" 
                 android:fontProviderCerts="@array/com_google_android_gms_fonts_certs"
                 app:fontProviderAuthority="com.google.android.gms.fonts" 
                 app:fontProviderPackage="com.google.android.gms" 
                 app:fontProviderQuery="VT323"
                 app:fontProviderCerts="@array/com_google_android_gms_fonts_certs"
         >
    < /font-family >
    

عنصر "font-family" دارای ویژگی های زیر است؛ اعلام اطلاعاتی که آندروید برای دانلود فونت ها نیاز دارد:

  • fontProviderAuthority : به Font Provider اختیار می دهد تا از درخواست استفاده کند.
  • fontPackage : package برای Font Provider استفاده می شود تا بتواند از درخواست استفاده کند. این برای تایید هویت ارائه دهنده مورد استفاده قرار می گیرد.
  • fontQuery : این یک string است که به " font provider" کمک می کند فونت درخواست شده را پیدا کند. جزئیات در " font query" اختصاص به font provider دارد. کلاس "QueryBuilder" در نمونه "Fonts Downloadable" نمونه ای از اطلاعات مربوط به فرمت پرس و جو برای فونت های " Google Fonts Open Source Collection" را فراهم می کند.
  • fontProviderCerts - یک آرایه منبع با لیست مجموعه ای از hashesها برای گواهی هایی که باید به ارائه دهنده ارائه شود.

پس از تعریف فونت ها، ممکن است لازم باشد اطلاعاتی درباره « font certificates» مربوط به دانلود ارائه شود.

گواهینامه فونت(Font Certificates)

اگر ارائه دهنده فونت در دستگاه از پیش نصب نشده باشد، یا اگر برنامه از کتابخانه Xamarin.Android.Support.Compat استفاده می کند، Android نیاز به گواهی های امنیتی ارائه دهنده فونت دارد. این گواهینامه ها در یک فایل " array resource" که در دایرکتوری " Resources/values" نگهداری می شود ذکر شده است. به عنوان مثال، XML زیر به نام " Resources/values/fonts_cert.xml" نامیده می شود و گواهینامه های " Google font provider" را ذخیره می کند:

< ?xml version="1.0" encoding="utf-8"? >
< resources >
    < array name="com_google_android_gms_fonts_certs" >
        < item >@array/com_google_android_gms_fonts_certs_dev< /item >
        < item >@array/com_google_android_gms_fonts_certs_prod< /item >
    < /array >
    < string-array name="com_google_android_gms_fonts_certs_dev" >
        < item >
            MIIEqDCCA5CgAwIBAgIJANWFuGx90071MA0GCSqGSIb3DQEBBAUAMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTAeFw0wODA0MTUyMzM2NTZaFw0zNTA5MDEyMzM2NTZaMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbTCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBANbOLggKv+IxTdGNs8/TGFy0PTP6DHThvbbR24kT9ixcOd9W+EaBPWW+wPPKQmsHxajtWjmQwWfna8mZuSeJS48LIgAZlKkpFeVyxW0qMBujb8X8ETrWy550NaFtI6t9+u7hZeTfHwqNvacKhp1RbE6dBRGWynwMVX8XW8N1+UjFaq6GCJukT4qmpN2afb8sCjUigq0GuMwYXrFVee74bQgLHWGJwPmvmLHC69EH6kWr22ijx4OKXlSIx2xT1AsSHee70w5iDBiK4aph27yH3TxkXy9V89TDdexAcKk/cVHYNnDBapcavl7y0RiQ4biu8ymM8Ga/nmzhRKya6G0cGw8CAQOjgfwwgfkwHQYDVR0OBBYEFI0cxb6VTEM8YYY6FbBMvAPyT+CyMIHJBgNVHSMEgcEwgb6AFI0cxb6VTEM8YYY6FbBMvAPyT+CyoYGapIGXMIGUMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEQMA4GA1UEChMHQW5kcm9pZDEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDEiMCAGCSqGSIb3DQEJARYTYW5kcm9pZEBhbmRyb2lkLmNvbYIJANWFuGx90071MAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEEBQADggEBABnTDPEF+3iSP0wNfdIjIz1AlnrPzgAIHVvXxunW7SBrDhEglQZBbKJEk5kT0mtKoOD1JMrSu1xuTKEBahWRbqHsXclaXjoBADb0kkjVEJu/Lh5hgYZnOjvlba8Ld7HCKePCVePoTJBdI4fvugnL8TsgK05aIskyY0hKI9L8KfqfGTl1lzOv2KoWD0KWwtAWPoGChZxmQ+nBli+gwYMzM1vAkP+aayLe0a1EQimlOalO762r0GXO0ks+UeXde2Z4e+8S/pf7pITEI/tP+MxJTALw9QUWEv9lKTk+jkbqxbsh8nfBUapfKqYn0eidpwq2AzVp3juYl7//fKnaPhJD9gs=
        < /item >
    < /string-array >
    < string-array name="com_google_android_gms_fonts_certs_prod" >
        < item >
            MIIEQzCCAyugAwIBAgIJAMLgh0ZkSjCNMA0GCSqGSIb3DQEBBAUAMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDAeFw0wODA4MjEyMzEzMzRaFw0zNjAxMDcyMzEzMzRaMHQxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRQwEgYDVQQKEwtHb29nbGUgSW5jLjEQMA4GA1UECxMHQW5kcm9pZDEQMA4GA1UEAxMHQW5kcm9pZDCCASAwDQYJKoZIhvcNAQEBBQADggENADCCAQgCggEBAKtWLgDYO6IIrgqWbxJOKdoR8qtW0I9Y4sypEwPpt1TTcvZApxsdyxMJZ2JORland2qSGT2y5b+3JKkedxiLDmpHpDsz2WCbdxgxRczfey5YZnTJ4VZbH0xqWVW/8lGmPav5xVwnIiJS6HXk+BVKZF+JcWjAsb/GEuq/eFdpuzSqeYTcfi6idkyugwfYwXFU1+5fZKUaRKYCwkkFQVfcAs1fXA5V+++FGfvjJ/CxURaSxaBvGdGDhfXE28LWuT9ozCl5xw4Yq5OGazvV24mZVSoOO0yZ31j7kYvtwYK6NeADwbSxDdJEqO4k//0zOHKrUiGYXtqw/A0LFFtqoZKFjnkCAQOjgdkwgdYwHQYDVR0OBBYEFMd9jMIhF1Ylmn/Tgt9r45jk14alMIGmBgNVHSMEgZ4wgZuAFMd9jMIhF1Ylmn/Tgt9r45jk14aloXikdjB0MQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzEUMBIGA1UEChMLR29vZ2xlIEluYy4xEDAOBgNVBAsTB0FuZHJvaWQxEDAOBgNVBAMTB0FuZHJvaWSCCQDC4IdGZEowjTAMBgNVHRMEBTADAQH/MA0GCSqGSIb3DQEBBAUAA4IBAQBt0lLO74UwLDYKqs6Tm8/yzKkEu116FmH4rkaymUIE0P9KaMftGlMexFlaYjzmB2OxZyl6euNXEsQH8gjwyxCUKRJNexBiGcCEyj6z+a1fuHHvkiaai+KL8W1EyNmgjmyy8AW7P+LLlkR+ho5zEHatRbM/YAnqGcFh5iZBqpknHf1SKMXFh4dd239FJ1jWYfbMDMy3NS5CTMQ2XFI1MvcyUTdZPErjQfTbQe3aDQsQcafEQPD+nqActifKZ0Np0IS9L9kR/wbNvyz6ENwPiTrjV2KRkEjH78ZMcUQXg0L3BYHJ3lc69Vs5Ddf9uUGGMYldX3WfMBEmh/9iFBDAaTCK
        < /item >
    < /string-array >
< /resources >

با استفاده از این فایل های منبع در محل، برنامه قادر به دانلود فونت ها است.

اعلام فونت های قابل دانلود به عنوان منابع

با فهرست کردن فونت های قابل دانلود در "AndroidManifest.XML"، زمانی که برنامه برای اولین بار شروع می شود آندروید به صورت ناهمزمان فونت ها را دانلود می کند. خود فونت در یک فایل منبع آرایه لیست شده است، شبیه به این یکی است:

< ?xml version="1.0" encoding="utf-8"? >
< resources >
    < array name="downloadable_fonts" translatable="false" >
        < item >@font/vt323< /item >
    < /array >
< /resources >

برای دانلود این فونت ها، آنها باید با اضافه کردن "meta-data" به عنوان یک child از عنصر "application" در "AndroidManifest.XML" اعلام شوند. به عنوان مثال، اگر فونت های دانلود شده در یک فایل منبع در Resources/values/downloadable_fonts.xml درج شده است سپس این قطعه کد باید به مانیفست اضافه شود:

< meta-data android:name="downloadable_fonts" android:resource="@array/downloadable_fonts" / >

دانلود فونت با "API Font"

ممکن است به صورت برنامه نویسی یک فونت را با نمونه برداری یک شی FontRequest و انتقال آن به روش FontContractCompat.RequestFont دانلود کنید. روش FontContractCompat.RequestFont برای اولین بار بررسی خواهد کرد که آیا فونت در دستگاه وجود دارد یا نه ، و سپس در صورت لزوم به صورت query ناهمزمان " font provider " استفاده و سعی کنید فونت را برای برنامه دانلود کنید. اگر "FontRequest" قادر به دانلود فونت نیست، آندروید از فونت پیش فرض سیستم استفاده خواهد کرد.
یک شی FontRequest حاوی اطلاعاتی است که توسط ارائه کننده فونت برای پیدا کردن و دانلود فونت استفاده می شود. FontRequest نیاز به چهار بخش اطلاعات دارد:

  1. Font Provider Authority : به Font Provider اختیار می دهد تا از درخواست استفاده کند.
  2. fontPackage : package برای Font Provider استفاده می شود تا بتواند از درخواست استفاده کند. این برای تایید هویت ارائه دهنده مورد استفاده قرار می گیرد.
  3. fontQuery : این یک string است که به " font provider" کمک می کند فونت درخواست شده را پیدا کند. جزئیات در " font query" اختصاص به font provider دارد. کلاس "QueryBuilder" در نمونه "Fonts Downloadable" نمونه ای از اطلاعات مربوط به فرمت پرس و جو برای فونت های " Google Fonts Open Source Collection" را فراهم می کند.
  4. fontProviderCerts - یک آرایه منبع با لیست مجموعه ای از hashesها برای گواهی هایی که باید به ارائه دهنده ارائه شود.

این قطعه کد نمونه ای از نمونه سازی یک شی جدید "FontRequest" است:

FontRequest request = new FontRequest("com.google.android.gms.fonts", "com.google.android.gms", < FontToDownload >, Resource.Array.com_google_android_gms_fonts_certs);

در قطعه کد قبلی "FontToDownload" یک query است که به فونت از " Google Fonts Open Source collection" کمک خواهد کرد. قبل از انتقال "FontRequest" به روش FontContractCompat.RequestFont، دو شیء وجود دارد که باید ایجاد شوند:

  • FontsContractCompat.FontRequestCallback - این یک کلاس انتزاعی(abstract) است که باید گسترش یابد. این فراخوانی است که زمانی که RequestFont به پایان رسید فراخوانی شود. برنامه Xamarin.Android باید زیر کلاس "FontsContractCompat.FontRequestCallback" و OnTypefaceRequestFailed و OnTypefaceRetrieved نادیده بگیرد ، تا اقداماتی که باید انجام شود ، زمانی که دانلود به ترتیب انجام می شود یا موفق می شود ارائه شود .
  • Handler - این "Handler" است که در صورت لزوم توسط "RequestFont" برای دانلود فونت در یک موضوع مورد استفاده قرار می گیرد.فونت ها نباید بر روی UI دانلود شوند.

این قطعه نمونه ای از یک کلاس C # است که به طور غیرمستقیم فونت را از « Google Fonts Open Source collection » دانلود می کند. این رابط رابط FontRequestCallback را اجرا می کند و هنگامی که "FontRequest" به پایان رسید، رویداد C # را افزایش می دهد.

public class FontDownloadHelper : FontsContractCompat.FontRequestCallback
{
    // A very simple font query; replace as necessary
    public static readonly String FontToDownload = "Courgette";

    Android.OS.Handler Handler = null;

    public event EventHandler< FontDownloadEventArg > FontDownloaded = delegate
    {
        // just an empty delegate to avoid null reference exceptions.  
    };


    public void DownloadFonts(Context context)
    {
        FontRequest request = new FontRequest("com.google.android.gms.fonts", "com.google.android.gms",FontToDownload , Resource.Array.com_google_android_gms_fonts_certs);
        FontsContractCompat.RequestFont(context, request, this, GetHandlerThreadHandler());
    }

    public override void OnTypefaceRequestFailed(int reason)
    {
        base.OnTypefaceRequestFailed(reason);
        FontDownloaded(this, new FontDownloadEventArg(null));
    }

    public override void OnTypefaceRetrieved(Android.Graphics.Typeface typeface)
    {
        base.OnTypefaceRetrieved(typeface);
        FontDownloaded(this, new FontDownloadEventArg(typeface));
    }

    Handler GetHandlerThreadHandler()
    {
        if (Handler == null)
        {
            HandlerThread handlerThread = new HandlerThread("fonts");
            handlerThread.Start();
            Handler = new Handler(handlerThread.Looper);
        }
        return Handler;
    }
}


/// < summary >
/// EventArg when a font has been downloaded. 
/// < /summary >
public class FontDownloadEventArg : EventArgs
{
    public FontDownloadEventArg(Android.Graphics.Typeface typeface)
    {
        Typeface = typeface;
    }
    public Android.Graphics.Typeface Typeface { get; private set; }
    public bool RequestFailed
    {
        get
        {
            return Typeface != null;
        }
    }
}

برای استفاده از این helper ، یک "FontDownloadHelper" جدید ایجاد شده است و یک مدیر رویداد (event handler)اختصاص داده شده است:

var fontHelper = new FontDownloadHelper();

fontHelper.FontDownloaded += (object sender, FontDownloadEventArg e) => 
{
    //React to the request
};
fontHelper.DownloadFonts(this); // this is an Android Context instance.

خلاصه

این راهنما درباره API های جدید در آندروید 8.0 برای پشتیبانی از فونت های قابل دانلود و فونت ها به عنوان منابع مورد بحث قرار گرفت.این بحث در مورد چگونگی جاسازی فونت های موجود در یک APK و استفاده از آنها در یک layout صورت گرفت. همچنین در مورد اینکه چگونه آندروید 8.0 از دانلود فونت از یک ارائه دهنده فونت، یا برنامه نویسی و یا با اعلام meta-data های فونت در فایل های منبع پشتیبانی می کند بحث کرده ایم.

1397/04/16 2675 993
رمز عبور : tahlildadeh.com یا www.tahlildadeh.com
نظرات شما

نظرات خود را ثبت کنید...