Intereting Posts
Ошибка MODE_PRIVATE в sharedpreferences ActionBarSherlock – стиль содержит ключ с плохой записью Пикассо: из памяти Использование fade в анимации для просмотра Android media player – как отключить запрос диапазона? (Сломанная аудиопотоковая передача на Nexus 7) Проблема уведомления об ожидающем намерении андроида Какова основная цель методов setTag () getTag () View? Обработка заголовка ActionBar с помощью стека фрагментов? Унаследованные методы учитывают ограничение на Dex в Android? Использование Gradle для разделения внешних библиотек в разделенных файлах dex для решения ограничений метода Dalvik 64k для Android «ОШИБКА: невозможно восстановить ключ» при экспорте подписанного приложения Android с существующим хранилищем ключей Волейбол и AsyncTask Панель навигации под панелью инструментов BitmapFactory.decodeResource возвращает измененный Bitmap в Android 2.2 и неизменный Bitmap в Android 1.6 Могу ли я запустить Android Studio (эмулятор Android SDK) на виртуальной машине Microsoft-Hyper-V?

Использование закругленных углов

Есть хороший пост, сделанный популярным разработчиком Google Роменом Гаем, который показывает, как эффективно использовать закругленные углы (называемые «StreamDrawable» в его коде ).

Сам образец очень хорошо работает на моей Galaxy S3 в портретном режиме, но у меня есть несколько проблем с ним:

  1. Если экран небольшой (например, на экранах qvga), показанные изображения обрезаются.

  2. Если у меня есть bitmap ввода, который слишком мал, чем я хочу показать, выходное изображение имеет размытые края. Даже на Galaxy S3, когда вы запускаете образец кода, и он на пейзаже, он выглядит ужасно:

    Введите описание изображения здесь

  3. Я все еще не уверен в этом (так как я использую обходное решение для масштабирования изображения для использования кода примера), но он считает, что даже это решение является немного медленным при использовании в listView. Может быть, для этого есть решение renderscript?

Не имеет значения, использую ли я setImageDrawable или setBackgroundDrawable. Это должно быть что-то само собой.

Я пытался играть с переменными и bitmapShader, но ничего не получилось. К сожалению, TileMode не имеет значения только для растягивания изображения, только каким-то образом его разбивая .

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

Как исправить эти проблемы и использовать этот замечательный код?

Solutions Collecting From Web of "Использование закругленных углов"

Я думаю, что решение, представленное на этом веб-сайте, хорошо работает.

В отличие от других решений, это не вызывает утечки памяти, хотя оно основано на решении Ромен Гая.

EDIT: теперь в библиотеке поддержки вы также можете использовать RoundedBitmapDrawable (используя RoundedBitmapDrawableFactory ).

У меня были некоторые проблемы с этим кодом, и я решил это.

Может быть, это тоже поможет:

1) в конструкторе хранят битмап в локальной переменной (например, private Bitmap bmp;)

2) переопределить еще два метода:

@Override public int getIntrinsicWidth() { return bmp.getWidth(); } @Override public int getIntrinsicHeight() { return bmp.getHeight(); } 

С уважением, DaRolla

Основная проблема заключается в том, что у TileMode TileMode нет опции масштабирования. В источнике Shader.TileMode.CLAMP , что он установлен в Shader.TileMode.CLAMP , а в документах описывается это как:

Реплицировать цвет края, если шейдер рисует вне своих исходных границ

Чтобы обойти это, есть три решения:

  1. Ограничьте размер представления, в котором drawable используется для размера растрового изображения.
  2. Ограничить область рисования; Например, изменить:

     int width = bounds.width() - mMargin; int height = bounds.height() - mMargin; mRect.set(mMargin, mMargin, width, height); 

    Для того, чтобы:

     int width = Math.min(mBitmap.getWidth(), bounds.width()) - mMargin; int height = Math.min(mBitmap.getHeight(), bounds.height()) - mMargin; mRect.set(mMargin, mMargin, width, height); 
  3. Масштабируйте растровое изображение до размера извлекаемого. Я переместил создание шейдера в onBoundsChange () и решил создать здесь новый растровый рисунок:

     bitmap = Bitmap.createScaledBitmap(mBitmap, width, height, true); mBitmapShader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); 

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