Андроид вектор: 404  |  Page Not Found  |  Android Developers

VectorDrawable — часть первая / Хабр

Предлагаю вашему вниманию перевод статьи «VectorDrawables – Part 1» с сайта blog.stylingandroid.com.

По долгу службы потребовалось мне как-то разобраться с векторной графикой. Во время поиска наткнулся я на серию статей под названием “VectorDrawable” в блоге https://blog.stylingandroid.com/. Ответов на все интересующие меня вопросы я, конечно, не нашел, но статьи очень понравились своей последовательностью и четко выверенным объемом необходимого материала. Решил поделиться переводом этих статей с обитателями хабра.

Я не переводил названия, activity, bitmap и тому подобное, потому что считаю, что так легче воспринимать информацию, ведь разработчики, в силу профессии, эти слова в русском варианте практически никогда не у потребляют. Далее следует перевод:

Одна из действительно интересных новых фишек в Lollipop – это включение VectorDrawable и связанных с ним классов, которые обеспечивают чрезвычайно мощные новые возможности для добавления сложной векторной графики (позволяет гораздо удобнее масштабировать изображения не зависимо от размеров экрана и плотности, чем растровые изображения), а также предоставляет несколько мощных инструментов для анимации оных.

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

Векторная графика – способ описания графических элементов используя геометрические фигуры. Они особенно хорошо подходят для графических элементов, созданных в приложениях, таких как Adobe Illustrator или Inkscape, где простые геометрические формы могут быть объединены в гораздо более сложные элементы. Работа с растровой графикой, с другой стороны, определяет значение цвета для каждого пикселя и особенно хорошо подходит для фото. Большим преимуществом использования векторной графики (в соответствующих случаях) является то, что изображения рендерятся в рантайме и размеры автоматически высчитываются в зависимости от плотности пикселей. Таким образом получается четкая картинка с плавными линиями, независимо от возможностей устройства. Векторные картинки, как правило, занимают значительно меньший объем памяти, чем их растровый аналог.

Однако, векторные изображения требуют больше вычислительных мощностей для отрисовки, что может быть проблемой при большом количестве сложных графических элементах.

Векторная графика в андроиде была реализована с использованием нового класса – VectorDrawable, который был введен в Lollipop. Это означает, что для графических элементов, которые хорошо подходят для векторного представления мы можем заменить растровые изображения в папках mdpi, hdpi, xhdpi, xxhdpi, и xxxhdpi на один VectorDrawable в папке Drawable, который, с большой вероятностью, займет даже меньше пространства на диске, чем растровое изображение для mdpi.

Чтобы продемонстрировать это, давайте рассмотрим следующий файл svg (найти его можно по ссылке https://code.google.com/archive/p/svg-android/downloads):

Этот svg-файл занимает 2265 байт, если мы отрисуем его в bitmap с размерами 500 х 500 пикселей, и сохраним как png, тогда он займет уже 13272 байта, плюс к этому, мы должны будем использовать несколько таких картинок для разный плотностей экрана. Но SVG – это не то же самое, что VectorDrawable, поэтому мы не можем использовать его непосредственно. Тем не менее, VectorDrawable поддерживает некоторые элементы SVG. Основные компоненты, которые мы будем использовать из нашего SVG – это path. Давайте посмотрим на исходный код SVG:


android.svg
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 13.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 14948)  -->
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
     viewBox="0 0 500 500" enable-background="new 0 0 500 500" xml:space="preserve">
<g display="none">
    <path display="inline" d="M499.001,1v498h2V1h599.001 M500.001,0H0v500h500.001V0L500.001,0z"/>
</g>
<g>
    <path fill="#9FBF3B" d="M301.314,83.298l20.159-29.272c1.197-1.
74,0.899-4.024-0.666-5.104c-1.563-1.074-3.805-0.543-4.993,1.199 L294.863,80.53c-13.807-5.439-29.139-8.47-45.299-8.47c-16.16,0-31.496,3.028-45.302,8.47l-20.948-30.41 c-1.201-1.74-3.439-2.273-5.003-1.199c-1.564,1.077-1.861,3.362-0.664,5.104l20.166,29.272 c-32.063,14.916-54.548,43.26-57.413,76.34h318.316C355.861,126.557,333.375,98.214,301.314,83.298"/> <path fill="#FFFFFF" d="M203.956,129.438c-6.673,0-12.08-5.407-12.08-12.079c0-6.671,5.404-12.08,12.08-12.08 c6.668,0,12.073,5.407,12.073,12.08C216.03,124.03,210.624,129.438,203.956,129.438"/> <path fill="#FFFFFF" d="M295.161,129.438c-6.668,0-12.074-5.407-12.074-12.079c0-6.673,5.406-12.08,12.074-12.08 c6.675,0,12.079,5.409,12.079,12.08C307.24,124.03,301.834,129.438,295.161,129.438"/> <path fill="#9FBF3B" d="M126.383,297.598c0,13.45-10.904,24.354-24.355,24.354l0,0c-13.45,0-24.354-10.904-24.354-24.354V199.09 c0-13.45,10.904-24.354,24.354-24.354l0,0c13.451,0,24.355,10.904,24.
355,24.354V297.598z"/> <path fill="#9FBF3B" d="M140.396,175.489v177.915c0,10.566,8.566,19.133,19.135,19.133h32.633v54.744 c0,13.451,10.903,24.354,24.354,24.354c13.451,0,24.355-10.903,24.355-24.354v-54.744h47.371v54.744 c0,13.451,10.902,24.354,24.354,24.354s24.354-10.903,24.354-24.354v-54.744h32.633c10.569,0,19.137-8.562,19.137-19.133V175.489 h240.396z"/> <path fill="#9FBF3B" d="M372.734,297.598c0,13.45,10.903,24.354,24.354,24.354l0,0c13.45,0,24.354-10.904,24.354-24.354V199.09 c0-13.45-10.904-24.354-24.354-24.354l0,0c-13.451,0-24.354,10.904-24.354,24.354V297.598z"/> </g> </svg>

Немного разберемся. Есть некоторые атрибуты родительского элемента , которые определяют размер 500х500, Есть элемент (group), который определяет границы – его мы будем игнорировать. Есть еще один элемент с id = “android”. Это и есть изображение логотипа, которое нам нужно. Он состоит из шести элементов , которые определяют голову, правый глаз, левый глаз, левая рука, тело и ноги, правая рука.

Атрибут “fill” определяет цвет заливки (и мы можем видеть, что все они зеленые, за исключением глаз, которые залиты белым цветом), а атрибут “d” содержит маршрут линий, из которых состоит элемент. Для тех, кто хочет разобраться более детально в элементе , следует изучить SVG Path Specification, но для данной статьи это не важно, потому что мы можем просто взять их, как они есть, и использовать в наших VectorDrawables.

Итак, давайте создадим наш VectorDrawable:


