Отправляет email-рассылки с помощью сервиса Sendsay

[prg] Больной вопрос: координаты

Vande omentaina, illi!
Мой вопрос к разработчикам GUI-программ (Windows Forms, нативные
приложения на WinAPI, Android).
Народ, как вы справляетесь с подсчётом координат таким образом, чтобы
объекты хотя бы не налезали друг на друга? Есть, конечно, няшные
фреймворки типа WXWidgets, где это решается на уровне самого
фреймворка. Но так можно сделать не везде. Как вы решаете это для
себя?
Спасибо!

Ответить   Mon, 21 Mar 2016 01:16:23 +0200 (#3384353)

 

Ответы:

Здравствуйте!

Я не знаю, на сколько работа в c++ в visual studio отличается от вашей,
но я добавляю например, диалог, в него накидываю нужные элементы:
кнопки, списки и т.д., а затем открываю код файла, в котором
прописываются внешние атрибуты окна: размеры кнопок, их подписи и так
дальше и затем начиная с левого верхнего угла обычной арифметикой
подсчитываю где будет поле редактирования, где будет кнопка для поиска и
многое другое.
четыре значения координат, которые я меняю отвечают соответственно:
отступ от левого края окна до левой границы элемента,
отступ от верхнего края окна до верхней границы элемента,
горизонтальная длина элемента,
вертикальная высота элемента.
Началом отсчета является нулевая точка в левом верхнем углу экрана.
Отступ между элементами не привышает 10 пикселов.
да, забыл сказать, что хорошо бы, чтобы элементы сходных окон имели
одинаковые размеры - тем самым выдерживая некий стиль.
Еще придерживаюсь симетричности, хотя, думаю, что это не обязательно, но
как правило смотрится лучше.
Показывал свои окна зрячему профессиональному дизайнеру - серьезных
нареканий не было - лишь небольшие пожелания:
сделай кнопки помельче, а список по крупнее и все в этом роде.
Но к сожалению, в своих проектах изменения настолько частые, что внешним
видом удается заняться очень редко.
Когда же элементы просто накидываешь в окно, они падают практически в
одно и то же место и даже зрячий не может с первого раза обнаружить
нужный элемент - они закрывают друг друга, поэтому сначала я распределяю
все в голове, потом задаю размеры объектов относительно левого верхнего
угла и только потом показываю свою картину зрячему помошнику.
Скажу свое наблюдение:
если делать расчеты окна с большим разрешением значительно большим чем
800 на 600, то нужно быть готовыми к тому, что на маленьком экране
какие-то элементы вылезут за край экрана.

С уважением
Грызунов Александр

Ответить   Mon, 21 Mar 2016 13:15:22 +0400 (#3384421)

 

Здравствуйте Александр. Описанный вами способ общий для всех инструментов
разработки гуи, и умение пользоваться координатами в одной среде
автоматически говорит об умении писать интерфейс вцелом. Всвязи с этим у
меня к вам вопрос:

<< я добавляю например, диалог, в него накидываю нужные элементы:
<< кнопки, списки и т.д., а затем открываю код файла, в котором
<< прописываются внешние атрибуты окна: размеры кнопок, их подписи и так
<< дальше и затем начиная с левого верхнего угла обычной арифметикой
<< подсчитываю где будет поле редактирования, где будет кнопка для поиска и
<< многое другое.

Приведите , пожалуйста пример, ну допустим у нас в окне должно быть 2 кнопки
и допустим группа радиокнопок, как бы вы их разместили? И как вы
рассчитываете размер кнопки, чтобы в нее влез запланированный текст? И какой
раздел математики вы бы посоветовали освежить в памяти, чтобы научится
размещать элементы?

Ответить   Mon, 21 Mar 2016 21:50:35 +0300 (#3384607)

 

Приветствую.

Какой раздел математики????
Элементарную арифметику по-моему, нет?
У вас конечно могут быть, какие-то оч. специфичные задачи, о которых я не
могу судить, но вообще использование абсолютного позиционирования это есть
зло, Под что бы вы не писали.
Мало того, что без подгляда это сделать нормально сложно так еще очень
ненадежно, В том смысле, что изменится экран и все приобретёт совершенно
иной вид.
поправьте меня кто-нибудь если это не так.
В прошлом письме я приводил пример про WPF, но это с некоторой долей
схожести актуально и для других современных платформ.

С уважением, Константин.
В прошлом письме я приводил пример про WPF, но это с некоторой долей
схожести актуально и для других современных платформ.

С уважением, Константин.

Ответить   Tue, 22 Mar 2016 01:00:55 +0500 (#3384626)

 

<< Какой раздел математики????
<< Элементарную арифметику по-моему, нет?

Ну арифметику вроде знал когда-то, только я не понимаю все-таки чем она
может помочь)) а при изменении свойств экрана я всегда все элементы
переписываю (переназначаю размеры) К компановщикам у мення, к сожалению,
тоже претензии есть. На wpf не писал ничего, но вот java библиотека swing...
вообщем, не все так безоблачно. И хотелось бы именно научится вручную
просчитывать, если это все-таки действительно возможно и хватит арифметике,
пусть сложнее, но ты хоть уверен, что что ты написал, так и будет работать.
А вот в компановщиках что-нибудь недопонял, и интерфейс не такой, как
хотелось бы а проверить - никак.

Ответить   Mon, 21 Mar 2016 23:58:37 +0300 (#3384639)

 

Всех приветствую. А я вот воще не парюсь по поводу этого. Обычно или мне
помогают с координатами в студии в c# зрячие или слабовидящие друзья и
знакомые,или я на них воще забиваю. Блага в студии есть такие полезные
свойства у объектов как
accessiblename,accessiblerol,accessibledescription и другими
свойства,обеспечивающие доступность winforms объектов,поэтому я даже
использую их,не подписывая объекты текстом. Блага в windows не
важно,какие координаты у моих объектов. А вот с android всё очень
хреново. Просто я вставляю через xml view объекты так,как они написаны в
интернет источниках,или так,как они уже написаны в моих заготовках.
из-за этого токбек не реагирует на моё двойное нажатие,иногда даже не
видит biew элемент [обычно это бывает со списком listview],не позволяет
прокручивать списки и даже вводить в редакторы данные. Также иногда
бывает,что когда,например,фокус стоит на кнопке и я 2 раза нажимаю на
неё,нажатие происходит на другой элемент. Хотелось бы узнать,почему так
происходит с андроидам и проявляется ли это проблема на клавиатурных
смартах таких как льсмарт и обычных клавиатурных смартах? Просто я начал
писать карточную игру,а проблема с координатами приостановила мою
работу,а зрячих друзей и знакомых,программирующих под андроид,у меня
почти нет. Конечно,можно было попросить просто зрячих,но мой опыт
показывает,что они не очень хотят разбираться в новой программе,тем
более графический редактор eclipse плоховато озвучивается,поэтому я не
могу зрячим или слабовидящим людям подсказать,как с ним работать. Я не
ставлю цель пока что размещать приложения в плеймаркете,потому,что как я
понял у них очень высокие требования к интерфейсу и требуется наличие
картинок в моём приложении,раз даже написано целое
руководство,рассказывающее о том,как угодить тем людям,которые
пропускают моё приложение в плеймаркет. Моя цель - дать возможность
людям нашей категории нормально пользоваться приложением,даже не смотря
на то,что зрячие,смотря на интерфейс,будут очень мягко говоря
ужасаться,поэтому хотелось бы узнать,какие координаты должны быть у view
элементов,чтобы можно было нормально пользоваться приложением со
скринридерами. В моём приложении используется разметка RelativeLayout.
Кстати хотелось бы ещё спросить,каким образом задаётся расположение
элементов,т.е как сделать так,чтобы при свайпании с помощью токбек можно
было сначало попадать на кнопку,потом на редактор и т.д. в студии,по
крайней мере в winforms элементах в c за это отвечает свойства index.
Заранее благодарю всех за помощь.

Ответить   Mon, 21 Mar 2016 23:19:13 +0300 (#3384633)

 

Vande omentaina, Саша Козловский!

И вы пользуетесь, скорее всего, NVDA. Во всяком случае, это плохая
практика, так как зрячий человек вообще не увидит ничего на вашем
экране. Сорри, мне такое не подходит по определению, ибо если уж и
писать, то для всех, а не "для слепых".

Ответить   Tue, 22 Mar 2016 00:31:55 +0200 (#3384650)

 

Приветствую.

Незнаю как в win forms, но в WPF для этого используются различные контейнеры
компоновки.
Допустим,Grid, основной из них, позволяет разметить окно как виртуальную
таблицу и привязать свои элементы к её ячейкам. Таблица виртуальная, т.е. в
окне не видно, что это таблица, если явно не задать отображение рамок.
Или например контейнер попроще StackPanel.
Он позволяет расположить все элементы в ряд по горизонтали, либо по
вертикали.
В итоге вкладывая друг в друга различные контейнеры можно добиться любого
приемлемого вида.
И не нужно при этом заниматься вычислением координат.
И не сместиться при этом весь интерфейс на более высоком или низком
разрешении.
Не могу сказать существуют ли подобные фичи для win forms.
Но, IMHO, врядли для создания приложений с GUI под виндой стоит использовать
формочки.

С уважением, Константин.

Ответить   Mon, 21 Mar 2016 15:17:17 +0500 (#3384442)

 

Vande omentaina, galiahmet***@r*****.ru!

использовать

Так это... у WPF достаточно серьёзные проблемы с accessibility, разве
нет?

Ответить   Tue, 22 Mar 2016 00:26:31 +0200 (#3384648)

 

Приветствую.

Я не очень много работал с WPF и с проблемами доступности особенно не
сталкнулся.
Был один затык, который немножко попортил мне нервы, а именно, в списочных
элементах типа TreeView или ListView jaws нормально не читал отображение
пользовательских классов и я полагал из-за этого, что просто мне не удается
настроить правильное их отображение, а после оказалось, что выглядило все
нормально и это только проблемы jaws.
Но и с jaws удалось вс решить просто переопределив ToString отображаемых
объектов.
Полагаю, что если разработчик заинтересован в том, чтобы продукт нормально
взаимодействовал со скринридерами, ему удастся достич этого путем не самых
сложных манипуляций.
Я не создавал там особо сложных интерфейсов, но все, что я использовал, jaws
озвучивал, вроде ,нормально, за исключением выше описанной проблемы.

С уважением, Константин.

Ответить   Tue, 22 Mar 2016 12:22:53 +0500 (#3384760)

 

Vande omentaina, Константин!

jaws

А можете дать примерчик кода приложения, которое бы озвучивалось JAWS?
Я правильно понимаю, что каждому элементу надо прописывать UI
Automation-свойства?
Потому что вот на такой просмотр списка, например, даже не попадает
фокус:
<Label x:Name="myLabel" Content="_Some list:"
HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,15,0,0"/>
<ListView x:Name="myList" HorizontalAlignment="Left" Height="100"
VerticalAlignment="Top" Width="300" Margin="0,38,0,0">
<ListView.View>
<GridView>
<GridViewColumn Header="Name" Width="150"/>
<GridViewColumn Header="Last Modified" Width="150"/>
</GridView>
</ListView.View>
</ListView>

Спасибо!

Ответить   Tue, 22 Mar 2016 22:00:06 +0200 (#3385049)

 

Приветствую.

Ну собственно тут все нормально.
Нужно просто привязаться к к какой-нибудь коллекции и наполнить список,
тогда фокус будет на него попадать.
Другое дело, что как я уже говорил jaws не будет нормально читать строки,
можно переопределить метод ToString() пользовательского класса который нужно
отображать, но при этом все-равно не будут читаться столбцы и заголовки так,
что получиться обычный список.
Это конечно костыльь костыль и наверное посредством Automation Property это
должно делаться как-то более адекватно, но вот я сейчас попытался и у меня
признаться не получилось.

С уважением, Константин.

Ответить   Wed, 23 Mar 2016 15:52:00 +0500 (#3385204)