layerDrawable не отображается на imageButton для небольших экранов

Итак, моя общая проблема заключается в том, что я пытаюсь динамически устанавливать изображения imageButton, основываясь на захвате области размером 80 x 80 из числа Drawables размером 400 x 600 png, наложении их слоев и imageButton.setImageDrawable() на кнопки. Это на самом деле работает... при условии, что устройство имеет большой экран. Для маленьких экранов (читай: телефоны) это не получается. Конечно, я тестировал только "большие экраны" для BlueStacks, однако сбой на "Маленьких экранах" повлиял на мой эмулятор Nexus 5, Turbo друга и мой новый (возможно, двухмесячный) Turbo 2.

Рисунок, показывающий кнопки с лицами для BlueStacks, но ничего для телефона в эмуляторе

Что касается кода... ниже приводится внутренняя часть цикла for, который создает кнопки:

Drawable[] layers = new Drawable[8];
                    faceMaker(layers);
                    layers[1] = changeColor(layers[1], Color.parseColor("#" + listChoice.get(nN -1 + nAdd).toString().substring(1, 7)));
                    layers[2] = changeColor(layers[2], Color.parseColor(CharacterDatabase.getColor(156)));
                    layers[3] = changeColor(layers[3], Color.parseColor(CharacterDatabase.getColor(155)));
                    layers[4] = changeColor(layers[4], Color.parseColor("#" + listChoice.get(nN -1 + nAdd).toString().substring(1, 7)));
                    layers[5] = changeColor(layers[5], Color.parseColor("#" + listChoice.get(nN -1 + nAdd).toString().substring(1, 7)));
                    layers[6] = changeColor(layers[6], Color.parseColor(CharacterDatabase.getColor(155)));
                    layers[7] = changeColor(layers[7], Color.parseColor(CharacterDatabase.getColor(155)));
                    layers[0] = changeColor(layers[0], Color.parseColor(CharacterDatabase.getColor(155)));
                    LayerDrawable layerDrawable = new LayerDrawable(layers);
                    btnChoice[nN].setImageDrawable(layerDrawable);
                    nBtnAct[nN] = 1;

Там, где "faceMaker" захватывает рисованные объекты из ресурсов, использует setBounds для захвата области рисования размером 80 на 80, которая соответствует тому, что вы видите (полные рисунки размещены выше, с другими слоями и добавлены, см. Левое изображение для ощущение разницы в размерах); Вот пример из FaceMaker():

int id = imgApp.getContext().getResources().getIdentifier(sSex.substring(0, 1) + "hair" + Integer.toString(CharacterDatabase.getSlot(7)), "drawable", imgApp.getContext().getPackageName());
    layers[0] = ContextCompat.getDrawable(imgApp.getContext(), id).mutate();
    layers[0] = new BitmapDrawable(imgApp.getContext().getResources(), Bitmap.createBitmap(((BitmapDrawable) layers[0]).getBitmap(),   nFaceStartX, nFaceStartY, nFaceX, nFaceY));
    layers[0].mutate();

Итак, мой вопрос... почему это работает на больших экранах, но ужасно терпит неудачу на меньших? Была похожая проблема с другой кнопкой (1 Drawable), которая отображала только часть Drawable; Устранена проблема setBounds, чтобы решить эту проблему, однако мне нужно иметь возможность захватывать только голову для моих кнопок, чтобы она не работала для общего решения faceMaker/button.

Это проблема setBounds? Если так, как я могу решить это и все еще захватить область 80 на 80, в которой я нуждаюсь? (nFaceStartx, nFacex и т. д. являются границами, которые находят область 80 на 80). если нет, то с чем это связано? И как мне это исправить в коде?

Редактировать: добавлена ​​строка Log.e ("width", Integer.toString (layerDrawable.getIntrinsicWidth ()) + "" + Integer.toString (btnChoice [nN].getWidth ()));

.. которые плюют обратно "ширина 80 50" на Bluestacks (где это работает) и "ширина 80 150" на телефон-эмулятор, где он не отображается. Понятия не имею, почему это может происходить, но это так, если это имеет значение. Расположение: ширина и расположение: высота - 50 дп в XML.

2 ответа

Это может быть связано с проблемой 6.0; Я также получаю эти сообщения об ошибках:

05-31 10:10:49.237 2419-2448/neverforged.neverforgedroleplayinggame E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa1f84a70
05-31 10:10:57.808 2419-2448/neverforged.neverforgedroleplayinggame E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa1f84d10
05-31 10:11:09.134 2419-2448/neverforged.neverforgedroleplayinggame E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa1f82770
05-31 10:11:20.982 2419-2448/neverforged.neverforgedroleplayinggame E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa1f822a0
05-31 10:15:49.477 2419-2448/neverforged.neverforgedroleplayinggame E/Surface: getSlotFromBufferLocked: unknown buffer: 0xa1f83730

Проблема заключается в изменении размера изображения в Android (меньший экран означает, что оно сжимает изображение до нужного размера, затем захватывает область с изображения / ничего в нем и использует это); переместил все в папку с именем "drawable-nodpi" и установил размеры вручную на дисплее, ситуация разрешилась.

Как я обнаружил здесь однажды, я понял, что это происходит

Другие вопросы по тегам