res/drawable/android.xml
<?xml version="1.0" encoding="utf-8"?>
<vector xmlns:android="http://schemas.android.com/apk/res/android"
    android:viewportWidth="500"
    android:viewportHeight="500"
    android:width="500px"
    android:height="500px">
    <group android:name="android">
        <path
            android:name="head"
            android:fillColor="#9FBF3B"
            android:pathData="M301.314,83.298l20.159-29.272c1.197-1.74,0.899-4.024-0.666-5.104c-1.563-1.074-3. 805-0.543-4.993,1.199L294.863,80.53c-13.807-5.439-29.139-8.47-45.299-8.47c-16.16,0-31.496,3.028-45.302,8.47l-20.948-30.41c-1.201-1.74-3.439-2.273-5.003-1.199c-1.564,1.077-1.861,3.362-0.664,5.104l20.166,29.272c-32.063,14.916-54.548,43.26-57.413,76.34h318.316C355.861,126.557,333.375,98.214,301.314,83.298" />
        <path
            android:name="left_eye"
            android:fillColor="#FFFFFF"
            android:pathData="M203.956,129.438c-6.673,0-12.08-5.407-12.08-12.079c0-6.671,5.404-12.08,12.08-12.08c6.668,0,12.073,5.407,12.073,12.08C216.03,124.03,210.624,129.438,203.956,129.438" />
        <path
            android:name="right_eye"
            android:fillColor="#FFFFFF"
            android:pathData="M295.161,129.438c-6.668,0-12.074-5.407-12.074-12.079c0-6.673,5.406-12.08,12.074-12.08c6.675,0,12.079,5.409,12.079,12.08C307.24,124.03,301.834,129.438,295.161,129.438" />
        <path
            android:name="left_arm"
            android:fillColor="#9FBF3B"
            android:pathData="M126.
383,297.598c0,13.45-10.904,24.354-24.355,24.354l0,0c-13.45,0-24.354-10.904-24.354-24.354V199.09c0-13.45,10.904-24.354,24.354-24.354l0,0c13.451,0,24.355,10.904,24.355,24.354V297.598z" /> <path android:name="body" android:fillColor="#9FBF3B" android:pathData="M140.396,175.489v177.915c0,10.566,8.566,19.133,19.135,19.133h32.633v54.744c0,13.451,10.903,24.354,24.354,24.354c13.451,0,24.355-10.903,24.355-24.354v-54.744h47.371v54.744c0,13.451,10.902,24.354,24.354,24.354s24.354-10.903,24.354-24.354v-54.744h32.633c10.569,0,19.137-8.562,19.137-19.133V175.489h240.396z" /> <path android:name="right_arm" android:fillColor="#9FBF3B" android:pathData="M372.734,297.598c0,13.45,10.903,24.354,24.354,24.354l0,0c13.45,0,24.354-10.904,24.354-24.354V199.09c0-13.45-10.904-24.354-24.354-24.354l0,0c-13.451,0-24.354,10.904-24.354,24.354V297.598z" /> </group> </vector>

Мы создали родительский элемент , который содержит информацию о размерах изображения, внутрь которого поместили элемент с шестью элементами , которые были немного модифицированы, по сравнению с svg – файлом. В данной статье поле “name” служит только для облегчения понимая того, где какой элемент. В следующих статьях они буду использоваться. Получившийся файл по-прежнему может похвастаться скромным размером в 2412 байт.

Теперь мы можем использовать этот файл как любой другой drawable:


res/layout/activity_vector_drawables.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".VectorDrawablesActivity">

    <ImageView
        android:id="@+id/android"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/android"
        android:contentDescription="@null" />

</RelativeLayout>

… и если мы запустим это, то увидим красивую отрисовку:

Так что теперь мы можем существенно уменьшить размер APK, если мы используем VectorDrawable, где это уместно. Так же это позволяет упростить разработку приложения, особенно, если нужно добавлять поддержку новых плотностей экрана. Тем не менее, это не все, на что способен VectorDrawable. В следующей части статьи мы рассмотрим, как его анимировать.

Исходники к этой части статьи можно найти здесь.

Векторная анимация в приложениях android (Animated Vector Drawable) — Fandroid.info

package …;

 

import android.graphics.drawable.Animatable;

import android.graphics.drawable.Drawable;

import android.os.Bundle;

import android.support.design.widget.FloatingActionButton;

import android.support.design.widget.NavigationView;

import android.support.design.widget.Snackbar;

import android.support.v4.view.GravityCompat;

import android.support.v4.widget.DrawerLayout;

import android.support.v7.app.ActionBarDrawerToggle;

import android.support.v7.app.AppCompatActivity;

import android.support.v7.app.AppCompatDelegate;

import android. support.v7.widget.Toolbar;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.ImageView;

 

public class MainActivity extends AppCompatActivity

        implements NavigationView.OnNavigationItemSelectedListener {

    private ImageView mAnimAndroid;

 

    static {

        AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_AUTO);

    }

 

    @Override

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

        setSupportActionBar(toolbar);

 

        mAnimAndroid = (ImageView) findViewById(R.id.android_anim);

 

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);

        fab.setOnClickListener(new View. OnClickListener() {

            @Override

            public void onClick(View view) {

                Snackbar.make(view, «Replace with your own action», Snackbar.LENGTH_LONG)

                        .setAction(«Action», null).show();

            }

        });

 

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(

                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);

        drawer.setDrawerListener(toggle);

        toggle.syncState();

 

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);

        navigationView.setNavigationItemSelectedListener(this);

    }

 

    @Override

    protected void onResume() {

        super.onResume();

        Drawable drawable = mAnimAndroid.getDrawable();

        if (drawable instanceof Animatable){

            ((Animatable) drawable). start();

        }

 

 

    }

 

    @Override

    public void onBackPressed() {

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);

        if (drawer.isDrawerOpen(GravityCompat.START)) {

            drawer.closeDrawer(GravityCompat.START);

        } else {

            super.onBackPressed();

        }

    }

 

    @Override

    public boolean onCreateOptionsMenu(Menu menu) {

        // Inflate the menu; this adds items to the action bar if it is present.

        getMenuInflater().inflate(R.menu.main, menu);

        return true;

    }

 

    @Override

    public boolean onOptionsItemSelected(MenuItem item) {

        // Handle action bar item clicks here. The action bar will

        // automatically handle clicks on the Home/Up button, so long

        // as you specify a parent activity in AndroidManifest. xml.

        int id = item.getItemId();

 

        //noinspection SimplifiableIfStatement

        if (id == R.id.action_settings) {

            return true;

        }

 

        return super.onOptionsItemSelected(item);

    }

 

    @SuppressWarnings(«StatementWithEmptyBody»)

    @Override

    public boolean onNavigationItemSelected(MenuItem item) {

        // Handle navigation view item clicks here.

        int id = item.getItemId();

 

        if (id == R.id.nav_camera) {

            // Handle the camera action

        } else if (id == R.id.nav_gallery) {

 

        } else if (id == R.id.nav_slideshow) {

 

        } else if (id == R.id.nav_manage) {

 

        } else if (id == R.id.nav_share) {

 

        } else if (id == R.id.nav_send) {

 

        }

 

        DrawerLayout drawer = (DrawerLayout) findViewById(R. id.drawer_layout);

        drawer.closeDrawer(GravityCompat.START);

        return true;

    }

}

Vector для Google Android — MegaObzor

