Страницы

Поиск по вопросам

Показаны сообщения с ярлыком android-drawable. Показать все сообщения
Показаны сообщения с ярлыком android-drawable. Показать все сообщения

четверг, 9 апреля 2020 г.

Как нарисовать фигуру подобную картинке

#android #android_drawable

                    
Как нарисовать подобную фигуру в xml. И стоит ли ее рисовать, или лучше использовать
png (будет использоваться в качестве кнопки  и будет в дальнейшем анимироваться) 


    


Ответы

Ответ 1



Используйте 9-patch png. Добавьте к изображению раму толщиной в один пиксель, которая будет содержать информацию для растягивания изображения и размещения на нем контента. И измените расширение файла на имя_файла.9.png В дальнейшем это изображение можно будет использовать в качестве фона, который будет растягиваться в нужных местах, таким же образом делаются разные облачка для диалогов и.т.д. Преобразовать также можно с помощью png to 9-patch сервисов.

вторник, 7 апреля 2020 г.

Изменение цвета на png программно

#android #android_drawable

                    
Есть изображение .png, это иконка для таба, для нее я сделал селектор, что бы при
активном и неактивном табе она имела разный цвет. Пробовал PorterDuff.Mode но результат
не совсем такой как я хотел. Меня интересует как можно заменить в селекторе цвет активной
иконки динамически. Что бы вместо фиолетовой иконки можно было сделать, красную, зеленую,
желтую и т.д.

Пример моего селектора:











Пример иконки:



    


Ответы

Ответ 1



Изменить цвет можно так: TintIcons.java public class TintIcons { public static Drawable tintIcon(Drawable icon, ColorStateList colorStateList) { if(icon!=null) { icon = DrawableCompat.wrap(icon).mutate(); DrawableCompat.setTintList(icon, colorStateList); DrawableCompat.setTintMode(icon, PorterDuff.Mode.SRC_IN); } return icon; } public static void tintImageView(ImageView imageView, int colorStateListResId) { ColorStateList list = ContextCompat.getColorStateList(imageView.getContext(), colorStateListResId); if (list != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { imageView.setImageTintList(list); } else { imageView.setImageDrawable(tintIcon(imageView.getDrawable(), list)); } } } } /res/color/icon_state_list.xml MainActivity.java public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TintIcons.tintImageView((ImageView) findViewById(R.id.img_view), R.color.icon_state_list); } } Вместо списка состояний можно передавать просто цвет (например, R.color.colorPrimary), тогда картинка просто перекрасится. Аналогично можно перекрасить фон кнопок и т.д. (получив предварительно картинку фона через imageView.getBackground()). Как видно все эти причуды нужны для pre-Lollipop. Для lollipop+ достаточно titnList задать в разметке...

среда, 4 марта 2020 г.

Оптимизация приложения под разные экраны (drawable)

#android #xml #android_drawable #android_xml


Сразу извиняюсь за вопрос т.к. тема давно не новая, но всё же. Как подготовить drawable
для разных экранов? Ведь диагональ может быть разной, а плотность пикселей одна и та
же. И те рисунки что на экране 4.7-5 дюймов кажутся нормальными на экранах 7+ совсем
мелкие. И еще вопрос можно ли квалификаторы указывать так (drawable-xlarge-xhdpi)??
Заранее спасибо за ответ!
    


Ответы

Ответ 1



Для начальной подготовки drawable я бы посоветовал использовать ImageAsset в самой студии, это облегчит генерацию и вы увидите разницу на разных устройствах. drawable-xlarge-xhdpi Так можно использовать, так как это разные квалификаторы. Первый - отвечает за размер/диагональ экрана, второй - за плотность. Тема, очень хорошо описана во многих источниках, а лучше сразу оф доки читать, там очень хорошо всё разъясняется. https://developer.android.com/guide/practices/screens_support.html

Ответ 2



К сожалению, на всех устройствах Android не только диагональ экрана разная, но и его плотность. Для удобной работы с этим "зоопарком" размеров и плотностей в Google разработали квалификаторы к ресурсным папкам. Почитать об этом Вы можете здесь - открыть ссылку на сайт Developer Android Для примера оставлю здесь кусок информации из статьи выше Плотность пикселов на экране (dpi): ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi nodpi tvdpi Это означает, что Вы можете создать в свое директории /res следующие drawable поддиректории: drawable-ldpi drawable-mdpi drawable-hdpi drawable-xhdpi drawable-xxhdpi drawable-xxxhdpi drawable-nodpi drawable-tvdpi Для чего каждая из директорий drawable ? Ответ на этот вопрос в расширенной статье по ссылке выше. upd0 Поддержка различных экранов - ENG А так же, думаю, будет полезно прочесть эту статью - статья на fandroid.info

