26 версия Android SDK принесла новые возможности в наши Андроид приложения, включая шрифты как ресурсы, загружаемые шрифты, поддержка эмоджи, автоматические размеры TextView, управляемые физикой анимации через Spring and Fling, обратная совместимость для векторных анимаций, и уменьшения библиотеки при помощи повышения минимальной версии sdk до 14.

Если вы не знакомы с Android Support Library, то знайте, что вам нужно компилировать приложение на том же уровне Android API, что и последняя версия Android Support Library. Другими словами, убедитесь, что тег TargetFramework установлен на 8.0 (API 26). В таком случае приложения скомпилируется при помощи последней версии Android Support Library(V26).

Поддержка шрифтов в XML


Теперь вы можете помещать шрифты в новую папку ресурсов шрифта font. Используйте Resources.GetFont или ResourcesCompat.GetFont, чтобы скачать ресурсы шрифта в ваше приложение.

Пример: определение шрифта в XML в папке Resourcesfont:

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


Использование ресурса шрифта в View:

<TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:fontFamily="@font/lobster"/>



Скачиваемые шрифты


Есть новый класс FontsContractCompat, который позволит вам запрашивать шрифты у провайдера шрифтов вместо пакетирования их внутри вашего приложения. Вы можете использовать провайдер шрифтов из Google Fonts (800+шрифтов).

Чтобы использовать его, сначала создайте FontRequest:


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


Во-вторых, вам нужно зарегистрировать FontRequestCallback, который внедряет OnTypefaceRetrieved(Android.Graphics.Typeface typeface) и OnTypefaceRequestFailed(int reason). Мы создали один, который вы можете использовать, в этом примере:


FontsContractCompat.FontRequestCallback callback = new FontRequestCallbackImpl
{
    mActivity = this,
    mDownloadableFontTextView = DownloadableFontTextView,
    mRequestDownloadButton = RequestDownloadButton,
    mProgressBar = progressBar
};
 

Наконец, вам нужно запросить шрифт:

FontsContractCompat.RequestFont(this, request, callback, GetHandlerThreadHandler());

Вы можете также запросить шрифт непосредственно в XML:


<font-family xmlns:android="http://schemas.android.com/apk/res/android"
    android:fontProviderAuthority="com.google.android.gms.fonts"
    android:fontProviderPackage="com.google.android.gms"
    android:fontProviderQuery="Lobster Two"
    android:fontProviderCerts="@array/com_google_android_gms_fonts_certs" />
 


Совместимость с эмодзи


Вспомогательная библиотека EmojiCompat позволит вашим устройствам пользоваться самыми новыми эмодзи, не требуя обновления Android OS. Это помогает избежать изображения надоевших пустых квадратиков (?)!
EmojiCompat имеет две основных библиотеки: скачиваемую или пакетную.

Скачиваемая


Как было отмечено выше в разделе «Скачиваемые шрифты» этого поста, сначала вам нужно сформировать FontRequest, чтобы создать FontRequestEmojiCompatConfig.


EmojiCompat.Config config;
 
var fontRequest = new FontRequest(
    "com.google.android.gms.fonts",
    "com.google.android.gms",
    "Noto Color Emoji Compat",
    Resource.Array.com_google_android_gms_fonts_certs);
 
config = new FontRequestEmojiCompatConfig(this, fontRequest)
    .SetReplaceAll(true)
    .RegisterInitCallback(new InitCallbackImpl());


Пакетная


Пакетная библиотека делает жизнь немного легче примерно за 7 Мбит пакетного шрифта. Все, что вам нужно, это создать BundledEmojiCompatConfig:


EmojiCompat.Config config;
 
config = new BundledEmojiCompatConfig(this);


Эмодзи виджеты


Библиотека EmojiCompat обеспечивает нас тремя основными элементами для отображения эмодзи:

EmojiTextView, EmojiEditTExt, и EmojiButton

Автоматический выбор размера TextView


Ваш TextView теперь автоматически увеличивает размер текста, когда увеличивается контейнер. Есть три способа, которыми вы можете задать автоматический выбор размера TextView, и они объяснены ниже.

Начните с описания android:autoSizeTextType как uniform.


<TextView
    android:layout_width="match_parent"
    android:layout_height="200dp"
    app:autoSizeTextType="uniform" />


Степень разбивки