Истинную свободу дает только бег – безудержный, стремительный и головокружительный. Всем поклонникам паркура, преодоления препятствий, соревнований с сильными соперниками посвящается эта игра от Nekki. По своему классу она представляет собой аркаду, главный смысл которой убежать от погони. Сюжет начинается с того, что вам удалось вырваться из сетей тоталитарного режима и теперь вас преследует команда боевиков «Большого брата», задачей которых стало захватить вас и вернуть обратно.
По ходу сценария приходится осваивать сумасшедшие трюки, взбираться на отвесные стены, использовать особенности местности, прыжки и скольжения, словом, все, что можно отнести к так называемой технике ниндзя больших городов – паркуристов. Победа же достается тому, кто первый достигнет цели, и, если вы будете не столь же ловки, сколь ваши соперники, вы, естественно, проиграете.

Игрушка отличается достаточно несложным управлением, интуитивно понятным и доступным для быстрого осваивания игроком любого класса и опыта игры в подобные аркады. Каждая попытка прохождения делает сильнее и опытнее, позволяет лучше освоить путь и обучает все новым трюкам. По ходу бега по трассе приходится совершать прыжки на невозможные расстояния, выполнять соответствующие ситуации перевороты и многое-многое другое. По примеру прочих игр доступно получение своеобразной награды за идеальное прохождение трассы – звезды, максимальное количество которых равняется трем за попытку, и к этому, безусловно, будут стремиться все скачавшие приложение. Изначально игра была доступна только в соцсетях, в частности в ВКонтакте и Фейсбуке, но не так давно было введено бесплатное снабжение ею устройств на iOS, а затем и для Андроидов. Известно, что разработчики считают до сих пор проект не завершенным и развивающимся – в скором времени ожидается одно из весомых обновлений (к слову, похоже, далеко не последнее), в котором будет введена третья новая локация под названием Технопарк с многими сюрпризами для игроков и улучшенными возможностями геймплея, которые можно будет осваивать на новых трассах, используя другие трюки.

Сейчас же полная версия предлагает две карты различной возрастающей сложности, с двадцатью трассами, на которых используемые в стиле паркур трюки замечательно анимированы, что добавляет игре приятной и захватывающей реалистичности, полностью погружая в мир ловких передвижений. В анимации была применена новая и совершенно отличная по своему принципу от существующих аналогов программа Cascadeur, специально разработанная для создания игрушек такого направления.

Что интересно, управление этой игрой освоить может даже ребенок, ведь в нем участвуют всего лишь стрелочки на клавиатуре: вверх (прыжок), вниз (подкат), вправо (быстро бежать) и влево (замедлиться). Для того чтобы поддерживать процесс бега нет необходимости все время жать на какую-то кнопку – персонаж бежит безостановочно, управление лишь отвечает за выполнение им трюков и характеристики движения.

Уже успевшие отлично освоить игру Вектор поклонники паркура советуют начинающим игрокам ускоряться лишь на помеченных белым цветом трассах, не отвлекаться на охотников, чтобы не стать жертвой внезапно оказавшейся на пути преграды.

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

В чем разница между использованием векторного вектора и набором .png для значков в Android?

Png – сжатое изображение. Он имеет фиксированный размер, если вы попытаетесь сделать его больше или меньше, ему нужно будет либо дублировать, либо удалять данные. Слишком большой или слишком маленький, и он выглядит неправильно (слишком большой размер хуже, чем слишком маленький).

Выделяемый вектор представляет собой серию команд, которые рассказывают, как рисовать что-то. Эти команды масштабируются, поэтому хорошо выполненный векторный чертеж будет выглядеть так же хорошо при 1000×1000, как и при 100×100.

Преимущество png – его легкость и относительно быстрая производительность. Выбираемый вектор медленнее (вам нужно выполнить команды) и сложнее создать хороший. Но он масштабируется лучше. Если масштабирование не требуется, возможно, что png – это то, что вы хотите. Если это так, вам может понадобиться вектор.

Также обратите внимание, что некоторые виды изображений лучше работают для векторов, чем другие – значок – это хорошее использование вектора. Фотография не сработает.

Векторный drawables уменьшает размер вашего apk, так как у вас есть только 1 изображение с несколькими в разных папках. Они также очень хорошо масштабируются, поэтому вам нужно всего лишь создать 1 векторный

Недостатком векторов является то, что они немного тяжелые, поэтому вы должны использовать их в нескольких местах

Помимо масштабирующих и пространственных факторов, с векторными чертежами вы можете воспроизводить и изменять в реальном времени векторную информацию о чертежах, что означает, что вы можете делать такие вещи, как например преобразования (например, преобразование фигуры). С набором PNG у вас есть статическое представление, и все, вы не можете играть с формами, потому что они являются только статическими растровыми изображениями (если только вы не делаете с ними сложные вещи). Проверьте этот пример морфинга пути , чтобы узнать, что вы можете получить. Помните, что при наборе графических элементов PNG вы используете гибкость и пространство со скоростью, с векторными чертежами вы получаете гибкость и пространство, но скорость потери (потому что векторные преобразования – это задачи с интенсивным использованием процессора – в отличие от масштабирования растрового изображения).

Понимание формата векторных изображений Android: VectorDrawable | Ник Батчер | Разработчики Android

Android-устройства бывают всех размеров, форм и плотности экрана . Вот почему я большой поклонник использования векторных ресурсов, не зависящих от разрешения. Но что именно они собой представляют? Каковы их преимущества? Каковы затраты? Когда я должен их использовать? Как вы их создаете и используете? В этой серии постов я хотел бы изучить эти вопросы и объяснить, почему я считаю, что подавляющее большинство ресурсов в ваших приложениях должны быть векторами, и как извлечь из них максимальную пользу.

Большинство форматов изображений (png, jpeg, bmp, gif, webp и т. д.) являются растровыми, что означает, что они описывают изображение как фиксированную сетку пикселей. Таким образом, они определены в определенном разрешении и ничего не понимают в своем содержании, только цвет каждого пикселя. Однако векторная графика описывает изображение как серию форм, определенных на абстрактном размере холста.

Векторные объекты имеют 3 основных преимущества:

Sharp

Векторные изображения изящно изменяются; поскольку они описывают изображение на абстрактном размере холста, вы можете масштабировать этот холст вверх или вниз, а затем перерисовывать изображение в этом размере.Однако растровые ресурсы могут испортиться при изменении их размера. Уменьшение масштаба растровых ресурсов, как правило, допустимо (поскольку вы отбрасываете информацию), но их увеличение приводит к таким артефактам, как нечеткость или полосатость, потому что они должны интерполировать отсутствующие пиксели.

Артефакты из-за (экстремального) масштабирования растрового изображения (слева) по сравнению с векторным изображением (справа)

Вот почему на Android нам необходимо предоставить несколько версий каждого растрового ресурса для экранов с разной плотностью:

  • res/drawable-mdpi /фу.png
  • res/drawable-hdpi/foo.png
  • res/drawable-xhdpi/foo.png

Android выбирает ближайшую большую плотность и уменьшает ее (при необходимости). Учитывая тенденцию к устройствам с экранами все более высокой плотности, производители приложений должны продолжать создавать, включая и поставлять все более крупные версии одних и тех же ресурсов. Обратите внимание, что многие современные устройства не используют сегменты с точной плотностью (например, Pixel 3 XL имеет разрешение 552 dpi, что-то между xxhdpi и xxxhdpi), поэтому ресурсы часто масштабируются.

Поскольку размер векторных ресурсов корректно изменяется, вы можете включить один ресурс, будучи уверенным, что он будет работать при любой плотности экрана.

