Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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);

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

Ответ 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"/>