Intereting Posts
Android SDK и AVD Manager -Cant создать AVD в правильном месте файла Байт байта Android для Bitmap Как сделать Android Google Maps v2, MAP_TYPE_NONE и черные квадраты Как я могу сделать свой макет прокруткой как по горизонтали, так и по вертикали? Facebook AccessToken.getAccessToken имеет значение null при открытии приложения даже после первого входа Вырезать, скопировать, вставить в android Не удалось применить плагин. Плагин Android Gradle 3.0.0-alpha5 не должен применяться к проекту. «Активность была уничтожена» иногда при заполнении viewpager фрагментами Структура проекта Android Studio не отображается должным образом Программно задавать левую выдержку в TextView React Native: Как мне управлять размером экрана 9000 Android? Обнаруживать, когда фрагмент рисуется? Почему добавление OnClickListener внутри onBindViewHolder из RecyclerView.Adapter считается плохой практикой? Как сказать OkHttpClient игнорировать кеш и принудительно обновить сервер? Android: битмапы, загруженные из галереи, поворачиваются в ImageView

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

Есть хороший пост, сделанный популярным разработчиком 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); 

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