Малый

Векторные ресурсы, как правило*, более компактны, чем растровые, поскольку вам нужно включить только одну версию и потому, что они хорошо сжимаются.

Например, вот изменение по сравнению с приложением Google I/O, где мы переключили ряд значков с растровых PNG на векторные и сэкономили 482 КБ.Хотя это может показаться не таким уж большим, это было просто для небольшой иконографии; изображения большего размера (например, иллюстрации) будут иметь большую экономию.

Эта иллюстрация, например, из потока ввода-вывода приложения ввода-вывода предыдущего года, например:

Иллюстрации могут быть хорошими кандидатами для векторов

Мы не могли заменить это на VectorDrawable , так как градиенты в то время широко не поддерживались время (спойлер: они сейчас!) поэтому нам пришлось выложить растровую версию 😔. Если бы мы могли использовать вектор, это было бы на 30% больше, чем результат лучше :

  • Растр: Размер загрузки = 53. 9 КБ (необработанный размер файла = 54,8 КБ)
  • Вектор: размер загрузки = 3,7 КБ (необработанный размер файла = 15,8 КБ)

устройство, VectorDrawable , как правило, все еще меньше, а также устраняет необходимость создавать все более крупные растровые ресурсы.

Динамический

Поскольку векторные изображения описывают свое содержимое, а не «сглаживают» их до пикселей, они открывают двери для новых интересных возможностей, таких как анимация, интерактивность или динамическое оформление тем.Подробнее об этом в следующих постах.

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

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

Шаги, связанные с декодированием вектора перед визуализацией

Для этого есть два шага:

  1. Инфляция . Ваш векторный файл должен быть прочитан и проанализирован в VectorDrawable , моделирующем пути, группы и т. д., которые вы объявляете.
  2. Чертеж . Затем эти объекты модели необходимо нарисовать, выполнив команды рисования Canvas .

Оба эти шага пропорциональны сложности вектора и типу выполняемых операций. Если вы используете очень сложные формы, потребуется больше времени, чтобы преобразовать их в Path . Точно так же для выполнения большего количества операций рисования потребуется больше времени (и некоторые из них являются более дорогостоящими, например, операции обрезки). Мы вернемся к этому в будущем посте этой серии о профилировании этих затрат.

Для статических векторов этап рисования необходимо выполнить только один раз, после чего его можно кэшировать в растровое изображение . Анимированные векторы не могут быть подвергнуты этой оптимизации, так как их свойства обязательно меняются, требуя перерисовки.

Сравните это с растровыми активами, такими как PNG, которым нужно только декодировать содержимое файла, что со временем было сильно оптимизировано.

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

Пригодность

Из-за характера формата векторы отлично подходят для описания некоторых объектов, таких как простые значки и т. д. Они ужасны при кодировании изображений фотографического типа, где сложнее описать их содержимое как серию форм, и, вероятно, было бы намного эффективнее использовать растровый формат (например, webp).Это, конечно, спектр, в зависимости от сложности вашего актива.

Преобразование

Никакие инструменты проектирования (о которых я знаю) не создают VectorDrawable напрямую, что означает, что есть шаг преобразования из других форматов. Это может усложнить рабочий процесс между дизайнерами и разработчиками. Мы подробно рассмотрим эту тему в следующем посте.

Если вы когда-либо работали с форматами векторных изображений, вы, вероятно, сталкивались с форматом SVG (масштабируемая векторная графика), отраслевым стандартом в Интернете.Он способный и зрелый с установленными инструментами, но это также обширный стандарт . Он включает в себя множество сложных возможностей, таких как выполнение произвольного javascript, эффекты размытия и фильтрации или встраивание других изображений, даже анимированных GIF. Android работает на мобильных устройствах с ограниченными возможностями, поэтому поддержка всей спецификации SVG не была реальной целью.

Однако SVG включает спецификацию пути, которая определяет, как описывать и рисовать фигуры. С помощью этого API вы можете выразить большинство векторных фигур. По сути, это то, что поддерживает Android: спецификация пути SVG (плюс несколько дополнений).

Кроме того, определяя собственный формат, VectorDrawable может интегрироваться с функциями платформы Android. Например, работа с системой ресурсов Android для ссылки на @colors , @dimens или @strings , работа с атрибутами темы или AnimatedVectorDrawable с использованием стандартного Animator s.

Как указано, VectorDrawable поддерживает спецификацию пути SVG, позволяя указать одну или несколько форм для рисования.Он создан в виде XML-документа, который выглядит следующим образом:

Обратите внимание, что вам нужно указать внутренний размер актива, который был бы размером, если бы вы установили его в wrap_content ImageView . Размеры второго окна просмотра и определяют виртуальный холст или координатное пространство, в котором определены все последующие команды рисования. Внутренние размеры и размеры окна просмотра могут различаться (но должны быть в одном и том же соотношении) — вы можете определить свои векторы в холсте 1 * 1. если вы действительно хотите.

Элемент содержит один или несколько элементов . Они могут быть названы (для последующего использования, например, анимация), но, что крайне важно, должны указывать элемент pathData , который описывает форму. Эту загадочно выглядящую строку можно рассматривать как серию команд, управляющих пером на виртуальном холсте:

Визуализация операций пути

Приведенные выше команды перемещают виртуальное перо, затем проводят линию в другую точку, поднимают и перемещают перо, затем рисуют. другая линия.С помощью всего 4 наиболее распространенных команд мы можем описать почти любую фигуру (есть и другие команды, см. спецификацию):

  • M перейти к
  • L линия к
  • C (кубическая кривая Безье) к
  • Z закрыть (от линии до первой точки)

(команды в верхнем регистре используют абсолютные координаты, а строчные используют относительные) получить их из файлов SVG? Хотя вам не нужно уметь читать путь и понимать, что он будет рисовать, базовое понимание того, что делает VectorDrawable , чрезвычайно полезно и необходимо для понимания некоторых расширенных функций, к которым мы вернемся позже. .

Пути сами по себе ничего не рисуют, их нужно обводить и/или заполнять.

Часть 2 этой серии более подробно описывает различные способы заполнения/поглаживания дорожек.

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

Обратите внимание, что вы не можете вращать/масштабировать/перемещать отдельные пути. Если вы хотите такого поведения, вам нужно поместить их в группу. Эти преобразования не имеют особого смысла для статических изображений, которые могут напрямую «запекать» их по своим путям, но они чрезвычайно полезны для анимации.

Вы также можете определить clip-path s, то есть замаскировать область, которую могут рисовать другие пути в той же группе . Они определяются точно так же, как path s.

Следует отметить одно ограничение: пути клипа не сглаживаются.

Демонстрация пути клипа без сглаживания

В этом примере (который мне пришлось сильно увеличить, чтобы показать эффект) показаны два подхода к рисованию значка затвора камеры. Первый рисует дорожки, второй рисует сплошной квадрат, замаскированный под форму жалюзи.Маскирование может помочь создать интересные эффекты (особенно при анимации), но это относительно дорого, поэтому, если вы можете избежать этого, нарисовав фигуру другим способом, сделайте это.

Пути можно обрезать; это только рисование подмножества всего пути. Вы можете обрезать заполненные контуры, но результаты могут быть неожиданными! Чаще всего обрезают обведенные дорожки.

