English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Краткое резюме необходимых знаний по Android Drawable

Что такое Drawable

Сначала Drawable является абстрактным классом, представляющим изображения, которые можно рисовать на Canvas, часто используемые в качестве фона для view, с различными реализующими классами, выполняющими различные функции. Во-вторых, Drawable можно大致 разделить на следующие категории: изображения, состоящие из цветов. Обычно они определяются с помощью xml.

Инherits system Drawable

Реализующие классы и метки Drawable

Drawable

Получение внутренних размеров

    getIntrinsicHeight, getIntrinsicWidth
    - Когда Drawable состоит из изображения, метод возвращает ширину и высоту изображения
    - Когда Drawable состоит из цвета, концепция ширины и высоты отсутствует, возвращается -1

Различные Drawable и их использование

BitmapDrawable

Используется для отображения изображения, например, в следующем примере

<?xml version="1.0" encoding="utf-8"?>
<bitmap xmlns:android="http://schemas.android.com/apk/res/android"
 android:antialias="true"
 android:dither="true"
 android:filter="true"
 android:gravity="top"
 android:src="@mipmap/girl"
 android:tileMode="repeat" />

Обычные свойства

android:antialias включить消除锯齿
android:dither включить подавление вибрации
android:filter включить эффект фильтрации
android:gravity используется для позиционирования изображения
android:src идентификатор изображения
android:tileMode режим повторения, три варианта: repeat, mirror, clamp

ColorDrawable

Это代表了单色可绘制区域,которая упаковывает фиксированный цвет и рисует на канвасе блок однотонного цвета

Пример:

<?xml version="1.0" encoding="utf-8"?>
<color xmlns:android="http://schemas.android.com/apk/res/android" android:color="@color/colorAccent">
</color>

Ещё можно создавать с помощью кода

ColorDrawable drawable = new ColorDrawable(int color); //传入一个color的integer值

NinePatchDrawable

Это 9-пятнистое изображение, которое можно свободно масштабировать высоту и ширину без искажения

Пример:

<?xml version="1.0" encoding="utf-8"?>
<nine-patch xmlns:android="http://schemas.android.com/apk/res/android"
 android:dither="true"
 android:filter="true"
 android:src="@color/colorAccent">
</nine-patch>

Установите область масштабирования с помощью draw9patch

Направления 1 и 2 на рисунке показывают, где рисуются чёрные линии в draw9patch, пересечение длины которых является областью, которую можно растянуть
Длина пересечения чёрной линии в направлениях 3 и 4 на рисунке показывает область, которую можно заполнить

ShapeDrawable

Конструкция фигур через цвет, как монохромные, так и с эффектом градиента. Возможные фигуры: прямоугольник,椭圆, кольцо, линия

Пример круга с градиентом:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:shape="oval">
 <gradient
  android:angle="45"
  android:centerColor="@color/colorAccent"
  android:centerX="50%"
  android:centerY="50%"
  android:endColor="@color/colorPrimary"
  android:gradientRadius="150dp"
  android:startColor="@color/colorPrimaryDark"
  android:type="sweep" />
 <size
  android:width="260dp"
  android:height="260dp" />
</shape>

Внимание: 1, значение Android:angle должно быть кратным 45 2, oval используется для рисования эллипса, когда ширина и высота size равны, рисуется круг

Пример кольца:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
 android:innerRadius="100dp"
 android:shape="ring"
 android:thickness="10dp"
 android:useLevel="false" >
 <stroke
  android:width="10dp"
  android:color="@color/colorAccent" />
</shape>

Примечание:
3, android:useLevel установлено в false, в противном случае не будет достигнут идеальный эффект
4, innerRadius внутренний радиус кольца, innerRadiusRation коэффициент внутреннего радиуса по отношению к ширине кольца, оба значения основаны на innerRadius
5, thickness ширина кольца, thicknessRatio коэффициент ширины этого кольца, основное значение thickness

Обычные свойства

- android:shape форма для рисования, rectangle, oval, ring, line
- <stroke> обводка формы, имеет следующие свойства
        - android:width ширина обводки
        - android:color цвет обводки
        - android:dashGap ширина штриховки
        - android:dashWidth интервал между отрезками для рисования штриховки (для рисования штриховки, последние два должны быть не равны 0)
-<solid> одноцветное заполнение, android:color определяет цвет shape
- <gradient> эффект градиента, не может использоваться вместе с solid, имеет следующие свойства
        - android:angle угол градиента, должен быть кратным 45
        - android:startColor цвет начала градиента
        - android:centerColor цвет середины градиента
        - android:endColor цвет окончания градиента
        - android:centerX координата горизонтальной оси центра градиента
        - android:centerY координата вертикальной оси центра градиента
        - android:gradientRadius радиус градиента
        - android:type тип градиента, linear (линейный), sweep (сканирование), radial (радиальный)
