Плитка, вытягиваемая иногда, растягивается
У меня есть ListView, чьи элементы имеют мозаичный фон. Для этого я использую следующий drawable xml:
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/tile"
android:tileMode="repeat" />
Обычно это работает. Иногда, однако, src drawable не выгравирован, а растянут, чтобы заполнить весь элемент списка. (У меня есть несколько разных таких фрагментов, и я использую их в одном ListView.Если растягивание вместо черепицы, это никогда не было во всех сразу, для чего это стоит.)
Я также попытался добавить android:dither="true"
к этому xml, так как я где-то читал, что без него могут быть ошибки. Это ничего не изменило.
У кого-то была такая же проблема? Как вы это исправили?
Ответы
Ответ 1
Я тоже укусил эту проблему. Очень трудно диагностировать, еще труднее найти похожие отчеты и полезные решения.
"Tapas" на канале android-dev irc канала freenode появился со следующим методом утилиты:
public static void fixBackgroundRepeat(View view) {
Drawable bg = view.getBackground();
if (bg != null) {
if (bg instanceof BitmapDrawable) {
BitmapDrawable bmp = (BitmapDrawable) bg;
bmp.mutate(); // make sure that we aren't sharing state anymore
bmp.setTileModeXY(TileMode.REPEAT, TileMode.REPEAT);
}
}
}
Примените его ко всем представлениям, у которых установлен черепичный фон (например, findViewById).
Кроме того, у меня создается впечатление, что эта ошибка начала действовать после установки "anyDensity = true" в AndroidManifest.xml
Ответ 2
У меня только одна и та же проблема, кроме CLAMP TileMode. У меня есть растровое изображение, которое я хочу, чтобы просто растянуться на дно и настроить его как XML-битмаддрайвер, и в окне графического просмотра все выглядит нормально, независимо от того, какой размер я делаю, ViewImage рисует мое растровое изображение наверху а затем повторяет последние пиксели, которые будут заполняться до конца.
Запуск приложения на различных SDK-сборках на эмуляторе и на моем собственном телефоне все-таки произвел прямое искажение типа "заполнение", которое совершенно бесполезно.
Решение оказалось простым повторным применением TileMode каждый раз, когда я изменил размер ImageView в своем коде:
((BitmapDrawable)ascender.getDrawable()).setTileModeY(TileMode.CLAMP);
Теперь все это прекрасно. Так что да, это выглядит как ошибка для меня.
Ответ 3
Поскольку я не видел ссылку здесь, это было подтверждено как ошибка в Android. Это было зафиксировано в ICS. Подробнее см. XML-версию Bitmap tileMode?.
Ответ 4
В этой теме много шума, с различными (и многочисленными) предлагаемыми решениями.
- Если вы все еще в недоумении, мое предложение состоит в том, чтобы сохранить все черепичные растровые изображения
ресурсы к квадрату, размеры базы-2.
то есть: 16px на 16px для элемента xhdpi tile.
Я надеялся, что платформа Android будет "чересстрочной", чтобы заполнить пробел, если растровое изображение не было хорошо тесселировано, а затем обрезать отходы. Тем не менее, пробитие 10px * 10px черепичного растрового изображения по mdpi, hdpi и xhdpi (и v2.3 до v4.0) "непоследовательно" показало это растяжение.
Размер базы-2 допускает полное и четное деление при прохождении различных разрешений и когда каждое устройство пытается рисовать плитки каждый раз при создании представления.
В Android-разработке мы оспариваем аппаратное обеспечение ранжирования и продавцы, погружающиеся в платформу - иногда это просто тривиальная черная магия работает.
Кажется, это разрешило проблему для меня, по крайней мере. Стоит сделать снимок.
Ответ 5
Это звучит как ошибка, хотя я никогда не видел ее сам. Если у вас есть простой APK, который воспроизводит проблему, отправьте ее мне (romainguy/at/android.com) или сообщите об ошибке здесь.
Ответ 6
В этом блоге обсуждается проблема
в сочетании с этим решением от Tapas, указанным Ivo van der Wijk, он работает для меня.
Ключ должен был удалить параметр tiled из XML, а затем установить его в файл во время выполнения. Это не работает для меня, если они оба установлены в плитку.
Изменить: на самом деле, я солгал. Даже с этим, кажется, иногда не удается плитку.
Было бы очень приятно иметь надежную работу.
Изменить 2: установить его на что-то еще (например, CLAMPED), а затем установить его обратно, кажется, работает.
Ответ 7
Все еще страдает от этой проблемы на старых устройствах, работающих с Lollipop, происходит при изменении ориентации. Настройка режима плитки программно не сработала, но этот ответ сделал: fooobar.com/questions/103971/...
Ответ 8
Я переместил изображение с drawable-xhdpi
в папку drawable
, и все было в порядке.
Ответ 9
У меня тоже была такая же проблема. То, что мне не хватало, было то, что нам нужно добавить scaletype для fitXY в imageview, чтобы xml растровое изображение работало правильно.
tile_bitmap.xml
<bitmap
xmlns:android="http://schemas.android.com/apk/res/android"
android:src="@drawable/tile"
android:tileMode="repeat" />
layout.xml
<ImageView
android:layout_width="match_parent"
android:src="@drawable/tile_bitmap"
android:layout_height="match_parent"
android:scaleType="fitXY"/>