Обрезка контуров

Вы можете обрезать либо с начала, либо с конца контура или применить смещение к любым обрезкам. Они определяются как часть пути [0,1].Посмотрите, как установка различных значений обрезки меняет часть нарисованной линии. Также обратите внимание, что смещения могут привести к «зацикливанию» значений обрезки. Опять же, это свойство не имеет особого смысла для статических изображений, но удобно для анимации.

Элемент root vector поддерживает свойство alpha [0, 1]. У групп нет свойства альфа, но отдельные пути поддерживают fillAlpha / strokeAlpha .

Надеюсь, этот пост даст вам представление о векторных активах, их преимуществах и недостатках.Векторный формат Android работает и имеет широкую поддержку. Учитывая разнообразие устройств на рынке, использование векторных ресурсов должно быть вашим выбором по умолчанию, а растровые — только в особых случаях. Присоединяйтесь к нам в следующих сообщениях, чтобы узнать больше:

Скоро: Создание векторных активов для Android
Скоро: Профилирование Android
VectorDrawable s

Android Vector Drawable будем обсуждать Android Vector Drawable.Кроме того, мы будем внедрять их в наше приложение для Android.

Android Vector Drawable

Часто мы используем PNG в качестве рисуемых изображений. Чтобы изображения PNG работали на разных размерах экрана, мы создаем несколько ресурсов PNG с разными размерами и плотностью. Впоследствии изображения PNG занимают дополнительное место и приводят к большим размерам APK приложений Android.

Здесь нам на помощь приходит Vector Drawable! Это ваша замена изображениям PNG.

VectorDrawable — это векторная графика, определенная в XML-файле как набор точек, линий и кривых вместе с соответствующей информацией о цвете.

Могут масштабироваться в соответствии с размером экрана без потери качества. Они также быстро отображаются на экране. VectorDrawable — это файл XML.

Вы можете добавить новый векторный актив в папку для рисования, используя New | Вектор Актив .

Таким образом, мы можем создавать векторные рисунки значков Material Design. Код для VectorDrawable выглядит так:

Они устанавливаются в векторном теге . android:viewportWidth и android:viewportHeight используются для установки ширины и высоты рисуемых границ.В пределах этих размеров вектор рисуется на холсте.

путь — это тег, который создает рисуемый объект. Внутри пути мы создаем линии, кривые, дуги и устанавливаем границу, цвет фона. Мы делаем это командами пути в pathData .

Vector Drawables были представлены начиная с Android Lollipop и выше, но благодаря обратной совместимости они совместимы и с более ранними версиями.

Создание пути для векторных активов

Команды пути состоят из алфавита, за которым следуют координаты.Представьте, что создание дорожек похоже на рисование. Заглавные буквы обозначают абсолютное положение. Нижний регистр обозначает относительное положение.

  • M перейти к команде . Это способ сказать, переместите свой карандаш на заданную координату в представлении. Пример M 100 100 перемещает воображаемый карандаш в координату 100, 100 на холсте.
  • L строка в команду. Используется для рисования линии от текущей позиции до указанной позиции.
    Пример: M 100 100, L 120 100 рисует горизонтальную линию.
  • z — Используется для закрытия пути. Он рисует линию от последней позиции до первой позиции. Пример M 100 100 L 120 100 L 120 120 L 100 120 Z создает квадрат.
  • C — Используется для создания кривой Безье. После этого нам нужно указать три набора координат. Первая и вторая будут двумя контрольными точками между начальной и конечной точками.
  • A – используется для рисования дуги. После a необходимо указать следующий формат: (rx ry x-ось-вращение большая-дуга-флаг флаг развертки x y).rx ry и ось x — два заданных радиуса.

Мы можем указать более одного пути в векторе, установив теги пути внутри тега group .

Давайте создадим случайный интересный векторный рисунок в нашем приложении для Android, используя вышеуказанные знания.

Пример структуры проекта Android Vector Drawable

Android Vector Drawable Code

Ниже приведен код макета activity_main. xml:

 



    <Просмотр изображения
        андроид: layout_width = "32dp"
        андроид: layout_height = "32dp"
        android:src="@drawable/ic_w" />

    <Просмотр изображения
        Android: layout_width = "wrap_content"
        android:layout_height="wrap_content"
        андроид: layout_margin = "8dp"
        android:src="@drawable/ic_w_fill" />

    <линейный макет
        Android: layout_width = "wrap_content"
        андроид: layout_height="wrap_content">

        <Просмотр изображения
            андроид: layout_width = "16dp"
            андроид: layout_gravity = "center_vertical"
            андроид: layout_height = "16dp"
            android:src="@drawable/ic_a" />


        <Просмотр изображения
            Android: layout_width = "wrap_content"
            android:layout_height="wrap_content"
            андроид: layout_margin = "8dp"
            android:src="@drawable/ic_c" />

    

    <Просмотр изображения
        Android: layout_width = "wrap_content"
        android:layout_height="wrap_content"
        андроид: layout_margin = "8dp"
        android:src="@drawable/ic_0" />

    <Просмотр изображения
        Android: layout_width = "wrap_content"
        android:layout_height="wrap_content"
        андроид: layout_margin = "8dp"
        android:src="@drawable/ic_jd" />


  

Давайте рассмотрим каждую реализацию Vector Drawables по отдельности.

ic_rectangle.xml

 

<вектор xmlns:android="https://schemas.android.com/apk/res/android"
    андроид: ширина = "100dp"
    андроид: высота = "100dp"
    андроид: viewportHeight = "100"
    Android: ViewPortWidth="100">

    <путь
        андроид: имя = "свет_треугольник"
        Android:fillColor="@color/colorPrimary"
        android:pathData="M 100,0 L 0,100 100,100 z" />

    <путь
        андроид: имя = "темный_треугольник"
        Android:fillColor="@color/colorPrimaryDark"
        android:pathData="M 0,0 L 100,0 0,100 z" />


  

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

При установке этого параметра в LinearLayout фон будет выглядеть так:

ic_w.xml

 

<вектор xmlns:android="https://schemas.android.com/apk/res/android"
    андроид: ширина = "50dp"
    андроид: высота = "50dp"
    андроид: viewportHeight = "50. 0"
    андроид: viewportWidth="50.0">
    <группа android:name="w">

        <путь
            андроид: имя = "один"
            android:pathData="M 25 0 L 10 40"
            android:strokeColor="#FFF"
            андроид: ширина хода = "1" />

        <путь
            андроид: имя = "два"
            android:pathData="M 25 0 L 40 40"
            android:strokeColor="#FFF"
            андроид: ширина хода = "1" />


        <путь
            андроид: имя = "три"
            android:pathData="M 10 40 L 0 0 "
            android:strokeColor="#FFF"
            андроид: ширина хода = "1" />

        <путь
            андроид: имя = "четыре"
            android:pathData="M 40 40 L 50 0"
            android:strokeColor="#FFF"
            андроид: ширина хода = "1" />

    

  

В приведенном выше коде мы пытаемся создать символ W с помощью линий.

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

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

 

