Codename One — ошибка в расчете положения метки и значка

Я продолжил создание своих собственных компонентов Button, переопределив метод paintBackground(Graphics g), чтобы некоторые круговые диаграммы отображались прямо с кнопкой. Пример желаемого результата: Пример желаемого результата

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

Глядя на Label API, есть метод setGap(int). Поскольку зазор по умолчанию равен 0, я использовал отрицательное значение, чтобы сблизить их. Это удалило пространство, как предполагалось, однако имело побочный эффект: позиционирование метки и значка было отключено при применении любого значения зазора. Вместо того, чтобы влиять только на значения Y метки и значка, значение зазора также влияет на значения X.

После долгих копаний я нашел ошибку в кодовой базе самого CN1. в методе drawLabelComponent() класса CodenameOneImplementation есть следующий фрагмент (центр выравнивания и положение текста внизу, строка 7254):

                case Label.BOTTOM:
                case Label.TOP:
                    x = x + (cmpWidth - (preserveSpaceForState + leftPadding
                            + rightPadding
                            + Math.max(((icon != null) ? iconWidth + gap : 0),
                                    stringWidth))) / 2;
                    x = Math.max(x, cmpX + leftPadding + preserveSpaceForState);
                    y = y + (cmpHeight - (topPadding
                            + bottomPadding
                            + ((icon != null) ? iconHeight + gap : 0)
                            + fontHeight)) / 2;
                    break;

Очевидно, что переменная gap включена в расчет как для значений X, так и для Y, что не может быть верным для установки зазора между иконкой и текстом в нижней и верхней текстовой позиции. случаи.

Глядя на случаи левой и правой позиции текста, переменная пробела используется только для вычисления X, а НЕ для вычисления Y.

Если это действительно предполагаемое поведение, кто-нибудь, пожалуйста, просветите меня, как избавиться от пробела, не затрагивая положение X текста и значка.

Спасибо.


person Lequi    schedule 17.04.2019    source источник


Ответы (1)


Похоже, это ошибка, мы это исправим. Обратите внимание, что зазор не предназначен для отрицательных значений, поэтому, если у вас это не получается, это не обязательно ошибка.

person Shai Almog    schedule 18.04.2019
comment
правда, я использую его с отрицательными значениями. но, во-первых, отрицательные значения не ограничены, и они, похоже, работают по назначению (кроме этого конкретного варианта использования), а во-вторых, проблема возникает даже с положительными значениями. Был бы очень признателен за исправление для этого, или вы можете сообщить мне, как принять участие в том, чтобы помочь исправить это. - person Lequi; 18.04.2019
comment
Это уже исправлено и находится в сегодняшнем выпуске. Мой второй комментарий был просто отказом от ответственности. - person Shai Almog; 19.04.2019
comment
Убедившись, что у меня установлена ​​последняя версия CN1, и я обновил библиотеки проекта, я все еще вижу возникающую ошибку как в приложении визуально, так и в коде. Теперь затронутая кодовая строка — 7634. ​​Итак, в этом классе было много изменений, но пробел все еще влияет на значение x. Могут быть крайние случаи, которые я не вижу прямо сейчас, но я верю, что удаление +gap из строки расчета x в случаях выравнивания по центру TOP и BOTTOM исправит это. Тогда это также было бы логически совместимо со случаями выравнивания по центру LEFT и RIGHT, в которых GAP влияет только на значение x, но не на y. - person Lequi; 26.07.2019
comment
Это сложнее, поскольку метка изначально рисуется на iOS и Android, поэтому код существует в этих портах. - person Shai Almog; 27.07.2019