- <corners> указывает на углы прямоугольника (rectangle), не подходит для других shape, имеет следующие свойства
        - android:topLeftRadius, android:topRightRadius, android:bottomLeftRadius, android:bottomRightRadius устанавливают углы для левого верхнего, правого верхнего, нижнего левého и нижнего правого углов
        - android:radius устанавливает одинаковый угол для всех углов, имеет низкий приоритет и может быть перекрыт другими четырьмя свойствами
- <size> устанавливает размеры shape, соответствующие android:width и android:height
        -  По умолчанию shape не имеет размеров, getIntrinsicHeight и getIntrinsicWidth возвращают -1
        -  Размер можно установить через size, но в качестве фона view он все равно будет растягиваться или уменьшаться до размера view
- <padding> устанавливает отступы для空的 области view, содержащей shape

StateListDrawable

Может быть рассматривается как селектор состояния, который выбирает соответствующий item из drawable, в зависимости от состояния view

Пример:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@color/colorPrimaryDark" android:state_pressed="false"></item>
 <item android:drawable="@color/colorAccent" android:state_pressed="true"></item>
</selector>

Обычные состояния

android:state_pressed когда view удерживается, состояние нажатия
android:state_checked когда view выбран, подходит для CheckBox
android:state_selected когда view выбран
android:state_enabled когда view находится в доступном состоянии
android:state_focused когда view получает фокус

LayerDeawable

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

Пример:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@mipmap/night" />
 <item
  android:drawable="@mipmap/photo6"
  android:gravity="center" />
</layer-list>

注意事项:

1. layer-list может содержать несколько item, каждый из которых представляет собой drawable, и добавленный в конце item будет перекрывать добавленный ранее item
2. по умолчанию, все drawable в layer-list масштабируются до размеров view, через android:gravity можно регулировать эффект масштабирования
3. можно установить смещение в верх, низ, лево и право, android:top, android:bottom, android:left, android:right

LevelListDrawable

Представляет собой набор drawable, каждый из которых имеет уровень (level). Настройка различных уровней позволяет переключаться между различными drawable с помощью LevelListDrawable. Диапазон уровней составляет от 0 до 10000, android:maxLevel устанавливает максимальный уровень, android:minLevel устанавливает минимальный уровень
Пример:

<?xml version="1.0" encoding="utf-8"?>
<level-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item
  android:drawable="@mipmap/photo0"
  android:maxLevel="20"
  android:minLevel="10" />
 <item
  android:drawable="@mipmap/photo1"
  android:maxLevel="40"
  android:minLevel="30" />
</level-list>

Через установку уровня можно переключать различные Drawable, в коде

 //Переключить Hintergrund ImageView на photo1, 35 в диапазоне 30-40
 iv.setImageLevel(35); 
 //Переключить 背景 ImageView на photo0, 15 в диапазоне 10-20
 iv.setImageLevel(15);

TransitionDrawable

Подкласс LayerDeawable, используемый для реализации эффекта плавного перехода между двумя Drawable
Пример:

Определение xml-файла

<?xml version="1.0" encoding="utf-8"?>
<transition xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:drawable="@mipmap/night" />
 <item android:drawable="@mipmap/photo6" />
</transition>

Установить src для ImageView, в java-коде

 iv = (ImageView) findViewById(R.id.iv_transition);
 drawable = (TransitionDrawable) iv.getDrawable();
 drawable.startTransition(1000); // Реализация эффекта плавного перехода
 drawable.reverseTransition(1000);

InsetDrawable

вставка другого Drawable, и можно сохранить определенное расстояние по всем сторонам
Пример:

<?xml version="1.0" encoding="utf-8"?>
<inset xmlns:android="http://schemas.android.com/apk/res/android"
 android:drawable="@mipmap/photo6"
 android:inset="20dp">
</inset>

ScaleDrawable

В зависимости от уровня Drawable масштабируется до определенной пропорции, при level 0 объект не виден, при level 10000 эффект масштабирования отсутствует
Пример:

<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
 android:drawable="@mipmap/night"
 android:scaleGravity="center"
 android:scaleHeight="50%"
 android:scaleWidth="50%" />

Чтобы показать эффект, необходимо установить level больше 0

 iv = (ImageView) findViewById(R.id.iv_scale);
 ScaleDrawable drawable= (ScaleDrawable) iv.getDrawable();
 drawable.setLevel(1);

- android:scaleHeight="percentage", android:scaleWidth="percentage", установка масштабирования высоты и ширины в процентах от исходного значения (100%-percentage)
- Чем больше level, тем больше изображение отображается

ClipDrawable

