Плиточный растягивается иногда тянется - PullRequest
54 голосов
/ 02 декабря 2010

У меня есть 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 ]

39 голосов
/ 29 февраля 2012

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

«Тапас» на канале 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);
        }
    }
}

Applyэто для всех представлений, у которых установлен мозаичный фон (например, findViewById им).

Кроме того, у меня сложилось впечатление, что эта ошибка начала исправляться после установки «anyDensity = true» в AndroidManifest.xml

9 голосов
/ 02 мая 2011

У меня точно такая же проблема, кроме с CLAMP TileMode.У меня есть растровое изображение, которое я хочу затем просто растянуть внизу, и настроить его как определенный BitmapDrawable в формате XML, и в окне графического просмотра все выглядит нормально, независимо от того, какого размера я делаю ViewImage, он рисует мое растровое изображение сверхуи затем повторяет последние пиксели для заполнения до конца.

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

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

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

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

6 голосов
/ 02 августа 2013

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

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

то есть: 16 на 16 пикселей для актива плитки xhdpi.

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

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

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

Похоже, это решило проблему для меня, по крайней мере. Стоит выстрел.

6 голосов
/ 19 июня 2012

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

2 голосов
/ 15 февраля 2011

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

1 голос
/ 01 мая 2012

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

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

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

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

Было бы очень неплохо иметь надежный обходной путь.

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

0 голосов
/ 10 октября 2017

У меня тоже была такая же проблема.Чего мне не хватало, так это того, что нам нужно добавить scaletype к fitXY в изображении, чтобы растровое изображение xml работало должным образом.*

0 голосов
/ 24 ноября 2016

Я переместил свое изображение из папки drawable-xhdpi в drawable, и все было хорошо.

0 голосов
/ 07 июня 2016

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

...