Вы можете также определить диапазон между минимальным и максимальным размером текста для вашего TextView. Он может также увеличиваться пошагово согласно заданной вами степени разбивки.


<TextView
    android:layout_width="match_parent"
    android:layout_height="200dp"
    app:autoSizeTextType="uniform"
    app:autoSizeMinTextSize="12sp"
    app:autoSizeMaxTextSize="100sp"
    app:autoSizeStepGranularity="2sp" />
 

Задание размеров


Наконец, вы можете указать все значения, которые TextView может использовать при автоматическом выборе размера. Вы можете указать ресурс массива ранее заданных размеров:


<resources>
  <array name="autosize_text_sizes">
    <item>10sp</item>
    <item>12sp</item>
    <item>20sp</item>
    <item>40sp</item>
    <item>100sp</item>
  </array>
</resources>


Теперь вам нужно только указать значение android:autoSizePresetSizes для массива, который мы уже создали:

<TextView
    android:layout_width="match_parent"
    android:layout_height="200dp"
    app:autoSizeTextType="uniform"
    app:autoSizePresetSizes="@array/autosize_text_sizes" />
 


Динамическая анимация


Теперь вы можете использовать анимацию на основе скорости вместо анимации на основе длительности. Такая анимация выглядит более натурально, с движениями, которые имитируют резкое движение или пружину.

Чтобы создать нашу первую динамическую анимацию, создайте новый объект SpringAnimation, используя View, ViewProperty и finalPosition.

SpringAnimation animX = new SpringAnimation(box, DynamicAnimation.TranslationX, 0);
Есть две основных концепции, которые вы можете задать для пружины: Stiffness и DampingRatio.

Stiffness определяет, как быстро пружина возвращается в исходное состояние, а DampingRatio определяет, насколько пружина упругая.

animX.Spring.SetStiffness(Stiffness);
animX.Spring.SetDampingRatio(Damping);


Затем вы можете задать вашу скорость StartVelocity и запустить(Start) анимацию!


animX.SetStartVelocity(velocityTracker.XVelocity);
animX.Start();


AnimatedVectorDrawableCompat (бонус)


Если вы не знаете о AnimatedVectorDrawableCompat, то это красивая стильная библиотека для переходов между путями и интерполяции вдоль пути с целью создания ошеломляющих анимаций, трансформации логотипов и многого другого. Все они теперь привязаны к API 14, который позволяет этим красивым анимационным векторам работать с более старыми устройствами.



Вы можете создать ваши собственные красивые анимации в векторной графике с помощью XML, создав элемент animated-vector и приложив pathInterpolators к определенному objectAnimator. Если вы не лучший аниматор на свете, вы можете начать здесь с помощью инструмента Алекса Локвуда:



Выводы


Есть много хороших характеристик, которые Android предоставляет в пределах своих вспомогательных библиотек, которые вы можете использовать при разработке приложений на Xamarin. Эти характеристики обычно совместимы с предыдущими версиями minSdkVersion, которые определяются вспомогательной библиотекой. Теперь у вас есть шанс исследовать, что вспомогательные библиотеки могут дать вашим приложениям!

Источник: статья Джона Дугласа «Android Support Library v26 Overview» от 2 октября 2017 года.

Комментарии (5)


  1. uploadfor
    12.02.2018 12:16

    Другими словами, убедитесь, что тег TargetFramework установлен на 8.0 (API 26). В таком случае приложения скомпилируется при помощи последней версии Android Support Library(V26).

    Напомните, пожалуйста, какая версия Android потребуется потом для работы с таким порогом? Про Kit-Kat можно будет забыть?

    p.s.
    Я старый брюзга, поэтому не могу удержаться: публиковать текстовый код в jpg-е — это как снимать происходящее на видео прямо с экрана. Два котла для таких наверняка объединены в один ;)


    1. wrewolf
      12.02.2018 14:42

      targetSdkVersion это не minSdkVersion, ну и последние версии сейчас 27.х (8.1)


    1. Suvitruf
      13.02.2018 11:04

      Это ж Support Library. Для работы минимум 14 или 15 версия SDK нужна.


  1. wrewolf
    12.02.2018 14:42

    промахнулся


  1. 121212121
    12.02.2018 20:59

    Думал, что Wuala вернулась, ан нет.
    Не серчайте, что не по теме.
    Уж больно лого ваш знаком.