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

Итак, моя общая проблема заключается в том, что я пытаюсь динамически устанавливать изображения imageButton на основе захвата области 80 x 80 из числа 400 x 600 png Drawables, накладывать их и 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/кнопки.

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

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

..который выплевывает «ширину 80 50» на Bluestacks (где это работает) и «ширину 80 150» на эмуляторе телефона, где она не отображается. Не знаю, почему это может происходить, но это так, если это имеет значение. Макет: ширина и макет: высота равны 50dp в xml.


person Darin LaSota    schedule 30.05.2016    source источник


Ответы (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
person Darin    schedule 31.05.2016
comment
нет, переключил эмулятор на леденец, а изображения по-прежнему нет (хотя ошибок E/Surface тоже нет, так что не то) - person Darin; 31.05.2016

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

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

person Darin    schedule 03.06.2016