воскресенье, 9 февраля 2020 г.

Удаление drawable-ресурсов

#android #android_drawable #android_resources


Когда происходит удаление drawable-ресурсов (when packaging an APK - при сборке APK
или при установке APK на конкретное устройство?) и почему mipmap-ресурсы при этом не
удаляются? 


  while drawable resources might be removed when packaging an APK, such
  as for the Gradle for Android split system for making density-specific
  editions of an app, mipmap resources are left alone, apparently


P.S.
И что значит "Android split system"? 
    


Ответы

Ответ 1



Когда происходит удаление drawable-ресурсов (when packaging an APK - при сборке APK или при установке APK на конкретное устройство?) Удаление ресурсов происходит на этапе сборки проекта (ведь цель этого – уменьшить размер APK). Исключить ресурсы можно с помощью оператора exclude, например: exclude "ldpi", "xxhdpi", "xxxhdpi" и почему mipmap-ресурсы при этом не удаляются? В этом и есть вся фишка mipmap-ресурсов. Далее процитирую свой ответ: Зачем нужен mipmap? Для корректного отображения изображений на дисплеях с различными DPI в Android были введены квалификаторы (например, mdpi, hdpi). Чтобы изображения корректно выглядели на всех устройствах, необходимо разместить эти изображения со всеми доступными квалификаторами (в соответствующих разрешениях). Размещение изображений в различных разрешениях влечет за собой увеличение размера приложения. Допустим, Вы знаете, что у Боба такое-то значение DPI, а у Алисы – некоторое другое. Чтобы уменьшить размер приложения, Вы можете отдельно собрать приложение для Боба и отдельно для Алисы, включая изображения только в необходимом разрешении. При сборке проекта Вы можете исключить ненужные изображения (с помощью соответствующей конфигурации Gradle), например: exclude "ldpi", "xxhdpi", "xxxhdpi" Вроде бы все хорошо: исключены ненужные изображения и размер приложения уменьшен. Однако не все так гладко. Некоторые изображения могут быть отображены в разрешениях, которые не соответствуют тому, в котором Вы оставили эти изображения в проекте. Пример – иконка приложения, в некоторых лаунчерах она может быть увеличена. Так как иконка приложения у Вас в единственном разрешении (как и все другие изображения), то она будет увеличена и произойдет т.н. пикселизация – изображение будут размыто (при большом апскейле будут заметны квадратики). Вот тут-то и приходит на помощь mipmap – изображения, размещенные там, не будут исключены. То есть если Вы укажите в Gradle: exclude "ldpi", "xxhdpi", "xxxhdpi" то соответствующие изображения из drawable будут исключены, а из mipmap – нет. Android split system – условное название совокупности конструкций, которые используется для разделения ресурсов для APK.

среда, 5 февраля 2020 г.

drawable xml(android)

#android #android_drawable


Как программно задать изображение на кнопке при клике на неё?


  android:drawableRight="@drawable/ic_plus_1"



Ответы

Ответ 1



Нужно либо вызывать метод setBounds у drawable перед установкой либо сразу использовать setCompoundDrawablesWithIntrinsicBounds

Ответ 2



Создаёте хмл типо image_btn_src.xml которая содержит : В ХМЛ файле есть состояния кнопки можеет для любого задать фон ,фотку или еще чтото что душе угодно

Ответ 3



Пример как применять для фона кнопки изображение из Drawable по клику: Button btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btn = (Button) findViewById(R.id.expandableButton1); btn.setOnClickListener(this); } @Override public void onClick(View v) { btn.setBackground(ContextCompat.getDrawable(this, R.drawable.ic_plus_1)); }

Ответ 4



Можно использовать LinearLayout с ImageView вместо кнопки и вместо background для ImageView задавать через SRC. При клике по LinearLayout потом можешь задать другую картинку с помощью метода setBackgroundResource()

пятница, 24 января 2020 г.

Как лучше хранить картинки приложения в drawable или assets

#java #android #bitmap #android_drawable #android_assets