<вектор xmlns:android="https://schemas.android.com/apk/res/android"
    андроид: ширина = "50dp"
    андроид: высота = "50dp"
    android:viewportHeight="50.0"
    андроид: viewportWidth="50.0">
    <группа android:name="wFilled">

        <путь
            андроид: имя = "один"
            android:pathData="M 25 0 L 10 40 M 25 0 L 40 40"
            Android: инсультЦвет = "# 000"
            андроид: ширина хода = "1" />


        <путь
            андроид: имя = "два"
            android:fillColor="@android:color/holo_orange_light"
            android:pathData="M 10 40 L 0 0 L 25 0 Z"
            android:strokeColor="#FFF"
            андроид: ширина хода = "1" />

        <путь
            андроид: имя = "три"
            android:fillColor="@android:color/holo_orange_light"
            android:pathData="M 40 40 L 50 0 L 25 0 Z"
            android:strokeColor="#FFF"
            андроид: ширина хода = "1" />

    

  

ic_a. xml
Давайте создадим букву А, используя пути.

 

<вектор xmlns:android="https://schemas.android.com/apk/res/android"
    андроид: ширина = "50dp"
    андроид: высота = "50dp"
    андроид: viewportHeight = "50.0"
    андроид: viewportWidth="50.0">
    <группа android:name="a">

        <путь
            андроид: имя = "один"
            android:pathData="M 25 0 L 10 40"
            android:strokeColor="#FFF"
            андроид: ширина хода = "2" />

        <путь
            андроид: имя = "два"
            android:pathData="M 25 0 L 40 40"
            android:strokeColor="#FFF"
            андроид: ширина хода = "2" />


        <путь
            андроид: имя = "три"
            android:pathData="M 15 25 L 34 25"
            android:strokeColor="#FFF"
            андроид: ширина хода = "2" />
    

  

ic_c.xml

 

<вектор xmlns:android="https://schemas. android.com/apk/res/android"
    андроид: ширина = "48dp"
    андроид: высота = "48dp"
    андроид: viewportHeight = "48.0"
    Android: ширина окна просмотра = "48.0">
    <путь
        андроид: имя = "кривые"
        android:pathData="M 25 0 C -25 12,5 22 40 25 25"
        android:strokeColor="#FFF"
        андроид: ширина хода = "1" />

  

Векторные рисунки букв A и C выглядят так:

ic_0.xml

 

<вектор xmlns:android="https://schemas.android.com/apk/res/android"
    андроид: ширина = "60dp"
    андроид: высота = "60dp"
    андроид: viewportHeight = "50"
    андроид: viewportWidth="50">

    <путь
        android:fillColor="@android:color/holo_green_dark"
        android:pathData="M16,25
        А10,10 0 2,2 36,25
        A10,10 0 2,2 16,25 Z" />


  

Окружность строится из двух дуг, которые затем замыкаются.

Теперь последнее. Давайте создадим образец значка JournalDev JD, используя векторное рисование.

 

<вектор xmlns:android="https://schemas.android.com/apk/res/android"
    андроид: ширина = "48dp"
    андроид: высота = "48dp"
    андроид: viewportHeight = "48.0"
    Android: ширина окна просмотра = "48.0">
    <группа android:name="thing">
        <путь
            андроид: имя = "кривые"
            android:pathData="M 25 10 L 12 10 M 25 10 L 25 30 M 25 30 C 20 35 15 30 12 25"
            Android: инсультЦвет = "# 000"
            андроид: ширина хода = "1" />

        <путь
            андроид: имя = "кривые"
            android:pathData="M 30 10 L 30 30 M 30 10 C 45 15 45 25 30 30"
            android:strokeColor="@android:color/holo_red_dark"
            андроид: ширина хода = "1" />

    

  

Наконец, вывод нашего приложения выглядит следующим образом:

На этом урок заканчивается.Вы можете загрузить окончательный проект Android VectorDrawable по ссылке ниже:

Как добавить отступы к векторному рисунку Android

При добавлении значков в приложения для Android вы, как правило, будете работать с квадратными значками. Например, превосходная встроенная библиотека векторных иконок (также доступна онлайн) содержит только идеально квадратные иконки.

Однако иногда эти векторные значки используются в неквадратных местах. С обычным файлом изображения добавить дополнительные отступы легко, но не с векторным файлом!

В этом руководстве рассказывается, как изменить квадратное векторное изображение, чтобы добавить любые отступы, которые вы хотите, без каких-либо изменений в макетах вашего приложения.Используемый значок — белый access_time , используемый для представления состояния загрузки.

В моем приложении StaggeredGridLayoutManager используется для отображения трех постеров фильмов в строке. Эти киноафиши всегда одного размера и имеют соотношение ширины и высоты 1:1,5.

Использование значка

Если ImageView изначально настроены на наш значок загрузки (либо в качестве изображения по умолчанию, либо в качестве заполнителя Пикассо), разница в размерах сразу становится очевидной:

 <вектор android:height="24dp"
    android:viewportHeight="24. 0" android:viewportWidth="24.0"
    android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
    
 

Изменение размера нашего вектора, который можно рисовать

Наше векторное изображение слишком маленькое! Это связано с тем, что android:height="24dp" android:width="24dp" изначально включен в значок, что обеспечивает максимальный размер.Установка для них обоих значений 240dp устраняет проблему горизонтального интервала, но соотношение 1:1 конфликтует с соотношением 1:1,5 на постере фильма. Это приводит к тому, что постеры фильмов постоянно толкают друг друга, а значки загрузки перемещаются по мере их загрузки, что делает пользовательский интерфейс очень непривлекательным.

 <вектор android:height="240dp"
    android:viewportHeight="24.0" android:viewportWidth="24.0"
    android:width="240dp" xmlns:android="http://schemas.android.com/apk/res/android">
    
 

Корректировка соотношения нашего векторного рисунка

Таким образом, нужно изменить размер рисуемого объекта, чтобы он соответствовал реальному содержимому. Например, для ширины 200 потребуется высота 300. Внесение этих изменений останавливает постеры фильмов / значки загрузки, толкающие друг друга, но значок растянулся!

 <вектор android:height="300dp"
    android:viewportHeight="24.0" android:viewportWidth="24.0"
    android:width="200dp" xmlns:android="http://schemas.android. com/apk/res/android">
    
 

Добавление заполнения внутри нашего ресурса

Решение состоит в том, чтобы добавить отступы к нашему векторному рисунку, чтобы сохранить исходное соотношение 1:1.Это делается путем добавления  вокруг . Эта группа будет масштабировать содержимое внутри нее (фактический значок), не влияя на общий размер/соотношение вектора. Поскольку параметры scaleX  и scaleY  относительны, для них необходимо задать значение 1 или меньше, чтобы избежать кадрирования. Например, если задать для scaleX значение 0,99 и для scaleY значение 0,66 , будет соблюдаться требуемое соотношение 1:1,5. Обратите внимание, что pivotX  и pivotY  задают центральную точку масштабирования и должны составлять половину ваших viewpointWidth и viewpointHeight  (например,г. 12).

 <вектор android:height="300dp"
    android:viewportHeight="24.0" android:viewportWidth="24.0"
    android:width="200dp" xmlns:android="http://schemas.android.com/apk/res/android">
    <группа
        андроид:масштабX="0,99"
        андроид: масштаб Y = "0,66"
        андроид: пивотХ = "12"
        Android: PivotY="12">
        
    
 

