Плиточный тянущий иногда тянется
У меня есть ListView, чьи элементы имеют плиточный фон. Для этого я использую следующий нарисованный 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, так как я где-то читал, что без него могут быть ошибки. Это ничего не изменило.
У кого-нибудь была такая же проблема? Как ты это починил?
9 ответов
Меня тоже укусила эта проблема. Очень сложно диагностировать, еще труднее найти похожие отчеты и полезные решения.
"Tapas" на канале irc-канала freenode # android-dev поставляется с использованием следующего служебного метода:
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
У меня точно такая же проблема, кроме как с CLAMP TileMode. У меня есть растровое изображение, которое я хочу затем просто растянуть внизу и настроить как BitmapDrawable, определенного в XML, и в окне графического просмотра все выглядит нормально, независимо от того, какого размера я делаю ViewImage, он рисует мое растровое изображение сверху и затем повторяет последние пиксели для заполнения до конца.
Запуск приложения на различных SDK основывается на эмуляторе и на моем собственном телефоне, и все это приводит к прямому искажению типа "заливка", которое совершенно бесполезно.
Решение оказалось простым повторным применением TileMode каждый раз, когда я изменял размер ImageView в своем коде:
((BitmapDrawable)ascender.getDrawable()).setTileModeY(TileMode.CLAMP);
Теперь все отлично рисует. Так что да, это похоже на ошибку для меня.
На эту тему в Интернете много шума, с различными (и многочисленными) предлагаемыми решениями.
- Если вы все еще в замешательстве, я предлагаю сохранить все ресурсы мозаичного изображения в квадрате, с размерами base-2.
то есть: 16 на 16 пикселей для актива плитки xhdpi.
Я надеялся, что платформа Android будет "перегружена", чтобы заполнить пространство, если растровое изображение не будет правильно тесселяции, - а затем обрезать трата. Однако испытание мозаичного растрового изображения размером 10px*10px по mdpi, hdpi и xhdpi (и v2.3 до v4.0) "непоследовательно" показало это растяжение.
Измерение base-2 учитывает целое и даже разделение по мере прохождения различных разрешений и когда каждое устройство пытается раскрашивать плитки каждый раз, когда создается представление.
В разработке для Android мы соревнуемся с различными аппаратными средствами, а производители опускают свои пальцы в платформу - иногда этот вид черной магии просто работает.
Похоже, это решило проблему по крайней мере для меня. Стоит выстрел.
Поскольку я не видел ссылку здесь, это было подтверждено как ошибка в Android. Это было исправлено в ICS. Видите, как можно нарисовать XML растровое изображение. Больше подробностей.
Это звучит как ошибка, хотя я никогда не видел это сам. Если у вас есть простой APK, который воспроизводит проблему, отправьте его мне (romainguy /at/ android.com) или сообщите об ошибке здесь.
У меня тоже была такая же проблема. Чего мне не хватало, так это того, что нам нужно добавить scaletype к fitXY в изображении для правильной работы растрового изображения 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"/>
Эта запись в блоге обсуждает проблему
в сочетании с этим решением от Tapas, перечисленным Ivo van der Wijk, оно работает для меня.
Ключ должен был удалить настройку мозаики из XML, а затем установить плитку во время выполнения. Это не работает для меня, если они оба настроены на плитку.
Редактировать: на самом деле, я солгал. Даже с этим, кажется, иногда не удается плитки.
Было бы очень хорошо иметь надежный обходной путь.
Редактировать 2: установить его на что-то другое (например, CLAMPED), а затем вернуть его обратно, похоже, работает.
Все еще страдает от этой проблемы на старых устройствах, работающих под управлением Lollipop, возникает при изменении ориентации. Установка режима плитки программно не сработала, но этот ответ сработал: /questions/27236894/oshibka-v-otrisovke-xml-rastrovogo-izobrazheniya/27236903#27236903
Я переместил свое изображение из drawable-xhdpi
в drawable
папка и все было хорошо.