Приложение имеет сложный дизайн и по этому было решено делать прорисовку на surfaceView,
то есть почти нет никаких xml файлов, все отрисовывается программно.  Но есть достаточно
большое кол-во небольших png файлов, разного размера. Подскажите каким образом лучше
хранить все эти файлы? варианты которые я рассматриваю: drawable - хранить в общей
папке и изменять их размер программно, assets - все то же самое и есть третий вариант
- загружать все картинки как атлас текстур в одном файле а потом создавать bitmap'ы
по областям большого файла.
Опишите пожалуйста плюсы и минусы каждого варианта, может есть ещё какие-то варианты
с которыми вы сталкивались?(Загрузка через интернет не подходит).
    


Ответы

Ответ 1



Каталог asset принципиально отличается от drawable тем, что drawable позволяет хранить разные картинки для разных разрешений, ориентаций и локалей. asset же позволяет организовать хранение в виде как бы файлов. Для вашего случая, я полагаю, drawable таки более предпочителен, поскольку вы можете организовать доступ через идентификаторы картинок, в случае же asset вам придется организовать доступ через как бы файловую систему, с чтением, организацией потока и проч., типа так: public void loadImageFromAsset() { try { InputStream ims = getAssets().open("cat.jpg"); Drawable d = Drawable.createFromStream(ims, null); mImage.setImageDrawable(d); } catch(IOException ex) { return; } } Теперь, вопрос касательно "пилить/не пилить" на картинки для разных dpi, принципиально это отличается только тем что в случае если вы не будете "пилить" картинки, то вы или накалываетесь на OutOfMemoryException на больших картинках, либо программно меняете разрешение картинки через InSampleSize (масштабирование картинки): public static int calculateInSampleSize( BitmapFactory.Options options, int reqWidth, int reqHeight) { // Raw height and width of image final int height = options.outHeight; final int width = options.outWidth; int inSampleSize = 1; if (height > reqHeight || width > reqWidth) { final int halfHeight = height / 2; final int halfWidth = width / 2; // Calculate the largest inSampleSize value that is a power of 2 and keeps both // height and width larger than the requested height and width. while ((halfHeight / inSampleSize) >= reqHeight && (halfWidth / inSampleSize) >= reqWidth) { inSampleSize *= 2; } } return inSampleSize; } То есть выводите так: // сначала проверяете реальный размер битмапа final BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); //далее вычисляем inSampleSize options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // теперь декодируем с правильным масштабированием options.inJustDecodeBounds = false; Bitmap bimtap=BitmapFactory.decodeResource(res, resId, options); //отображаем imageView.setImageBitmap(bitmap); Подробнее здесь Так вот в случае, когда картинки хранятся в раздельных drawable-??dpi - все эти вычисления делаются уже заранее. Тем самым экономится время на масштабирование картинок. Вам решать, хотите вы заранее масштабировать или вы согласны часть процессорного времени убить на вычисления с масштабированием - зависит от задачи. Если решите не "пилить" картинки на разные dpi - складывайте их в drawable-nodpi. По-поводу кэширования или асинхронной загрузки картинок. Существует довольно много различных либ, которые решают эту проблему, например universal-image-loader или новомодный Picasso

суббота, 7 декабря 2019 г.

Директории drawable и mipmap в Android Studio

#android #android_studio #android_drawable #android_resources #mipmaps


Меня интересует такой вопрос: у меня в Android Studio есть только папка drawable,
нету папок drawable-hdpi, ...-mdpi, ...-xhdpi, ...-xxhdpi. Мне их нужно создать? Но
есть mipmap-hdpi, mipmap-mdpi, mipmap-xhdpi, mipmap-xxhdpi. Куда нужно загружать иконки,
которые я хочу использовать в своём проекте? Спасибо.
    


Ответы

Ответ 1



Да, нужно создать. Правой клик на каталоге "res" - new - android resource directory. Графика с mipmap появились в android 4.3 Mipmapping for drawables. Флаг позвозволяет в некоторых случаях получить лучшее качество картинок при уменьшении за счет большего потребления памяти. Последние лучшие практики от google говорят, что иконки приложения лучше держать в mipmap-, а не в drawable-. Можно смело им следовать, проблем на старых версиях android с ними не возникнет.

суббота, 22 июня 2019 г.

Как нарисовать фигуру подобную картинке

Как нарисовать подобную фигуру в xml. И стоит ли ее рисовать, или лучше использовать png (будет использоваться в качестве кнопки и будет в дальнейшем анимироваться)


Ответ

Используйте 9-patch png. Добавьте к изображению раму толщиной в один пиксель, которая будет содержать информацию для растягивания изображения и размещения на нем контента.
И измените расширение файла на имя_файла.9.png
В дальнейшем это изображение можно будет использовать в качестве фона, который будет растягиваться в нужных местах, таким же образом делаются разные облачка для диалогов и.т.д.
Преобразовать также можно с помощью png to 9-patch сервисов.

пятница, 21 июня 2019 г.

Изменение цвета на png программно

Есть изображение .png, это иконка для таба, для нее я сделал селектор, что бы при активном и неактивном табе она имела разный цвет. Пробовал PorterDuff.Mode но результат не совсем такой как я хотел. Меня интересует как можно заменить в селекторе цвет активной иконки динамически. Что бы вместо фиолетовой иконки можно было сделать, красную, зеленую, желтую и т.д.
Пример моего селектора:


Пример иконки:


Ответ

Изменить цвет можно так:
TintIcons.java
public class TintIcons {
public static Drawable tintIcon(Drawable icon, ColorStateList colorStateList) { if(icon!=null) { icon = DrawableCompat.wrap(icon).mutate(); DrawableCompat.setTintList(icon, colorStateList); DrawableCompat.setTintMode(icon, PorterDuff.Mode.SRC_IN); } return icon; }
public static void tintImageView(ImageView imageView, int colorStateListResId) { ColorStateList list = ContextCompat.getColorStateList(imageView.getContext(), colorStateListResId); if (list != null) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { imageView.setImageTintList(list); } else { imageView.setImageDrawable(tintIcon(imageView.getDrawable(), list)); } } } }
/res/color/icon_state_list.xml