Наконец-то это выглядит разумно! Обратите внимание, что если нам нужно больше отступов по бокам, scaleX  из 0,8 и scaleY  из 0,4  увеличили бы отступы со всех сторон.

Надеемся, что это руководство показало, как группа может уменьшить масштаб содержимого SVG.Этот метод можно применить даже к отдельным частям SVG, если есть несколько путей!

 

(Возможно!) Похожие сообщения

Составление реактивного ранца

— изображение из вектора

MainActivity.kt

 
пакет com.cfsuman.jetpackcompose

импортировать androidx.appcompat.app.AppCompatActivity
импортировать android.os.Bundle
импортировать androidx.activity.compose.setContent
импортировать androidx.compose.foundation.Image
импортировать androidx.составить.основной.фон
импортировать androidx.compose.foundation.layout.*
импортировать androidx.compose.runtime.Composable
импортировать androidx.compose.ui.Alignment
импортировать androidx.compose.ui.Modifier
импортировать androidx.compose.ui.graphics.Color
импортировать androidx.compose.ui.graphics.ColorFilter
импортировать androidx.compose.ui.graphics.vector.ImageVector
импортировать androidx. compose.ui.res.vectorResource
импортировать androidx.compose.ui.tooling.preview.Preview
импортировать androidx.compose.ui.unit.dp

класс MainActivity : AppCompatActivity() {
    переопределить удовольствие onCreate(savedInstanceState: Bundle?) {
        супер.при создании (сохраненное состояние экземпляра)

        setContent {
            Основное содержание()
        }
    }


    @составной
    весело MainContent () {
        Столбец(
            модификатор = модификатор
                .fillMaxSize ()
                .background (Цвет (0xFFFEFEFA))
                .padding(16.dp),
            verticalArrangement = Расположение.spacedBy(32.dp)
        ) {
            Изображение(
                ImageVector.vectorResource(
                    идентификатор = R.drawable.ic_baseline_menu_book_24
                ),
                "Локализованное описание",
                цветФильтр = ЦветФильтр.оттенок(Цвет(0xFFDA1884))
            )

            Изображение(
                ImageVector. vectorResource(
                    идентификатор = R.drawable.ic_baseline_menu_book_24
                ),
                "Локализованное описание",
                colorFilter = ColorFilter.tint(Цвет(0xFF333399)),
                модификатор = модификатор
                    .размер(150.dp)
            )

            Изображение(
                ImageVector.vectorResource(
                    идентификатор = R.drawable.ic_baseline_menu_book_24
                ),
                "Локализованное описание",
                цветФильтр = ЦветФильтр.оттенок(Цвет(0xFFED9121)),
                модификатор = модификатор
                    .размер(250.dp, 100.dp)
                    .фон (Цвет (0xFFF7E7CE)),
                выравнивание = выравнивание.CenterEnd
            )
        }
    }


    @Предварительный просмотр
    @составной
    весело ComposablePreview () {
        //Основное содержание()
    }
}
  

Создание простых векторных рисунков в Android Studio

Использование векторных рисунков часто намного лучше, чем растровые изображения, по двум причинам: они масштабируются без потери четкости, и вам нужен только один файл ресурсов, который подходит для всех плотностей экрана.

Иногда мне кажется полезным создавать векторные рисунки вручную в Android Studio, используя пути SVG.

Если вы еще не знакомы с ним, позвольте мне показать вам пример.

{: .center-изображение }

Я собираюсь создать прямоугольник, состоящий из двух смежных треугольников разного цвета, как показано ниже:

{: .center-изображение }

Шаг 1. Создайте файл для рисования

{: .center-изображение }

Шаг 2. Установите размер для рисования

  
<вектор xmlns:android="http://schemas.android.com/apk/res/android"
    андроид: высота = "100dp"
    андроид: ширина = "100dp"
    андроид: viewportHeight = "100"
    Android: ViewPortWidth="100">

  

Свойства android:width и android:height определяют внутренний размер drawable, поэтому это имеет значение в основном, когда вы позже используете drawable с шириной и высотой wrap_content следующим образом:

  <Вид изображения
        android:src="@drawable/прямоугольник"
        Android: layout_width = "wrap_content"
        android:layout_height="wrap_content" />  

Свойства android:viewportWidth и android:viewportHeight более важны для нас, поскольку они определяют размер холста для рисования наших путей.

Шаг 3: Нарисуйте первый треугольник

Давайте заполним половину нашего квадратного холста первым треугольником, проведя путь через его вершины: A , B и C .

Обратите внимание на координаты — верхний левый угол холста (0,0), а нижний правый угол (100,100), потому что мы установили android:viewportWidth="100" и android:viewportHeight ="100" .

{: .центральное изображение }

Вы можете нарисовать путь, добавив путь внутри вектора :

  <путь
    android:fillColor="[ваш цвет (например, из ресурсов или RGB Hex)]"
    android:pathData="[Команды пути SVG]" />  

Здесь нам нужны следующие команды SVG:

  • M — абсолютный перейти к
  • L — абсолютный линейный до
  • z близкая дорожка

Рисунок треугольника состоит из:

  1. начало пути из A=(0,0) : M 0,0
  2. рисование линии до B=(100,0) : L 100,0
  3. рисование линии до C=(0,100) : L 0,100
  4. закрытие пути: z

Вместо этого мы могли бы использовать относительную команду lineto ( l ) и указать векторы, соединяющие точки, например:

  • от A до B : л 100,0
  • от B до C : л -100 100

Также стоит отметить, что если вы используете одну и ту же команду несколько раз подряд, буква команды может быть удалена в последующих командах. Итоговая команда выглядит так: M 0,0 L 100,0 0,100 z

Давайте поместим это в файл для рисования:

  
<вектор xmlns:android="http://schemas.android.com/apk/res/android"
    андроид: высота = "100dp"
    андроид: ширина = "100dp"
    андроид: viewportHeight = "100"
    Android: ViewPortWidth="100">

    <путь
        Android:fillColor="@color/triangle_red_light"
        android:pathData="M 0,0 L 100,0 0,100 z" />

  

Мы видим треугольник на панели предварительного просмотра:

{: .центральное изображение }

Шаг 4: Нарисуйте второй треугольник

Поскольку мы уже знаем, как рисовать путь, очень просто создать еще один треугольник. Его вершины:

  • В=(100,0)
  • С=(0,100)
  • Д=(100,100)

поэтому команда пути: M 100,0 L 0,100 100,100 z

Результирующий XML теперь выглядит так:

   0" encoding="utf-8"?>
<вектор xmlns:android="http://schemas.android.com/apk/res/android"
    андроид: высота = "100dp"
    андроид: ширина = "100dp"
    андроид: viewportHeight = "100"
    Android: ViewPortWidth="100">

    <путь
        андроид: имя = "темный_треугольник"
        андроид:fillColor="@color/triangle_red_dark"
        android:pathData="M 100,0 L 0,100 100,100 z" />

    <путь
        андроид: имя = "свет_треугольник"
        Android:fillColor="@color/triangle_red_light"
        android:pathData="M 0,0 L 100,0 0,100 z" />

  

Подсказка: вы можете назвать пути, чтобы их было легче найти позже, если ваш рисунок станет более сложным.

{: .center-изображение }

Шаг 5. Используйте рисуемый объект с ImageView

