Плитка вытягиваемая иногда растягивается

У меня есть 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, так как я где-то читал, что без него могут быть ошибки. Это ничего не изменило.

У кого-то была такая же проблема? Как ты это починил?

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

«Tapas» на канале freenode # android-dev irc появился со следующим методом утилиты:

 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. У меня есть растровое изображение, которое я хочу, чтобы потом просто растянуться внизу и настроить его как XML, определенный BitmapDrawable, и в окне графического просмотра все выглядит отлично, независимо от того, какой размер я делаю ViewImage, он рисует мое растровое изображение наверху А затем повторяет последние пиксели для заполнения до конца.

Запуск приложения на различные SDK-сборки на эмуляторе и на моем собственном телефоне все затем произвел прямое искажение типа «заполнение», которое совершенно бесполезно.

Решением оказалось просто повторное применение TileMode каждый раз, когда я изменил размер ImageView в своем коде:

 ((BitmapDrawable)ascender.getDrawable()).setTileModeY(TileMode.CLAMP); 

Теперь все прекрасно. Так что да, это похоже на ошибку.

Поскольку я не видел ссылку здесь, это было подтверждено как ошибка в Android. Это было зафиксировано в ICS. См. XML-drawable Bitmap tileMode bug? Больше подробностей.

В этой теме много шума, с различными (и многочисленными) предлагаемыми решениями.

  • Если вы все еще в недоумении, мое предложение состоит в том, чтобы сохранить все ресурсы разбитого растрового изображения в квадратные, базовые 2 измерения .

Т.е. 16px на 16px для элемента xhdpi tile.

Я надеялся, что платформа Android будет «чересстрочной», чтобы заполнить пробел, если растровое изображение не было прекрасно тесселировано, а затем обрезать отходы. Тем не менее, пробитие 10px * 10px черепичного растрового изображения по mdpi, hdpi и xhdpi (и v2.3 до v4.0) «непоследовательно» показало это растяжение.

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

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

По-видимому, это разрешило мне проблему. Стоит сделать снимок.

Это звучит как ошибка, хотя я никогда не видел ее сам. Если у вас есть простой APK, который воспроизводит проблему, отправьте ее мне (romainguy / at / android.com) или напишите здесь ошибку.

В этой записи в блоге обсуждается проблема

В сочетании с этим решением от Tapas, перечисленным Ivo van der Wijk, он работает для меня.

Ключ был в том, чтобы удалить шаблон из настроек XML, а затем установить его во время выполнения. Это не работает для меня, если они оба настроены на черепицу.

Правка: на самом деле я солгал. Даже с этим, похоже, иногда не удается плитку.

Было бы очень приятно иметь надежную работу.

Изменить 2: установить его на что-то еще (например, CLAMPED), а затем установить его обратно, кажется, работает.

Все еще страдает от этой проблемы на старых устройствах, работающих на Lollipop, происходит при изменении ориентации. Настройка режима плитки программно не сработала, но этот ответ сделал: https://stackoverflow.com/a/13480444/658727

Я переместил изображение с drawable-xhdpi в папку с возможностью drawable-xhdpi и все было в порядке.