MainActivity.java
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TintIcons.tintImageView((ImageView) findViewById(R.id.img_view), R.color.icon_state_list); } }
Вместо списка состояний можно передавать просто цвет (например, R.color.colorPrimary), тогда картинка просто перекрасится. Аналогично можно перекрасить фон кнопок и т.д. (получив предварительно картинку фона через imageView.getBackground()).
Как видно все эти причуды нужны для pre-Lollipop. Для lollipop+ достаточно titnList задать в разметке...

Проблема с углами в круглой кнопки

У меня есть ListView, а в элементе списка есть круглая кнопка.
Делал ее круглой так:

Выглядит она круглой, но при нажатии на элемент видно квадрат кнопки:

Как можно сделать, чтоб кнопка даже при нажатии на элемент оставалась круглой?


Ответ


Но лучше разделять логику состояния\рисунок

среда, 19 июня 2019 г.

Кнопка с градиентом

Пытаюсь сделать вот такую кнопку

пытаюсь это сделать подобным образом, что то типа:


т.е. я пытаюсь сделать одну фигуру градиентом и внутри нее еще одну фигуру просто белую с отступами но вижу либо один градиент либо только белое, пробовал отступы и там и там ставить.В чем может быть проблема? Как сделать вложенные фигуры?


Ответ

В общем то у меня проблема не воспроизводится.
вот разметка:

вот результат:

я только убрал атрибуты, дублирующие дефолтные и все в основном. Еще градиент от центра.

суббота, 15 июня 2019 г.

mipmap и drawable - в каких случаях использовать

Здравствуйте! В проекте, над которым сейчас работаю, ВСЕ изображения были помещены предыдущим разработчиком в mipmap-xxxx. В drawable остались только .xml файлы. Мне казалось, что mipmap должны использоваться только для иконок приложения. Собственно вопрос - на сколько правильно хранить ВСЕ изображения в mipmap или же это ошибка? Было бы хорошо, по возможности, использовать в ответах ссылки на документацию


Ответ

Вы правильно написали, что mipmap обычно используется для иконок приложения. mipmap появились в android 4.3 Mipmapping for drawables. В данном статье описано почему лучше для иконок использовать mipmap. Если кратко, то когда ваши иконки расположены в drawable - [разрешение], то могут возникнуть проблемы отображения иконки не того размера.

понедельник, 20 мая 2019 г.

Оптимизация приложения под разные экраны (drawable)

Сразу извиняюсь за вопрос т.к. тема давно не новая, но всё же. Как подготовить drawable для разных экранов? Ведь диагональ может быть разной, а плотность пикселей одна и та же. И те рисунки что на экране 4.7-5 дюймов кажутся нормальными на экранах 7+ совсем мелкие. И еще вопрос можно ли квалификаторы указывать так (drawable-xlarge-xhdpi)?? Заранее спасибо за ответ!


