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" и установил размеры вручную на дисплее, ситуация разрешилась.