Учитывая среду с низким разрешением, как мы можем гарантировать, что графический объект идеально отцентрирован и всегда виден? - PullRequest
0 голосов
/ 25 января 2019

Я думал о том, как создать иллюзию одной гигантской кнопки на домашнем экране мобильного телефона.

cellphone_desktop

Мой план состоял в том, чтобы изменить фоновую графику домашнего экрана (обои) так, чтобы она выглядела как гигантская кнопка. Затем я бы сделал невидимую 2 на 2 или 3 на 3 сетку ярлыков домашнего экрана. Все невидимые ярлыки запускают одно и то же приложение.

Сетка значков главного экрана обычно состоит из 5 значков на 5 значков, но что, если это изменится? Например, что делать, если у пользователя проблемы со зрением и используется настройка большого значка.

Это превратилось в следующий вопрос: как мы можем нарисовать прямоугольник, который идеально центрирован по холсту влево / вправо, даже если для работы с пикселями не так много? Например, сетка значков мобильного телефона обычно состоит из 5 значков и 5 значков.

Мы хотим нарисовать «кнопку» на пиксельной сетке так, чтобы кнопка центрировалась на холсте. Если пиксельная сетка очень большая, то мы хотим, чтобы кнопка составляла примерно 60% ширины пиксельной сетки. Однако пиксельная сетка обычно мала.
У нас есть следующие ограничения:

  • Кнопка всегда должна быть видимой (ширина кнопки должна быть не менее одного пикселя)
  • кнопка должна быть идеально симметричной относительно центра сетки пикселей. (Кнопка не может быть немного влево или немного вправо.)
  • кнопка должна быть меньше или равна 60% ширины сетки пикселей

У нас есть следующая цель:

  • сделать кнопку как можно больше с учетом указанных выше ограничений

В типичном языке программирования, как мы можем написать функцию для расчета оптимальной ширины кнопки? Функция принимает ширину сетки пикселей в качестве входных данных, а функция выводит ширину кнопки.

1 Ответ

0 голосов
/ 25 января 2019

Прежде чем приступить к программированию, давайте сделаем немного MATH:

Пусть screen_width будет переменной, обозначающей ширину пиксельной сетки.Пусть button_width будет переменной, обозначающей ширину кнопки.

Если порядок идеально отцентрирован, если screen_width нечетно, то button_width также должно быть нечетным.Кроме того, если screen_width четное, то button_width четное.Первоначально у нас был только 1 пиксель минимум для кнопки.Однако это можно расширить до минимума 2 пикселей, если сетка пикселей имеет четное число пикселей в ширину.

Ниже приведены результаты для некоторых примеров размеров холста (screen_width):

+--------+---------+
| Canvas | Central |
| width  | Button  |
|        | width   |
+--------+---------+
| 1      | 1       |
| 2      | 2       |
| 3      | 1       |
| 4      | 2       |
| 5      | 3       |
+--------+---------+

Пусть n = max {целое число k такое, что k меньше или равно 60% ширины экрана, а k is имеет ту же четность (четную или нечетную), что и ширина экрана.

Пусть m будет такой переменной, что m = 1, если (ширина экрана нечетная), и (m = 2), если ширина экрана четная.

Пусть button_width будет min {n, m} Тогда button_width обладает всеми необходимыми свойствами.

Программирование

Теперь мы наконец-то напишем некоторый код:

int CALC_BUTTON_WIDTH(int screen_width, float fraction) {        
    int bw_lrg = CALC_BUTTON_WIDTH_FOR_LRG_CANVAS(screen_width, fraction);
    int bw_sml = CALC_BUTTON_WIDTH_FOR_SML_CANVAS(screen_width, fraction);
    button width = min(bw_sml, bw_lrg);
    return button_width;
}

int CALC_BUTTON_WIDTH_FOR_SML_CANVAS(int screen_width, float fraction) {

    // sw_pairity --- parity of screen width
    // sw_pairity is 0 if screen width is even
    // sw_pairity is 1 if screen width is odd
    sw_pairity     = screen width % 2;


    // sw_pairity_inv --- inverse of parity of screen width 
    // sw_pairity_inv is 1 if screen width is even
    // sw_pairity_inv is 0 if screen width is odd
    sw_pairity_inv = 1 – sw_pairity;      


    // bw_sml is the button with minimum. 
    // Either 1 or 2 pixels
    // if screen is even number of pixels wide, bw_sml is 1
    // if screen is odd number of pixels wide, bw_sml is 0
    // Example: screen 3 --> button 1
    // Example: screen 4 --> button 2
    //
    // --X-    button not centered!
    // -XX-    okay
    //
    // --X--   okay
    // -XX--   button not centered!

    bw_sml = 1 + sw_pairity_inv;
    return bw_sml;

}

int CALC_BUTTON_WIDTH_FOR_LRG_CANVAS(int screen_width, float fraction) {

    int sw_pairity;
    int bw_lrg;

    sw_pairity  = screen width % 2;
    bw_lrg = floor(fraction * screen_width);
    bw_lrg_parity = bw_lrg % 2;
    correction = (sw_pairity + bw_lrg_parity) % 2;
    bw_lrg = bw_lrg + correction;

    return bw_lrg;
}
...