Ответ

Для начальной подготовки drawable я бы посоветовал использовать ImageAsset в самой студии, это облегчит генерацию и вы увидите разницу на разных устройствах.
drawable-xlarge-xhdpi
Так можно использовать, так как это разные квалификаторы. Первый - отвечает за размер/диагональ экрана, второй - за плотность.
Тема, очень хорошо описана во многих источниках, а лучше сразу оф доки читать, там очень хорошо всё разъясняется. https://developer.android.com/guide/practices/screens_support.html

пятница, 19 апреля 2019 г.

Удаление drawable-ресурсов

Когда происходит удаление drawable-ресурсов (when packaging an APK - при сборке APK или при установке APK на конкретное устройство?) и почему mipmap-ресурсы при этом не удаляются?
while drawable resources might be removed when packaging an APK, such as for the Gradle for Android split system for making density-specific editions of an app, mipmap resources are left alone, apparently
P.S. И что значит "Android split system"?


Ответ

Когда происходит удаление drawable-ресурсов (when packaging an APK - при сборке APK или при установке APK на конкретное устройство?)
Удаление ресурсов происходит на этапе сборки проекта (ведь цель этого – уменьшить размер APK). Исключить ресурсы можно с помощью оператора exclude, например:
exclude "ldpi", "xxhdpi", "xxxhdpi"
и почему mipmap-ресурсы при этом не удаляются?
В этом и есть вся фишка mipmap-ресурсов. Далее процитирую свой ответ
Зачем нужен mipmap? Для корректного отображения изображений на дисплеях с различными DPI в Android были введены квалификаторы (например, mdpi, hdpi). Чтобы изображения корректно выглядели на всех устройствах, необходимо разместить эти изображения со всеми доступными квалификаторами (в соответствующих разрешениях). Размещение изображений в различных разрешениях влечет за собой увеличение размера приложения. Допустим, Вы знаете, что у Боба такое-то значение DPI, а у Алисы – некоторое другое. Чтобы уменьшить размер приложения, Вы можете отдельно собрать приложение для Боба и отдельно для Алисы, включая изображения только в необходимом разрешении. При сборке проекта Вы можете исключить ненужные изображения (с помощью соответствующей конфигурации Gradle), например:
exclude "ldpi", "xxhdpi", "xxxhdpi" Вроде бы все хорошо: исключены ненужные изображения и размер приложения уменьшен. Однако не все так гладко. Некоторые изображения могут быть отображены в разрешениях, которые не соответствуют тому, в котором Вы оставили эти изображения в проекте. Пример – иконка приложения, в некоторых лаунчерах она может быть увеличена. Так как иконка приложения у Вас в единственном разрешении (как и все другие изображения), то она будет увеличена и произойдет т.н. пикселизация – изображение будут размыто (при большом апскейле будут заметны квадратики). Вот тут-то и приходит на помощь mipmap – изображения, размещенные там, не будут исключены. То есть если Вы укажите в Gradle:
exclude "ldpi", "xxhdpi", "xxxhdpi" то соответствующие изображения из drawable будут исключены, а из mipmap – нет.

Android split system – условное название совокупности конструкций, которые используется для разделения ресурсов для APK.

вторник, 9 апреля 2019 г.

drawable xml(android)

Как программно задать изображение на кнопке при клике на неё?
android:drawableRight="@drawable/ic_plus_1"

четверг, 11 октября 2018 г.

Директории drawable и mipmap в Android Studio

Меня интересует такой вопрос: у меня в Android Studio есть только папка drawable, нету папок drawable-hdpi, ...-mdpi, ...-xhdpi, ...-xxhdpi. Мне их нужно создать? Но есть mipmap-hdpi, mipmap-mdpi, mipmap-xhdpi, mipmap-xxhdpi. Куда нужно загружать иконки, которые я хочу использовать в своём проекте? Спасибо.


Ответ

Да, нужно создать. Правой клик на каталоге "res" - new - android resource directory. Графика с mipmap появились в android 4.3 Mipmapping for drawables. Флаг позвозволяет в некоторых случаях получить лучшее качество картинок при уменьшении за счет большего потребления памяти. Последние лучшие практики от google говорят, что иконки приложения лучше держать в mipmap-, а не в drawable-. Можно смело им следовать, проблем на старых версиях android с ними не возникнет.