Теперь мы можем использовать drawable. Как видите, его можно легко масштабировать с помощью свойств android:layout_width , android:layout_height и android:scaleType .

  


    <Просмотр изображения
        Android: layout_width = "match_parent"
        андроид: layout_height = "match_parent"
        Android: ScaleType = "fitXY"
        приложение:srcCompat="@drawable/прямоугольник" />

  

{: .center-изображение }

Дальнейшее чтение

лучших Android-приложений для создания векторных изображений в 2022 году

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

5 лучших приложений для создания векторных изображений

Убедитесь, что вы думаете обо всех приложениях, которые вы можете использовать при обновлении и улучшении ваших изображений. Вот 5 лучших из них, таких как:

Рисовать в Adobe Illustrator

Это не полноценная версия Adobe Illustrator для мобильных устройств. Это самый простой векторный рисовальщик по сравнению с настольным.Если вы надеетесь иметь возможность точно настроить или даже подправить цвета изображения, которое вы создаете, это будет лучшим приложением. Он имеет бесплатное хранилище объемом 2 ГБ, поэтому вы можете хранить все свои изображения в одном месте. С помощью этого приложения вы можете получить доступ из приложения к своим ресурсам, включая изображения Adobe Stock, фотографии, обработанные в Lightroom, или масштабируемые векторные фигуры, созданные в Capture.

Инструмент «Перо» SVG

Загружаемое приложение для телефона/планшета, позволяющее создавать векторные изображения без помощи мыши! Перетаскивая палец по экрану, кривые могут быть определены в двух контрольных точках, а также в исходной и конечной точках. С такой точностью рисовать пальцами почти так же просто, как рисовать мышью! Pen Tool SVG не только снизил порог входа для новичков в цифровом дизайне, но и предоставил дизайнерам всех уровней квалификации компактную платформу: выразительный набор инструментов под рукой.

Другим простым в использовании приложением было бы это, и вы можете легко создать что-то великолепное. Вам не нужно сложное приложение, чтобы выполнить работу, но это может помочь вам с тонкой настройкой всего.

Вектор

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

Vector идеально подходит для всех, кто занимается созданием плакатов, логотипов и визитных карточек. Это приложение имеет функции производителя плакатов, логотипов и визитных карточек в одном. Vector позволяет вам легко создавать дизайны, просто загружая графику с вашего устройства на значок — не нужно вводить никаких идей! Если вы не знаете, как приступить к разработке плаката или логотипа, в этом приложении также доступны профессиональные шаблоны, которые помогут прояснить, что включить. Vector — отличный способ оживить ваш следующий дизайнерский проект захватывающими цветами и изображениями — это особенно полезно, если вы проводите большую часть дня вдали от рабочего стола из-за работы; так как все может быть разработано с использованием только подключения к Интернету.

Скедио

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

ВсДрав

Если вы ищете простое в использовании приложение, то это то, что вы хотите загрузить. Его будет легко использовать, и он сэкономит, используя формат SVG, и это доставит вам массу удовольствия.

Убедитесь, что вы думаете об этих нескольких приложениях, когда пытаетесь решить, какое приложение для рисования векторных изображений вы хотите загрузить и использовать.

Галерея NuGet | Xamarin.Android.

Support.Animated.Vector.Drawable 28.0.0.3

Ксамарин.Привязки Android для библиотеки поддержки Android — анимация-вектор-рисунок

  • МоноAndroid 6.0
  • МоноАндроид 7.0
  • МоноАндроид 7.1
  • МоноAndroid 8.0
  • МоноAndroid 8.
    1
  • МоноАндроид 9.0

NuGet-пакеты (138)

Показаны 5 лучших пакетов NuGet, зависящих от Xamarin.Android.Support.Animated.Вектор. Рисуемый:

репозиториев GitHub (108)

Показаны 5 самых популярных репозиториев GitHub, зависящих от Xamarin. Android.Support.Animated.Vector.Drawable:

Хранилище Звезды
реактивный интерфейс / реактивный интерфейс

Усовершенствованная, компонуемая, функциональная реактивная среда модели-представления-представления для всех .NET, вдохновленный функциональным реактивным программированием. ReactiveUI позволяет абстрагировать изменяемое состояние от ваших пользовательских интерфейсов, выражать идею функции в одном удобочитаемом месте и улучшать тестируемость вашего приложения.

Калибурн-Микро/Caliburn.Микро

Небольшая, но мощная платформа, предназначенная для создания приложений на всех платформах XAML.Его мощная поддержка шаблонов MV* позволит вам быстро создать решение без необходимости жертвовать качеством кода или тестируемостью.

образцы xamarin/monodroid

Коллекция Xamarin.Примеры проектов Android.

ксамарин/ксамаринкомпонентс

Плагины для Xamarin

XLabs/Xamarin-Forms-Labs

Xamarin Forms Labs — это проект с открытым исходным кодом, целью которого является предоставление мощного и кроссплатформенного набора элементов управления и помощников, адаптированных для работы с Xamarin Forms.

Android.Support.Animated.Vector.Drawable»>
Версия загрузок Последнее обновление
28.0.0.3 4 089 026 04.09.2019
28. 0.0.1 2 087 353 18.01.2019
28.0,0 194 949 17. 12.2018
28.0.0-предварительная версия9 2630 13.12.2018
28. 0.0-предварительная версия8 7496 23.11.2018
28.0.0-предварительная версия7 4553 13. 11.2018
28.0.0-предварительная версия6 1504 09.11.2018
28. 0.0-предварительная версия5 2224 30.10.2018
28.0.0-предварительная версия4 1238 26. 10.2018
28.0.0-предварительная версия3 1790 19.10.2018
28. 0.0-превью2 1557 16.10.2018
28.0.0-превью1 1480 11. 10.2018
27.0.2.1 1 660 326 12.06.2018
27. 0,2 852 014 06.03.2018
27.0.2-превью1 18 240 12. 01.2018
26.1.0.1 643 800 31.10.2017
26. 1.0-бета1 1156 13.10.2017
26.0,2 369 205 13. 10.2017
26.0.2-rc1 2238 02.10.2017
26. 0,2-бета1 2495 18.09.2017
25.4.0.2 1 133 676 24. 08.2017
25.4.0.1 63 383 08.08.2017
25. 4.0-rc1 8728 11.07.2017
25.3.1 429 660 26. 04.2017
25.3.1-бета1 4341 03.04.2017
25. 2.0-бета1 2926 03.03.2017
25.1.1 142 190 13. 02.2017
25.1.1-бета1 1473 08.02.2017
25. 1,0 166 364 03.02.2017
25.1.0-бета2 3819 05. 01.2017
25.1.0-бета1 2343 22.12.2016
25. 0.1-rc1 2915 22.11.2016
24.2.1 161 121 19. 10.2016
24.2.1-rc1 1910 06.10.2016
24. 2.1-альфа1 2786 23.09.2016
23.4.0.1 204 865 13. 07.2016
23.4.0 37 237 21.06.2016
23.4. 0-бета1 2808 13.05.2016
23.3.0 1 496 445 15. 04.2016
23.3.0-бета1 2226 07.04.2016
23. 2.1 33 158 04.04.2016
23.2.1-бета2 1783 30. 03.2016
23.2.1-бета1 1700 24.03.2016
23. 2.0-бета1 1428 01.03.2016
.