В зависимости от вашего уровня (level) выполняется обрезка другого Drawable, направление обрезки определяется вместе с android:clipOrientation и android:gravity. Установка level для обрезки, размер level варьируется от 0 до 10000, при level 0 объект не отображается, при level 10000 объект полностью отображается
xml определение

<?xml version="1.0" encoding="utf-8"?>
<clip xmlns:android="http://schemas.android.com/apk/res/android"
 android:clipOrientation="horizontal"
 android:drawable="@mipmap/night"
 android:gravity="right"></clip>
 <ImageView
  android:id="@+id/iv_clip"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:src="@drawable/drawable_clip" />

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

 ImageView iv = (ImageView) findViewById(R.id.iv_clip);
 ClipDrawable drawable= (ClipDrawable) iv.getDrawable();
 drawable.setLevel(5000); // чем больше уровень, тем меньше область обрезки

Свойства

android:clipOrientation, horizontal - горизонтальная обрезка, vertical - вертикальная обрезка
android:gravity, совместно с направлением обрезки

Создание Drawable

Создание кругового Drawable

package com.yu.drawablelearing;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;
public class CircleDrawable extends Drawable{
 private int radius;
 private int mWidth;
 private int mHeight;
 private Paint mPaint;
 @Override
 public void draw(Canvas canvas) {
  canvas.drawCircle(mWidth/2,mHeight/2,radius,mPaint);
 }
 public CircleDrawable(Bitmap bitmap) {
  radius = Math.min(bitmap.getWidth(), bitmap.getHeight())/2;
  mWidth = bitmap.getWidth();
  mHeight = bitmap.getHeight();
  BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
  mPaint = new Paint();
  mPaint.setShader(bitmapShader);
  mPaint.setAntiAlias(true);
 }
 @Override
 public void setAlpha(int alpha) {
  mPaint.setAlpha(alpha);
  invalidateSelf();
 }
 @Override
 public void setColorFilter(ColorFilter colorFilter) {
  mPaint.setColorFilter(colorFilter);
  invalidateSelf();
 }
 @Override
 public int getOpacity() {
  return PixelFormat.TRANSLUCENT;
 }
 @Override
 public int getIntrinsicHeight() {
  return mHeight;
 }
 @Override
 public int getIntrinsicWidth() {
  return mWidth;
 }
}

Создание прямоугольника с закругленными углами

package com.yu.drawablelearing;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.ColorFilter;
import android.graphics.Paint;
import android.graphics.PixelFormat;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.Drawable;
/**
 * Создано pecu 24 августа 2016 года.
 */
public class RoundRectangleDrawable extends Drawable {
 private RectF rectF;
 private Paint mPaint;
 Bitmap mBitmap;
 @Override
 public void draw(Canvas canvas) {
  canvas.drawRoundRect(rectF, mBitmap.getWidth()/6, mBitmap.getHeight()/6, mPaint);
 }
 public RoundRectangleDrawable(Bitmap bitmap) {
  mBitmap = bitmap;
  mPaint = new Paint();
  BitmapShader bitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
  mPaint.setAntiAlias(true);
  mPaint.setShader(bitmapShader);
 }
 @Override
 public void setAlpha(int alpha) {
  mPaint.setAlpha(alpha);
  invalidateSelf();
 }
 @Override
 public void setColorFilter(ColorFilter colorFilter) {
  mPaint.setColorFilter(colorFilter);
  invalidateSelf();
 }
 @Override
 public void setBounds(int left, int top, int right, int bottom) {
  super.setBounds(left, top, right, bottom);
  rectF = new RectF(left, top, right, bottom);
 }
 @Override
 public int getOpacity() {
  return PixelFormat.TRANSLUCENT;
 }
 @Override
 public int getIntrinsicWidth() {
  return mBitmap.getWidth();
 }
 @Override
 public int getIntrinsicHeight() {
  return mBitmap.getHeight();
 }
}

Общий процесс создания пользовательского Drawable

 1. Пользовательский класс Drawable наследуется от Drawable
 2. Реализуйте методы getOpacity, setColorFilter, setAlpha и т.д.
 3. В методе onDraw выполняется рисование
 4. Если пользовательский Drawable имеет фиксированный размер,则需要 реализовать методы getIntrinsicWidth, getIntrinsicHeight

Это конец всего содержимого статьи, надеюсь, это поможет вам в изучении, также希望大家多多支持呐喊教程。

Заявление: данное содержимое предоставлено из Интернета, авторские права принадлежат соответствующему владельцу, содержимое предоставлено пользователями Интернета, сайт не обладает правами собственности, не undergone人工 editing обработка, и не нести ответственность за соответствующие юридические вопросы. Если вы обнаружите подозрительное содержимое, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении и предоставьте соответствующие доказательства. Если после проверки обнаружится, что содержимое нарушает авторские права, сайт немедленно удалят涉嫌侵权的内容。

Вам может понравиться