Итак, моя общая проблема заключается в том, что я пытаюсь динамически устанавливать изображения 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.